카테고리 없음

[플레이데이터 SK 네트웍스 Family AI 캠프 17기] 2주차 회고

오리파 2025. 7. 7. 02:15

안녕하세요 :)
1주차 회고록을 작성한 게 엊그제 같은데
이런 저런 내용들을 배웠더니 2주차가 훌쩍 지나갔습니다..
 

 
확실히 1주차에 비해 가볍고 빠르게 지나가서 
목록을 쓰면서도 이걸 다 배웠다는 게 믿기지 않았어요.
 
 
 
2주차에 배운 것들의 간략한 목록

PYTHON 클래스, 모듈, 패키지, 파일 입출력, 예외처리,
streamlit, 데이터베이스 개요

 
 
 
그럼 본격적으로 2주차 회고를 시작해보겠습니다 :)
 

1. 이번 주에 배운 내용(인상적인것)

(1) Python

- 클래스 구성요소

더보기

클래스 = 속성 + 메서드

1. 속성의 두 가지 종류

  1) 클래스 속성

       - 클래스 자체에 포함된 속성. 모든 인스턴스공유

  2) 인스턴스 속성 

       - 각 인스턴스마다 가지고 있는 고유한 속성. 

       - 생성자( __init__ ) 안에서 선언.

2. 메서드 특징

 - 모든 메서드는 파라미터로 self를 받는다.

    ex. class Student:

                def study(self):

                      print("공부를 열심히 합니다.")

-네임 스페이스

더보기

* global vs nonlocal

- global : 함수 바깥에 있는 변수에 접근할 때 씀.

- nonlocal : 중첩함수에서 바깥 함수에 있는 변수에 접근할 때 씀.

 

ex. 

 

name='다람쥐'                                                                  def change_name():

def change_name():                                                              new_name='미피'

      global name                                                                   def change_new_name():

      name = '미피'                                                                          nonlocal  new_name

print(name)         # 미피 로 출력됨.                                              new_name= ' 보리스'

                                                                                              print(new_name)               # 미피

                                                                                              change_new_name()

                                                                                              print(new_name)               # 보리스

- 오버라이딩

더보기

* 오버라이딩 하는 3가지 방법

1. 직접 할당2. 부모 클래스. __ init__(self, ...)3. super().__init__(... )
ex.
self.name = name

self.phone = phone
ex.
(부모 클래스가 Person 이라는 가정)
Person.__init__(self,name,phone)
ex.
super().__init__(name, phone)
상속의 의미가 없어서
잘 쓰지 X
부모 클래스가 몇 개든 다 쓸 수 O부모 클래스 여러 개면 쓸 수 X

 

- 모듈과 패키지

더보기

1. 모듈 vs 파일

    - 모듈 : 파일

    - 패키지 : 폴더 

2. import 구문의 세 가지 형태

    1) import  (모듈명)  

        - 모듈명에 포함된 함수나 변수를 쓸 때, 모듈명. 함수() or 모듈명.변수 라고 꼭 써야함.

        ex.  import random

               number1=random.randint(5,100)     

 

    2) import  (모듈명)  as  (별칭) 

        - 모듈명이 너무 길어질 경우 별칭을 지어서 별칭.함수() or 별칭.변수 로 씀.

        ex. import random as rd

              number2=rd.randint(5,10)

 

    3) from  (모듈명)  import  (함수, 변수 등)

        - 해당 모듈에서 일부의 함수나 변수만 가져올 수 있다. 

        - 모듈명. << 안써도됨

        ex. from random import randint

              number3=randint(3,10)

- 파일 입출력 읽을 때 주의할 점

더보기

1. 파일을 열었으면 꼭 닫아줘야함!

    ex.

          file1 = open('new.txt','r')

          file1.close()

 

2. 한글을 읽을 때, 꼭 encoding = 'utf-8' 붙여줘야함.

    ex. 

          file2 = open('Korean.txt', 'r', encoding='utf-8')

3. 읽는 세 가지 방법

    (1) read() : 전체를 다 반환

    (2) readline() : 맨 첫 줄을 반환

    (3) readlines() : 개행을 기준으로 분리해 리스트로 반환. 개행 문자까지 반환.

 

 

- try - except을 이용한 예외 처리

더보기

- 구문 사용 순서 : try - except ( - else - finally )

  ex. 

     -> try 와 except 는 무조건 있어야함. else와 finally 는 없어도 됨.

 

