LG U+ Why Not SW CAMP 7기 - 5주차 회고

God menu·2025년 6월 13일

<6/9 18일차>

13일차에 리스트에 대해 배우고 간식박스 프로그램을 만들었었는데 이제 함수도 배웠겠다 오늘은 간식박스 관리 프로그램을 함수 기반으로 만드는 것으로 수업이 진행되었다. 우리가 정의한 함수는 아래와 같다.

  • make_snack_box() : 간식박스 생성하고 추가
  • multiply_snack_box() : 간식박스 몇 세트
  • display_snack_box() : 간식박스 전체 보기
  • preview_snack_box() : 간식박스 미리보기(3개만)
  • remove_snack_box() : 간식 삭제
  • search_snack() : 간식 찾기
  • summarize_snacks() : 간식박스 요약
  • get_valid_text_input() : 문자로 입력 받기
  • get_valid_number_input() : 숫자로 입력 받기
  • run_menu_program() : 서비스의 흐름 - 선택과 반복


내가 원하는 값을 반복적으로 선택해 입력하며 내 마음대로 간식박스를 만들 수 있다.

대부분의 데이터들은 crud를 기준으로 만들어진다.

📝 crud란?  Create, Read, Update, Delete의 앞글자를 딴 것으로 데이터베이스의 기본 4대 요소이다. 

lambda 함수는 간단한 함수를 한 줄로 작성할 수 있는 익명 함수이다. 기본 문법은
( lambda 매개변수 : 표현식 )으로 작성하고 lambda 함수는 간단하고 단순한 로직에만 사용하는 것이 좋다.

오늘 오후에도 팀별 키오스크 프로그램을 작성하는 시간을 가졌다. 우리팀은 저번부터 빠른 속도로 코드를 작성했어서 오늘 크게 건드린 것은 없었다. 디자인적으로 좀 있어보이게 연필모양 아스키아트도 넣어보고 이모지도 넣었다. 확실히 다른 팀들의 결과물을 보면 장바구니나 뒤로가기 등 여러 기능들이 있긴 했지만 우리 팀은 더 많은 기능에 욕심이 없었어서 조금은 아쉬운 마음이 들기도 했다. 그래도 기본적인 기능에 충실하게 임했고 잘 작동되는 것을 보니 뿌듯하기도 했다. 아래는 우리 팀 코드의 최종 결과물이다.

팀 협업으로 코딩을 하다 보니 에러가 난 부분을 내가 놓치면 팀원이 찾아주기도 하고 배운 것들을 하나씩 취합해나가니 코드가 더 깔끔해졌다. 조금 아쉬운 부분이라면 디스코드나 노션으로 코드를 공유했었는데 들여쓰기가 달라져서 고쳐야 하는 문제점이 있었고 우리의 코드를 다른 사람들도 읽을 수 있게 디테일한 주석을 달아야 하는 필요성을 느꼈다. 가독성과 디자인적인 요소를 고려해서 UI를 더 신경 쓰면 좋을 것 같고 매일 조금씩 팀 빌딩 시간이 여러 번 진행되다보니 협업이 조금 순조로워짐을 느낄 수 있었다.


<6/10 19일차>

  • *args와 **kwargs는 함수에서 가변적인 개수의 인자(argument)를 받을 때 사용하는 파이썬 문법이다. *args는 여러 개의 위치 인자를 tuple로 받고, **kwargs는 여러 개의 키워드 기반 인자(key=value)를 dictionary로 받는다.

  • return문은 함수 실행 결과를 호출한 위치로 되돌려주는 역할을 한다. 매개변수와 return을 함께 사용하면 입력->처리->출력의 구조를 함수로 명확하게 표현할 수 있다.

  • map()함수는 시퀀스의 각 요소에 동일한 함수를 적용하여 새로운 이터레이터를 생성하며 첫 번재 인자로 함수를, 두 번째 인자로 iterable 객체를 받는다.

  • filter()함수는 시퀀스의 각 요소에 대해 조건을 검사하고, 조건에 맞는 요소만 선택하여 새로운 이터레이터를 생성한다.

오전에는 이제껏 배운 함수에 대하여 연습문제를 풀어보았다. lambda 함수로 한 줄로 줄이는 코드가 이해가 안갔었는데

우리의 친구 챗GPT가 쉽게 설명해줘서 이해할 수 있었다. (내 친구 GPT...)

