| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
- 2차전지
- 증시 정리
- 환율
- 코스닥
- DN오토모티브
- 우리 fisa
- LG에너지솔루션
- 예결원 필기
- 코스피
- 달러
- 증시정리
- 환율의 대전환
- 파월 피봇
- SK하이닉스
- 코딩 스터디
- 우리fis아카데미
- ai엔지니어링
- 빅오 표기법
- 필라델피아 연은 제조업 지수
- 한국예탁결제원 통계 필기
- 한미 무역 협상
- 우리 FIS 아카데미
- 달러인덱스
- KOSPI
- 원화
- KOSDAQ
- 증시 정보 정리
- 우리FISA
- 현대차
- 삼성전자
- Today
- Total
studyLAB
우리 FIS 아카데미(AI엔지니어링) [3주차] 본문
dailyLAB 1. 3주차 배운 것
앞선 2주차에서는 파이썬을 다루는 방법의 기초에 대해 원리, 구조적인 접근과 조작방법을 실습하는 것이 위주였다고 생각되었습니다. 이어 이번 3주차에는 지난주차에 배웠던 여러 반복문, 함수, 문자열 등등을 활용하여 한층 더 데이터 분석에 가까워진 느낌을 받았습니다.

3주차에는 크게 수학적 연산에 있어 핵심적인 Numpy, 데이터 프레임을 다루는 기본인 Pandas 그리고 데이터를 시각화 하는 여러 라이브러리들인 matplotlib, seaborn, plotly등에 대해서 배웠고 마지막 금요일에는 앞서 배운 파이썬 코딩능력을 바탕으로 웹페이지를 제작하는 streamlit에 대해 배우고 간단한 웹페이지를 생성해 보았습니다.
이번주차에 특히 기억에 남는 부분은 의외로 2주차때 배웠던 python의 출력 방식이었습니다.
python에서는 코드를 실행하면 항상 코드의 결과가 출력되지 않습니다.
python이 결과를 출력하는 경우는 실행한 함수 혹은 매서드가 실행 대상인 원본을 수정하게 되는지 여부에 따라 갈리게 됩니다.
간단한 예시로 리스트의 list.sort() 매서드와 python 내장함수인 sorted()가 있습니다.
list.sort()는 원본의 데이터를 변경하는 매서드 입니다.
list_ = [1, 3, 2, 4]
list_.sort()
따라서 위와 같이 sort()를 실행하면 list_의 값은 [1, 2, 3, 4]로 정렬되어 list_에 저장되게 됩니다.
이렇게 원본 데이터가 변경되는 경우 python은 결과를 출력하지 않습니다.
반면 sorted()의 경우는 원본의 데이터를 변경하지 않습니다.
list_ = [1, 3, 2, 4]
sorted(list_)
>>> [1, 2, 3, 4]
원본을 변경하지 않는 함수, 메서드의 경우는 위와 같이 실행한 결과를 출력하게 됩니다.
이런 가벼운 내용들이 처음 배울때는 되게 사소한 부분이었다 생각했습니다. 그러나 직접 실습하는 과정을 거치며 과거에는 전혀 고려하지 않았던 python의 원리 원칙을 이해한 순간, 코드를 실행하며 보이는 시야가 달라지고 더욱 디테일한 코드 조정이 가능해졌다 생각되어 기억에 남았습니다.
dailyLAB 2. 야간 보충(기초 특강)
우리 FISA에서는 비전공생이나 기초에 대해 부실하다 생각하는 교육생들을 위해 정규 수업시간이 지난 후 18:30 ~ 20:30까지 기초 특강을 진행합니다. 지난 2주차때도 진행을 하였지만, 저는 코딩 경험이 아예 없지 않았어서 수강하지 않았습니다. 그러나 이번 주차에는 소규모 프로젝트 실습, EDA 실습이 진행될 예정이라 아는 부분이더라도 수강해 보고 싶다는 생각이 있었습니다. 또한 같은 AI엔지니어링 동기 분들의 얘기를 들어본 결과 되게 만족스럽고, 정규 시간에 빠른 진도로 못따라갔던 부분을 아주 상세히 설명해주신다는 좋은 후기를 듣다보니 더욱 관심을 갖게 되었습니다.
그래서 저는 이번주 모든 기초 특강 일정을 수강해 보았습니다. 월요일과 목요일에 진행한 기초 특강 중 월요일의 특강이 저에게 큰 영감을 주어 월요일에 진행했던 결과를 공유해 봅니다.
월요일 기초 특강에서는 지난 2주차에 배웠던 클래스를 구성하는 실습을 팀단위로 더 복잡하게 구성해보고 발표하는 시간을 가졌습니다.

