SKN_13th

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

8000gam 2025. 3. 30. 13:51

흘러가던 평범한 일상에 새로운 바람이 불기 시작했다. 몇 주 전 지원했던 SK네트웍스 Family AI캠프의 13기에 합격하여 본격적인 과정의 1주 차가 시작된 것이다. 비전공자인 나는 홀로 데이터 분석 및 인공지능 관련 기술을 무작정 공부하고 있었는데, 이런 나에게 이번 캠프는 쌓아두기만 했던 AI 관련 기술들을 재정립하면서 새로운 것들을 몸에 익히는 좋은 기회가 될 것이다. 특히 LLM개발 관련 지식은 전무하기 때문에 이런 것들을 처음부터 제대로 배워나가는 것은 큰 도움이 될 것이다.

💻 What?

3월 24일 월요일부터 본격적인 캠프가 시작됐다. 6개월 간 휴일을 제외하고 매일 오프라인 9 to 6 일정을 소화한다. 전반기 작계 훈련으로 인해 나는 5일 중 4일을 참여했고, PythonGit 작업 환경 세팅부터 자료형, 제어문, 함수, 그리고 객체 지향 프로그래밍(클래스 관련)을 학습했다. 강사님께서 .ipynb 형식의 강의안을 GitHub에 push해주시면 나는 그것을 pull받은 뒤, 새로운 .ipynb 파일에 필기할 때 참고용으로 사용하고 있다. 강의안은 이론실습 코드예제로 구성되어 있으며, 하루 일과 중에 예제를 풀어 볼 시간 1시간을 보장해 주신다.

😮 So What?

1. Python과 친한 줄 알았다.

데이터 분석과 머신 러닝, 딥러닝 등을 공부할 때 Numpy, Pandas, Scikit Learn, Tensor Flow 등 다양한 관련 패키지들을 Python을 통해 다뤄왔기 때문에, 내가 아무리 비전공자라고 해도 Python이라는 언어를 잘 알고 있는 줄 알았다. 실제로 일주일 간 배운 내용 중 대부분은 이미 알고 있던 내용이기도 했다. 그러나 강의를 통해 생전 처음 들어보는 내용이 몇 가지 있었다.

  1. 왈러스 연산자(Walrus Operator)

대입 연산자 중 하나이며, 표기법은 :=이다. 특정 값을 변수에 할당하고 이를 즉시 사용할 수 있게 해준다고 한다. 예를 들어 -10 이상 10 미만의 정수를 끊임없이 생성하며 양수는 양수끼리, 음수는 음수끼리 저장하고, 0이 생성되는 즉시 종료되는 프로그램을 작성한다고 하자. 다음과 같이 코드를 작성할 수 있을 것이다.

import random

positive_numbers = []
negative_numbers = []

while True:        # 선언부
    # 구현부
    num = random.randint(-10, 10)
    if num > 0:
        positive_numbers.append(num)
    elif num < 0:
        negative_numbers.append(num)
    else:
        break
print("Finished")

 

해당 코드는 변수 num에 임의의 정수를 대입하는 코드를 반복문 구현부에 별도로 작성했으나, 아래처럼 왈러스 연산자를 사용하면 선언부에서 num에 정수를 할당해 줄 수 있다. 이는 코드를 간결하게 다듬어 주는 효과를 가진다.

# walrus operator
import random

positive_numbers = []
negative_numbers = []

while num := random.randint(-10,10):    # while num != 0. 조건 자체는 while True와 동일하다
    if num > 0:
        positive_numbers.append(num)
    else:
        negative_numbers.append(num)
print("Finished")

 

if문과 while문의 조건절에서 주로 사용되며, 한국에서는 직역하여 바다코끼리 연산자로 알려진 듯하다.

  1. 생성자 메소드 __init__의 실제 작동 원리

이전에도 클래스를 구현할 때마다 습관처럼 def __init__(self, param, ...):를 작성했지만, 이를 통해 속성(attribute)이 생성되는 과정 자체는 어디서도 들어본 적이 없다(독학의 한계일 지도 모르겠다).

우선 StackHeap이라는 메모리 구조에 대해 설명해야 할 것이다. Stack은 함수를 호출할 때만 사용되는 지역 변수들이 저장되는 공간이며, Heap은 클래스로 만든 인스턴스들이 저장되는 공간이다. 아래와 같은 Person 클래스가 있고, 변수 p를 통해 인스턴스를 생성한다고 가정하자.

class Person:
    def __init__(self,name):
        self.name = name

p = Person("Lee")

 

p = Person("Lee") 코드를 실행하면 "Lee"라는 문자열은 Heap에, "Lee"를 참조하는 지역 변수 name과,Heap 내부의 인스턴스 자체를 참조하는 self는 임시로 Stack에 올라간다. 어쨌든 __init__()도 일반 함수처럼 호출되고, nameself는 이 함수의 parameter이기 때문이다.

 

동시에 Person 클래스가 만든 인스턴스 자체는 Heap 생성된다. 이후 Body의 self.name = name가 실행되면서 Heap의 인스턴스 내부에 name 속성이 생기고, 이는 Heap에 저장된 문자열 "Lee"를 참조하게 된다.

 

이제 __init__()은 실행이 끝나고 Stack에서 지역 변수로써의 selfname은 사라지고, 인스턴스의 속성으로써의 nameHeap에 여전히 남는다. 그리고 인스턴스를 참조하는 변수 p는 살아있는 동안 전역 변수 메모리에 저장되고, p.name을 통해 Heap에 있는 "Lee"를 참조할 수 있다.

 