이후 예외처리에 대한 내용도 배우며 간단한 실습 코드도 작성해 보았다. try 구문 안에 예외가 생기면 except에서 받아준다. 여기서는 age가 문자일 경우의 에러는 정의하지 않아서 그냥 ValueError라고 떴다.

오후에는 모듈(module)과 패키지(package)에 대해 배웠다.

  • 모듈(Module)은 파이썬 코드가 담긴 하나의 .py 파일이다.
  • 패키지(Package)는 여러 개의 모듈(.py)을 묶은 폴더이다.
모듈에 대한 개념을 확립하기 위해 실습을 강사님과 함께 진행하였다. 이후 팀 프로젝트로 진행했던 키오스크 프로그램을 모듈로 나누고 메인 파일로 실행하라고 하셨는데 수업 끝에 하다가 막혀서.. 아마 내일 오자마자 마저 해야할 것 같다.

모듈과 패키지와 파일에 대한 개념을 처음에 글로 읽다 보니 조금 헷갈렸었는데 아래사진을 예시로 my_first_package라는 동네가 있고 second.py라는 집이 있고 집 안에 여러 함수들을 정의해놓으며 이 함수들을 가져다 쓰는 것으로 이해하기로 하였다.


<6/11 20일차>

어제 수업 끝 무렵에 팀 프로젝트로 진행했던 키오스크 프로그램을 모듈로 나누고 메인 파일로 실행하라고 하셨는데 하다가 막혀서 오늘 오자마자 마저 고치다가 결국 완성했다 !! 🤣 에러를 천천히 읽고 해당 파일로 찾아가 해당 라인 코드 함수 정의에서 매개변수로 받도록 괄호() 안에 order_list나 total, points 등을 적어줬다. 정말 몰랐던 부분은 챗GPT한테 물어봤는데 points={} 라는 딕셔너리를 서브파일이 아닌 메인 파일에 넣어줘야 했다.. 노트북에서 메인 파일을 실행하니 아래처럼 정상적으로 돌아가니 어제 받던 스트레스가 드디어 날아갔다 😎😎

모듈화의 기본 원칙 4가지

  • 단일 책임 원칙(Single Responsibility Principle, SRP) : 하나의 모듈은 하나의 일만 하게 하자
  • 느슨한 결합(Loose Coupling) : 모듈들이 서로 너무 의존하지 않게 만들자
  • 높은 응집도(High Cohesion) : 모듈 안에서는 관련된 일들만 함께 모여 있게 하자
  • 재사용성(Reusability) : 한 번 만든 모듈을 다른 데서도 쓸 수 있게 만들자

오늘 드디어 클래스(Class)에 대하여 배운다.

클래스(class)란 똑같은 무언가를 계속 만들어 낼 수 있는 설계 도면, 객체(object) 클래스로 만든 제품이라고 이해할 수 있다. 클래스 안에 구현된 함수는 메서드(method)라고 부른다. 파이썬 메서드의 첫 번째 매개변수 이름은 관례적으로 self를 사용한다. 파이썬 메서드명으로 __init__를 사용하면 생성자(constructor)가 되고 객체가 생성될 때 자동으로 호출되는 메서드를 의미한다.

전에 함수를 배웠을 때 실습했던 학생 성적 처리 시스템을 불러와서 클래스로 코딩해보는 수업을 진행하였다.


학생의 성적을 나타내는 Student클래스와 학급의 성적을 나타내는 Classroom클래스를 작성하고 메인 코드에서 학급별로 학생 객체들을 만들고 학생들의 성적을 계산하여 출력하는 흐름이다.

객체 지향의 특성으로 객체의 내부 데이터와 구현을 외부로부터 숨기고 보호하는 개념이 캡슐화이다.

구분표기접근 가능 대상설명
public변수누구나 접근 가능외부에서 자유롭게 접근 가능
protected_변수클래스 + 자식 클래스 권장외부에서 접근은 가능하지만 비권장
private__변수클래스 내부만 접근 가능외부 접근 완전 차단 (은닉 목적)

이후에는 클래스의 상속과 메서드 오버라이딩에 대해 배웠다.

클래스를 상속하기 위해서는 클래스 이름 뒤 괄호 안에 상속할 클래스 이름(부모클래스)을 넣어주면 된다.
class 클래스_이름(부모 클래스)