- 만약 while 안에서 try-except 구문 속 break나 continue 분기문이 있다면,

   break나 continue 전에 finally 무조건 실행

    -> break 전에 finally 구문 시행됨.

(2) SQL & 데이터베이스

- DDL

더보기

- SQL = DDL + DML 로 구성

- DDL = Data Definition Language : 데이터베이스 스키마 정의 or 수정하는데 사용하는 SQL

- CRUD 가 대표적 ( Create Read Update Delete )

    * Create : 테이블 생성 및 수정

         (1) truncate vs delete 

             - truncate : 모든 데이터 한꺼번에 초기화

             - delete : 모든 row를 하나씩 제거

- char vs varchar 

   - char : 고정 문자형. 보통 상태를 나타내는 문자열을 저장해야할 때 사용.

       ex. status char(1) CHECK( 'Y','N')

   - varchar : 가변 문자형. 

- 점선과 실선 표기법 & 식별-비식별 관계

더보기

1. 점선 vs 실선

    - 점선 : 연결된 대상이 존재하지 않아도 됨.

    - 실선 : 연결된 대상이 반드시 존재해야함.

 

2. 식별 vs 비식별 관계

     - 식별 관계 : 다른 테이블의 FK를 가져와 PK로 활용하는 경우.

     - 비식별 관계 : 다른 테이블의 FK를 일반속성으로 가져오는 경우.

- 정규화

더보기

- 정규화 목적 : 중복 데이터 제거

 

- 정규화의 (대표적인) 세 가지 종류

   (1) 1차 정규화 : 다가속성과 복합 속성 제거

   (2) 2차 정규화 : PK와 일반속성 사이의 종속성 제거

   (3) 3차 정규화 : 일반 속성끼리의 종속성 제거

 

- 제 3 정규화까지는 보통 다 진행. 그 이후는 할지 말지 신중하게 결정해야함.

- SELECT / ORDER BY / WHERE / GROUP BY / HAVING / LIMIT

더보기

1. SELECT : 조회

     - SELECT * : 모든 컬럼 데이터 조회

     - * 은 실제 업무에서는 지양함. 무엇을 조회하는지 알 수 없어서.

2. ORDER BY : 정렬

     - 기본적으로 ASC (오름차순) , DESC (내림차순)은 컬럼명 뒤에  명시해야함.

     - ORDER BY col1 IS NULL : NULL 값이 가장 마지막에 나옴. NULL 아닌 값들 정렬 X

     - ORDER BY col1 IS NULL DESC : NULL 값 가장 처음에.

3. WHERE : 조건절

     - 같다 : = 로 표현. ( 파이썬에서는 == )

                 ex.  WHERE col1 = '주스'

     - LIKE : 비슷한 데이터 조회. %와 같이 사용. 

                 - %김치 , 김치% , %김치% 이런 식으로 씀.

                 ex. WHERE col1 LIKE %김치%     -> 김치를 포함한 값 조회

4. LIMIT : 상위 ~개를 가져옴.

     - ORDER BY 뒤에 씀. 

     - LIMIT (2,5) : 상위 2개 제외하고 5개를 가져온다.

5. GROUP BY : 그룹으로 묶어서 데이터 조회

     - HAVING : GROUP BY 의 조건절

6. ROLL UP : 총계 및 합계를 함께 출력.

 
 

2. 일주일동안 고민한 내용

(1) 다중 상속을 받는 경우 

클래스랑 모듈에 대해서 배울 때,
"상속을 여러 부모로부터 받는 경우, super().__init__을 사용할 수 있을까?"
의문이 들어 시도해봤습니다.
 

                                                    B1= Candidate('자바',5)     << 괄호 안에 있는 '자바'와 5가 
                                                    super.__init__(field)            << field에는 '자바'가,
                                                    super.__init__(experience)       <<experience에 5가 각각 들어가서

 


'자바'는 Mentor class 생성자의 field에,
5는 Lecturer class 생성자의 experience에 들어갈 것을 기대했습니다.
 
그러나 실제로는 Mentor class 에 모두 들어가는 걸 확인했습니다.
 