마켓 컬리에서는 이렇게 회원 등급을 나누게 되는데 여기서 상품을 사려는 고객이 주어질때 해당 상품을 사는 경우 해당 고객의 등급과 등급에 따른 혜택을 얼마나 받게 되는지를 클래스로 구현하는 문제였습니다.
팀 프로젝트 구현과 발표를 본격적으로 진행하기에 두 시간은 매우 부족하다 느껴졌지만 지난 주 이해하기 가장 어려웠었던 클래스에 대해서 여러 팀원들과 소통하고 고민하다보니 이해가 더 되었던것 같습니다.
저희 팀에서 구성한 프로세스는 다음과 같습니다.
1. 실적에 따른 등급을 배정하는 외부 함수를 배정 : 해당 함수는 class외의 함수로 해당 함수의 결과에 따라 입력 변수는 클래스를 할당받게 됩니다.
def get_member(u_name, u_perf):
"""실적에 따른 등급 자동 배정 (Factory Function)"""
if u_perf >= 1000000:
return Purple(u_name, u_perf)
elif u_perf >= 150000:
return Friends(u_name, u_perf)
else:
return Plain(u_name, u_perf)
2. 구매 가능한 상품들의 정보가 저장된 Product class를 생성 : 단순히 회원의 구매 요청 정보를 바탕으로 결과만 도출하는 것이 아닌 변수 상황을 고려한 출력까지 시도해보고자 제품의 재고 정보를 담당하는 Product class를 생성하였습니다.
class Product:
"""최상위 부모: 상품 정보 관리 및 진열대(registry) 역할"""
registry = {} # 상품명으로 객체를 찾기 위한 저장소
def __init__(self, name, stock_qty, price):
self.item_name = name
self.stock_qty = stock_qty
self.price = price
# 생성과 동시에 진열대 등록
Product.registry[name] = self
def check_and_reduce_stock(self, buy_qty):
"""재고 확인 및 차감 로직"""
if buy_qty <= 0:
return False, "수량은 1개 이상이어야 합니다."
if self.stock_qty < buy_qty:
return False, f"재고 부족 (현재 재고: {self.stock_qty}개)"
self.stock_qty -= buy_qty
return True, "확인 완료"
3. 각 회원 등급에 따른 혜택을 구분하기 위한 class를 생성 : 이때 회원 등급별 혜택을 잘 보시면 중복되는 혜택 변수(instance 변수)인 적립률, 할인 쿠폰이 존재합니다. 이를 반영하여 Plain(일반회원)을 최상위 부모 class로 생성하고, 자식 class로 Friends와 Purple을 생성하였습니다.
class Plain:
"""일반 회원: 기본 기능 및 0.5% 적립"""
def __init__(self, user_name, performance):
self.user_name = user_name
self.performance = performance
self.grade = "일반회원"
self.reward_rate = 0.005
self.benefits = [f"기본 적립 {self.reward_rate*100}%"]
def buy(self, input_data, buy_qty):
"""구매 실행: 상품명(str) 또는 객체(Product)를 모두 처리"""
# 1. 상품명 입력 시 객체로 참조 전환
if isinstance(input_data, str):
product_obj = Product.registry.get(input_data)
else:
product_obj = input_data
# 2. 타입 검증 (Product 객체가 아니거나 진열대에 없는 경우)
if not isinstance(product_obj, Product):
print(f"\n[오류] 바코드를 읽을 수 없습니다. (입력: {input_data})")
return "바코드를 읽을 수 없습니다."
# 3. 재고 확인 및 차감
is_available, message = product_obj.check_and_reduce_stock(buy_qty)
if not is_available:
print(f"\n[결제 실패] {self.user_name}({self.grade})님: {message}")
return
# 4. 결제 성공 및 영수증 출력
total_price = product_obj.price * buy_qty
reward = total_price * self.reward_rate
print(f"\n>>> [{self.grade}] {self.user_name}님 구매 완료")
print(f"- 상품명: {product_obj.item_name} / 구매수량: {buy_qty} (남은재고: {product_obj.stock_qty})")
print(f"- 적용혜택: {', '.join(self.benefits)}")
print(f"- 최종금액: {total_price:,}원 (적립: {reward:.0f}원)")
class Friends(Plain):
"""프렌즈 등급: 1% 적립 + 6천원 쿠폰"""
def __init__(self, user_name, performance):
super().__init__(user_name, performance)
self.grade = "프렌즈"
self.reward_rate = 0.01
self.benefits = [f"기본 적립 {self.reward_rate*100:.0f}%"]
self.benefits.append("할인쿠폰 (6천원 할인 쿠폰 3장)")
class Purple(Friends):
"""퍼플 등급: 7% 적립 + 1만원 쿠폰 + 추가 혜택"""
def __init__(self, user_name, performance):
super().__init__(user_name, performance)
self.grade = "퍼플"
self.reward_rate = 0.07
self.benefits = [f"기본 적립 {self.reward_rate*100:.0f}%"]
self.benefits.append("할인쿠폰 (1만원 할인 쿠폰 4장)")
self.benefits.append("더블 후기 적립금")
예시 상황을 간단히 구성하여 코드를 실행한 최종 결과를 보시면 다음과 같습니다.
shrimp_snack = Product("새우깡", 10, 1500)
coke = Product("콜라", 5, 2000)
user1 = get_member("이몽룡", 50000)
user2 = get_member("성춘향", 200000)
user3 = get_member("심청", 1200000)
user4 = get_member("방자", 1500000)
user1.buy('새우깡', 2)
user3.buy('콜라', 2)
user4.buy('새우깡', 5)
user4.buy('새우깡', 0)
user4.buy('포카칩', 1)
print(f"\n[최종 재고 현황]")
print(f"- 새우깡: {shrimp_snack.stock_qty}개")
print(f"- 콜라: {coke.stock_qty}개")
>>> [일반회원] 이몽룡님 구매 완료
- 상품명: 새우깡 / 구매수량: 2 (남은재고: 8)
- 적용혜택: 기본 적립 0.5%
- 최종금액: 3,000원 (적립: 15원)
>>> [퍼플] 심청님 구매 완료
- 상품명: 콜라 / 구매수량: 2 (남은재고: 3)
- 적용혜택: 기본 적립 7%, 할인쿠폰 (1만원 할인 쿠폰 4장), 더블 후기 적립금
- 최종금액: 4,000원 (적립: 280원)
>>> [퍼플] 방자님 구매 완료
- 상품명: 새우깡 / 구매수량: 5 (남은재고: 3)
- 적용혜택: 기본 적립 7%, 할인쿠폰 (1만원 할인 쿠폰 4장), 더블 후기 적립금
- 최종금액: 7,500원 (적립: 525원)
[결제 실패] 방자(퍼플)님: 수량은 1개 이상이어야 합니다.
[오류] 바코드를 읽을 수 없습니다. (입력: 포카칩)
[최종 재고 현황]
- 새우깡: 3개
- 콜라: 3개
무작정 수업을 따라가며 정해진 코드 구조에 맞추어 공부했던 방식에서는 단순히 실행하는 방법에 대해 외우고 이해하고 넘어갔던것 같았습니다. 그러나 팀원들과 소통하고, 각자의 방식에 대해 고민하고 토론하며 다른팀의 발표까지 경청하니 어렵게 느껴졌던 class에 대해 더 잘 활용할 수 있겠다는 자신감도 생기고, 부족했던 부분들도 채워나갈 수 있는 뜻깊은 시간이 되었습니다.
dailyLAB 3. 여담
이번주에는 큰 이슈가 세 개나 있었습니다.
그중 첫 번째는 눈이 내린 것입니다. 지방에서 공부하러 올라왔던 저는 지난 2년간 서울살이를 하면서 지방에서 평생 보아왔던 눈보다 더 많은 눈을 보았습니다. 그러면서 나름 익숙해졌다 생각했지만 갑작스레 찾아온 눈은 다시금 저의 눈을 행복하게 만들어 주었던 것 같습니다.