부모 클래스에 있는 메서드를 동일한 이름으로 다시 만드는 것을 메서드 오버라이딩(method overriding)이라고 한다. 이렇게 메서드를 오버라이딩하면 부모 클래스의 메서드 대신 오버라이딩한 메서드가 호출된다.

사실 오늘 수업에서 가장 많은 시간을 들인 것이 클래스이다. 처음에는 클래스를 단순히 모듈처럼 생각했지만, 실제로는 객체를 만들기 위한 틀이라는 개념이 생소했고 글로만 이해하려다 보니 더 어렵게 느껴졌다. 특히 인스턴스 메서드, 클래스 메서드, 정적 메서드 같은 용어들이 헷갈렸다. 쉬는 시간에 교재를 펼쳐보니 (과자 틀=클래스 / 과자 틀로 찍어 낸 과자=객체)그림으로 쉽게 설명이 되어 있고 쉬운 예제 코드를 보여주어서 수업 막바지에 클래스 개념을 이해할 수 있었다. 아직 메서드 관련 용어들이 조금 헷갈리고 코드 작성도 미숙해서 클래스 관련 연습 문제들을 풀어 볼 계획이다. 나도 파이썬 초보자이기에 생소한 개념을 배울 땐 역시 그림으로 흐름을 이해하고 직접 코딩해보며 깨우치는 것이 가장 좋은 방법이라는 걸 느꼈다.


<6/12 21일차>

어제 회고에서 인스턴스 메서드와 정적 메서드, 클래스 메서드 개념이 헷갈린다고 적었는데, 강사님께서 오늘 간단하게 차이점을 설명해주셨다. 인스턴스 메서드는 self를 통해 인스턴스 속성에 접근하고, 클래스 메서드는 cls를 통해 클래스 속성에 접근한다는 점, 그리고 인스턴스 안에 들어가지 않는 게 클래스 메서드라는 설명이 이해를 도왔다. 정적 메서드는 인스턴스나 클래스와 직접적인 관련 없이 독립적인 기능을 할 때 사용하는 것도 배웠다. 덕분에 메서드의 용도와 쓰임을 조금 더 명확히 구분할 수 있게 되었다.

파이썬에서 처음 클래스를 만들 때 명시적으로 무엇을 상속받았다고 나타내진 않지만 알고보면 파이썬의 최상단 Object를 상속받은 것이라고 말한다. 클래스는 여기서 마무리하고 이제 데이터 분석 라이브러리 관련 개념들에 대해 배우기 시작한다. 넘파이(Numpy) 배우기 전에 데이터 분석에 유용한 함수로 defaultdict함수와 Counter함수를 연습해보는 시간을 짧게 가졌다.

defaultdict함수와 Counter함수는 파이썬의 collections 모듈에 있는 자료형이고, 데이터 분석할 때 유용하게 쓰이는 함수이다.

항목defaultdictCounter
기능없는 키에 기본값 자동 설정항목의 개수를 자동으로 셈
주 용도누적 저장, 그룹핑빈도 세기, 통계 분석
기본값 설정직접 타입 지정 (int, list 등)자동으로 int로 개수 세어줌
모듈collections.defaultdictcollections.Counter
특징키가 없어도 에러 없이 기본값으로 시작리스트나 문자열 등에서 자동으로 개수 셈

이제부터 본격적으로 넘파이(Numpy)에 대해서 배우기 시작하고 코딩을 주피터노트북이 아닌 VScode로 작성한다.

넘파이(Numpy)는 파이썬에서 데이터 분석을 위해 가장 많이 쓰이는 라이브러리 중 하나이다.

  • 다차원 배열(ndarray) 생성 및 연산
  • 벡터, 행렬, 통계 등 수학 연산 지원
  • 브로드캐스팅, 벡터화 연산을 통해 연산 속도 향상

넘파이(Numpy)의 주요 기능들은 다음과 같다.

  • 다차원 배열(ndarray) : 고성능 다차원 배열 지원
  • 브로드캐스팅 : 크기가 다른 배열 간 연산을 자동 확장
  • 벡터화 연산 : 반복문 없이 배열 간 연산 처리
  • 선형대수 연산 : 행렬 곱, 역행렬, 행렬식 계산 지원
  • 통계 연산 : 평균, 분산, 표준편차 등의 계산
  • 난수 생성 : 난수 배열 및 확률 분포 샘플링
  • 파일 입출력 : CSV, 텍스트 파일 읽기/쓰기 지원