부모 클래스가 둘 이상일 경우,
맨 왼쪽 클래스부터 인스턴스 속성을 설정할 수 있는지 확인하는데
Mentor class의 __init__에서  self 말고 field를 추가적으로 받으므로
field가 '자바'였다가 5가 되었다는 걸 알게 되었습니다.
 
따라서 부모 클래스가 두 개이상이면
인스턴스 속성을 설정할 때 super.__init__ 대신
부모 클래스의 이름을 직접적으로 적어줘야 한다는 걸 깨달았습니다. 

class Candidate(Mentor, Lecturer):
	def __init__(self,field,experience):
    		Mentor.__init__(self,field)
        	Lecturer.__init__(self,experience)

 
 
 
 

(2) streamlit을 이용한 사이트 만들기

사실 이번 일주일 내내 매달렸던 것은 streamlit 이었습니다.
 
사이트를 만드는 과제를 완벽하게 해내고 싶다는 생각에
조금 욕심을 부려보았습니다 ㅎㅎ
 
 
LCK 정보를 알려주는 사이트를 만들어보고자 했습니다.
메인 페이지에서 버튼 두 개를 만들어 다른 페이지로 넘어가도록 했습니다.

메인 페이지

LCK 선수 정보와 경기 일정을 알려주는 페이지를 따로 만들어
메인 페이지에서 버튼을 누르면 이동할 수 있도록 만들었습니다.
 

메인 페이지 py 파일 코드

 
column을 3개로 나누어 가장 왼쪽과 오른쪽에 버튼 2개를 만들어주었고,
subheader의 경우, divider 기능을 이용해 rainbow 색깔을 지정해주었습니다.
 

선수 정보 찾기 버튼을 누르면 나오는 화면

 
선수 정보는 총 3가지로 찾을 수 있도록 하였습니다.
 
 
1) 선수 이름으로 찾아보기 
선수 이름을 제대로 입력하면 
해당 선수 닉네임, 본명, 소속팀, 포지션, KDA가 출력되게 하였습니다.

 
만약 선수 이름을 제대로 입력하지 않으면
정보가 없음을 출력했습니다.

 
2)팀 이름으로 찾아보기

선택한 팀의 정보를 표로 모두 보여준 후,
그 밑에 선수별 KDA 를 linechart를 출력해
어떤 선수의 KDA가 제일 높은지 확인할 수 있게 했습니다.
 
표에서도 가장 높은 KDA 수를 한눈에 볼 수 있도록
가장 높은 KDA를 색칠해주었습니다.
( highlight_max 이용)
 






 
각 팀별 색깔로 색칠해주었습니다.
 
 
3)포지션으로 찾아보기

포지션은 slider를 이용해 드래그하여 원하는 정보를 찾아볼 수 있도록 하였습니다.
 
선택한 포지션에 있는 서로 다른 팀 소속 선수들 정보를 표로 보여주고,
KDA 를 이용해 barchart를 그렸습니다.
 
포지션에서는 가장 낮은 KDA 선수에 하이라이트 표시를 해주었습니다.
(hightlight_min 이용)
 
linechart와 barchart를 그릴 때 가장 힘들었던 점은,
chart를 그릴 때 선수명이 자동으로 정렬된다는 것이었습니다.

표와 차트의 선수명 순서가 다름.

저는 표에 나온 순서대로 chart를 그리고 싶었는데,
어떤 이유에서인지 line chart와 barchart로 정보를 넘기기만 하면
오름차순으로 ㄱ~ㅎ 순으로 정렬이 되었습니다....
 
그래서 barchart에 들어가는 선수명을 index로 지정해보기도 하고
리스트를 따로 만들어 굳이 index로 지정해보기도 하고

찾아본 사이트....ㅠ

여러가지를 시도해보았으나 해결되지 않았습니다.
 
그래서 애초에 표로 출력되는 데이터들에서 
선수들명을 오름차순으로 출력해야겠다는 결론을 내렸고
ㄱ~ㅎ 순으로 선수명을 정렬해 출력해 일관성을 얻어보려 했습니다.

 

 
 

경기 일정 확인 버튼을 누르면 볼 수 있는 화면

 
전체 일정 버튼을 누르면 날짜와 시작 시간을 순서대로
모든 경기를 다 볼 수 있도록 했고,
selectbox를 이용해 날짜를 선택하면 해당 날짜의 경기를 볼 수 있도록 하였습니다.

 
가장 많이 신경썼던 부분 중 하나가 바로 팀별 경기 보기 였습니다.
selectbox에서 팀을 선택하면 경기 정보가 나올 수 있도록 하고 싶었는데,
상대팀 정보를 어떤 로직으로 어떻게 출력하게 하면 좋을지 고민했습니다.
 