이런 내부 구조 관련 설명은 컴퓨터 과학 관련 지식이 없는 나에게 엄청난 도움이 된다. 강의에서의 기억이 머릿속에 있지만, 말이나 글로 풀어내려 하니 정말 어려웠다. 다시 봐도 100점짜리 글은 아닌 듯하다. 두고두고 복습해야겠다.

  1. 예약어

이 부분은 처음 배운 부분은 아니지만, 알고 있었는데도 범했던 실수에 관한 내용이다. 특정 이터러블 객체에서 최댓값을 찾는 과제를 수행한다고 가정하자.

score = [60, 90, 80, 80, 70, 55, 80, 90, 95, 85]

 

내게 생각나는 방법은 두 가지다. 첫 번째로 모든 원소들을 하나하나 차례대로 선형 검색하는 방법이다. 이번 주는 제어문에서 for ~ in ~ 반복문을 배웠으니 이를 적용해 봤다.

max = 0
for i in score:
    if max < i:
        max = i
print(max)

 

두 번째는 내장 함수인 max()를 사용하는 것이다. 아직 수업에서 내장 함수를 배우지 않았으나 시험 삼아 실행해 봤다.

print(max(score))

 

오류가 발생했다. 먼저 실행했던 반복문에서 변수 이름을 내장 함수 이름과 동일한 max로 지정했기 때문에 발생한 오류였다. max는 이제부터 95라는 score 내 정수 데이터를 참조하는 변수로, 더 이상 내장 함수의 기능을 수행하지 못한다. 예약어 이름을 변수명으로 사용하는 것을 피해야 한다는 것을 다시금 깨닫게 했다.

 

나는 파이썬과 더 많이 친해져야 한다...!

2. 알고리즘 관련 경험이 아직 부족하다.

바로 위의 for ~ in ~반복문은 반쪽짜리 정답이다. 사실 최댓값을 저장하는 변수의 초기값은 0이 되어서는 안 된다. 위 예시의 경우 비교 대상 데이터들이 전부 양수이기 때문에 상관이 없지만, 모든 데이터가 음수라면 이야기는 달라진다. 최댓값을 찾아야 하는데 리스트 안에 존재하지도 않는 0이라는 값을 출력해 줄 것이다. 따라서 초기값을 설정한 부분인 max = 0은 다음과 같이 수정되어야 한다.

# score의 맨 처음에 있는 원소부터 선형 검색. 물론 변수명도 max가 아닌 다른 이름으로 바꿔야 한다.
max = score[0]

 

"전부 양수니까 괜찮겠지~"라는 생각으로 작성한 코드가 아니다. 단순히 생각이 미치지 못한 것이다. 사실 생각해 보면 당연한 이야기인데 말이다. 이는 알고리즘 관련 경험 부족에서 기인한 것이라고 생각된다.

🎈 Now What?

1. 우리 친해져요😅

데이터 사이언스, AI 분야 기술을 배운다면 떼려야 뗄 수 없는 Python, 더 많이 친해져야겠다. 개강 후 일주일밖에 지나지 않았는데 벌써 돌이켜보니 Python과 조금의 거리가 느껴진다... 이번 회고록에 기록했던 것처럼 처음 배우는 부분은 매주마다 예시와 함께 정리해 두는 습관을 들여야겠다. 그리고 TODO 문제를 풀 때 다 풀었다고 바로 손을 뗄 것이 아니라, 한 번은 더 리뷰를 해보는 것이 좋겠다. for ~ in ~문과 같은 실수는 리뷰를 통해 분명히 줄여나갈 수 있을 것이다. 앞으로 나올 복잡한 알고리즘을 요하는 문제들을 위해 꼭 리뷰하는 습관을 들여야겠다.

2. +α

아직은 캠프에서 다루는 내용을 소화하는데 필요한 시간이 충분한 것 같다. 강사님을 통해 배우는 것 이외에도 내가 스스로 할 수 있는 것을 몇 가지 찾아야겠다. 목요일에 스터디 수요조사를 실시했는데, 코딩 테스트 준비AI 관련 Literature Review를 할 수 있으면 재미있을 것 같다. 개인적으로는 빅데이터 분산 처리 시스템인 Spark에도 흥미가 조금 생겼다. 머신 러닝과 같이 활용할 수 있는 프레임워크고, 강의에서 곧 배울 SQL도 응용할 수 있어, 알아두면 좋을 것 같다는 생각이다. 아직 "이런 게 있다" 정도밖에 몰라서, 실효성에 대해서는 조금 더 알아봐야겠다.

여담

목동에서 가산동. 직선거리는 가깝지만, 대중교통을 이용해서 다니려니 빙 돌아가서 1시간이 넘게 걸리고 사람도 붐빈다. 그래서 첫날에는 지각을 면하기 위해 역에서 캠퍼스까지 뛰어들어갔어야 했다. 이후 이런 요인들을 감안해서 20분씩 더 일찍 일어나고자 했고, 나머지 3일 모두 8시 50분이 되기도 전에 도착해서 수업 준비까지 마칠 수 있었다. 나는 아침이 정말 힘든 사람인데, 의지라는 것이 생기니 어떻게든 되는 것 같다. 6개월 동안 캠프 일정도, 예습 복습도, 운동이나 카페 탐방 같은 취미 생활도 놓치지 않고 꾸준히 할 수 있도록 노력해야겠다.