오늘은 데이터 분석 라이브러리 중 가장 기본적인 넘파이의 개념을 배웠으니 이해하기 위해 쉬운 실습을 진행하였다.

import numpy as np 

data = [
    [120, 135, 150, 145],  
    [100, 110, 140, 130],  
    [90, 100, 95, 105] ]

sales_data = np.array(data)
np.sum(sales_data, axis=1)   #총 판매량

결과는 array([550, 480, 390])로 나온다.


오늘은 넘파이를 통해 배열을 만들고 연산하는 기본적인 방법을 익혔고, 리스트보다 연산 속도가 빠르다는 장점을 직접 확인할 수 있었다. 특히 PIL 라이브러리와 함께 이미지를 흑백 배열로 변환하고 밝기를 조정하는 간단한 이미지 처리 실습과 matplotlib를 이용해 데이터를 시각화하면서 데이터 시각화의 기본적인 흐름도 경험해보았다. 예전에 학교 수업에서 넘파이를 잠깐 다뤄본 적은 있었지만, 오랜만에 다시 접하니 새롭고 신선한 느낌이었다. 내일은 넘파이의 활용에 대해서 배우고 많이 코딩할 예정인데 이번 기회에 기본기를 다시 다질 수 있는 유익한 시간이 될 것 같다.


<6/13 22일차>

오늘은 하루종일 넘파이에 대해 배우고 코딩하는 수업이었다.
넘파이 배열(array)은 랭크와 차원을 갖는다. 랭크는 배열의 차원 수를 의미하며, 차원은 배열의 각 축의 크기를 결정한다.

넘파이 기초 함수들에 대하여 직접 코딩해보며 연습하는 시간을 가졌다.

  • np.zeros() => 0으로 채워진 배열
  • np.ones() => 1로 채워진 배열
  • np.random 패키지 => 다양한 확률 분포에 따른 난수를 생성하는 함수들
  • np.arange() => 값을 갖는 배열 생성
  • np.reshape() => 배열의 차원과 형태 변경

넘파이는 수치를 계산하는 라이브러리이므로 배열 연산(행렬 연산)도 가능하다. 연산할 때 행렬의 shape이 같아야하고 산술, 비교 연산 코드를 직접 입력해보며 Broadcasting 개념을 익혔다.

배열(array)의 연결 함수로는 concatenate(), vstack(), hstack()이 있다.

v1 = np.array([1,2,3])
v2 = np.array([4,5,6,7])
np.concatenate([v1, v2])

▶ array([1, 2, 3, 4, 5, 6, 7])

np.vstack((v1,v1))

▶ array([[1, 2, 3],
     [1, 2, 3]])

np.hstack((v1,v2))

▶ array([1, 2, 3, 4, 5, 6, 7])

수업 마지막에는 배열의 인덱싱과 슬라이싱에 대하여 배우고 해당 연습문제를 푸는 것으로 마무리했다.

위 사진과 같은 3차원 배열을 나는 arr_three라는 이름으로 만들고

이처럼 문제를 풀며 인덱싱과 슬라이싱 개념을 익혔다.

사실 인덱싱과 슬라이싱은 기존 리스트에서 하던 것과 다르지 않아서 크게 어렵지 않았다. 축(axis)이 늘어나면서 깊이(depth)가 추가된 것뿐이다. 어제 말했듯이 넘파이를 배워본 적이 있어서 내 기준 오늘 수업은 아주 무난하게 흘러갔다. 행렬도 오랜만에 듣는 개념이였고 잊고 있던 내용이 상기되면서 넘파이에 점점 익숙해지는 느낌이 들어서 재미있었다.


커리큘럼대로 수업이 잘 진행되고 있고 이다음으로는 판다스에 대해 배울 예정이고 판다스도 넘파이와 마찬가지로 잊고 있던 개념이 상기될 것 같아 벌써 기대된다. 판다스까지 다 배우고 나면 진행될 데이터 분석 프로젝트에서도 넘파이와 판다스의 기능이 활용될 것이다. 그만큼 지금 배우는 개념들이 중요하고, 이후 다른 라이브러리들을 배울 때도 기반이 되어줄 수 있으니 꾸준히 복습하며 확실히 익혀두어야겠다. 이번 주에 짝 코딩을 할 것이라고 자리를 재배치했는데 아직 짝 코딩은 하지 않았고 강의실이 좀 뒤죽박죽이 되어서 어수선해진 것 같다.

0개의 댓글