game_schedule={ 
    '날짜': ['7/23','7/23','7/24','7/24','7/25','7/25','7/26','7/26','7/27','7/27'],
    '시작 시간' : ['17시','19시','17시','19시','17시','19시','15시','17시','15시','17시'],
    '경기' : [['Dplus KIA','OK 저축은행'],['젠지','HLE'],['DN프릭스','BNK 피어엑스'],['KT 롤스터','농심 레드포스'],['T1','젠지'],['OK 저축은행','DRX'],['DPlus KIA','BNK 피어엑스'],['HLE','KT 롤스터'],['DN 프릭스','DRX'],['T1','농심 레드포스']],

}

 
일단 날짜와 시간 당 경기에 참여하는 두 팀을 리스트에 같이 묶었습니다.
 

가독성을 위해 리스트를 3개 따로 만들어 저장했으나 그냥 리스트 하나만 만들어 저장해도 됩니다.

 

경기팀 2개를 하나의 리스트에 담아 놓은 것에서
인덱스를 이용해 선택한 팀과 비교한 후 
같지 않은 것을 상대팀 리스트에 저장했습니다.
 
 
또 신경을 많이 썼던 부분이 바로 버튼 정보 유지하기 였습니다.
 
버튼을 누를 때마다 정보가 계속 바뀌거나 혹은
바뀌어야하는 정보가 바뀌지 않는 경우가 있어서
이를 session_state를 이용해 해결했습니다.
 

 

button1을 한 번 누르고 나면 True 상태에서 False로 바뀌지를 않아서
이를 해결하기 위해 session_state 이용.
button1이 선택되면 다른 버튼 정보 False가 되도록 했음.

 

 

 

 

 

 

(3) 포켓몬 게임 만들기

class 와 모듈& 패키지를 배우면서
자동차 만들기 or 포켓몬 게임 만들기
해보면 좋을 것 같다고 생각했습니다.
 
포켓몬은 물, 불, 풀, 전기 타입이 있으므로,
normal type인 Pokemon 클래스를 만들고
이를 상속하는 물, 불, 풀, 전기 포켓몬 클래스를 만들었습니다.
 
streamlit에서 시간을 많이 뺏기는 바람에,, 
아직 메인 게임 로직을 완성하지 못해서
다음주에 틈틈이 완성할 생각입니다.
 
 

3. 좋았던점 & 아쉬웠던 점

< 좋았던 점 >
1) streamlit에 시간 투자를 많이 했던 것만큼, 많은 것을 알게 되었습니다. highlight기능, divider 기능, hide_index 기능, sort 기능, 특정 조건의 데이터만 출력하는 기능 등 다양한 것을 시도해보고 습득할 수 있어서 뿌듯합니다.
2) 저번 주차에 만들었던 야구 게임과 야구 게임 확장판 코드를 공유하고 피드백을 받아봤습니다. 입력한 숫자가 보이면 좋겠다고 해서 이 부분을 수정했습니다. 오류가 더이상 나오지 않아 '야구 게임 만들기'를 제대로 매듭지은 것 같아 뿌듯했습니다.
 
< 아쉬웠던 점 >
1) streamlit에서 시간을 많이 빼앗겨서 포켓몬 게임을 미완성인 상태로 2주차를 마무리하게 되었습니다. 2주차에 class와 모듈, 패키지를 복습한다는 생각으로 포켓몬 게임을 완성해 3주차 회고록에 꼭 써봐야겠습니다.
2) 데이터베이스 개요 부분이 순식간에 지나가다보니 꼼꼼하게 아직 복습하지 못했습니다. 특히, DDL 부분이 아직 어색해서 이 부분을 3주차에 시간을 내어 꼭 복습해야될 것 같습니다.
 
 

 
2주차에 많은 것을 배우고 익혔지만
여전히 많은 것을 해야될 것 같다는 생각을 했습니다..
3주차에 또 어떤 새로운 것들을 배우게 될지 기대가 됩니다.
 
그럼 3주차도 화이팅! 🥹💕