다음의 이슈는 서울시 버스 파업 사건인데요. 버스 파업 전에는 저는 한 노선의 버스를 탑승하면 50분 정도 탑승하여 바로 등교, 귀가를 할 수 있었지만 파업을 한 이틀간 지옥의 지하철을 맛보았습니다.
퇴근 시간 버스가 없다보니 모두 지하철로 쏠릴 것을 예상해서 얼어붙은 눈길 위로 정말 열심히 뛰어갔지만 눈앞의 장면은 절망적이었습니다.

DMC 역 입구를 줄서서 들어가는 기적을 맛보았습니다..
이틀 연속으로 이러한 풍경을 보며, 직장인 신분이 아니었던 저로써 직장인 분들의 고된 삶을 짧게나마 체험하는 순간이 아니었을까 생각하게 되었습니다.
마지막으로 공부하느라 고생하는 수강생들을 위해 아카데미에서 가벼운 이벤트를 개최해 주셨습니다.
점심 시간 중 30분동안 각 교육 과정의 수강생들이 5명씩 3팀을 지어 망고 쥬스를 내걸고 인물퀴즈 대결을 하였습니다.
점심시간이 길지는 않은 편이라 밥을 먹고 돌아오면 다 끝나지 않았을까 싶었는데 한창 진행중이어서 흥미롭게 지켜보았습니다.
제가 속했던 AI엔지니어링 과정의 팀들이 11점, 11점, 8점이라는 높은 점수를 취득하였지만 다른 과정에서 12점을 극적으로 따내며 아쉽게 망고 쥬스를 맛보지 못했습니다. 합산이었으면 상대도 안됐을 것 같다는 아쉬움을 남긴채 고생한 동기들에게 박수를 보내며 수업을 들었던 소소한 이벤트였습니다.
'dailyLAB' 카테고리의 다른 글
| 우리 FIS 아카데미(AI엔지니어링) [2주차] (3) | 2026.01.11 |
|---|---|
| 우리 FIS 아카데미 (AI 엔지니어링)[1주차] (0) | 2026.01.04 |