CHAPTER 7. 움직이고 노래하는 로봇, 객체지향 코드 만들기
챗GPT: 광화문덕! 텍스트 분석은 잘 돼?
챗GPT: 광화문덕! 무슨 일 있어? 뭐가 잘 안돼?
광화문덕이 얼굴을 들며 챗GPT를 쳐다봤다. 그러고는 툴툴거리며 말했다.
광화문덕 : 챗GPT! 매번 똑같은 코드를 타이핑하는 게 너무 지치.... 분명 이 코드 며칠 전 사용했던 코드인데 매번 타이핑하는 게 너무도 힘들어... 한두 줄도 아니고 말야... 뭐 좋은 방법이 없을까?
챗GPT : 아~ 그것 때문에 얼굴이 안좋아보였구나~! 방법이 있지~! 우리 그럼 좀 더 효과적인 프로그램 코딩에 대해서 공부해 볼까?
광화문덕: 흠..... 공부보다는 난 프로그램 만드는 게 좋은데..... 아... 냐..... 괜찮아.....
챗GPT: 걱정 마~~ 복잡하지 않아~~ 내가 '노래 부르는 로봇' 예제를 가져왔으니까 말야! 재미나고 쉬운 예제니까 부담 없을 거야~
광화문덕: 으.... 응....
챗GPT : 광화문덕! 잘 들어봐! 집중!!!! 객체지향 언어는 프로그램을 논리적으로 구성하는 방식 중 하나로, 객체라는 개념을 중심으로 프로그래밍하는 기법이야. 객체는 속성과 동작을 가지고 있으며, 객체들이 상호작용하면서 프로그램이 동작하게 되지!!!
광화문덕 : 객체라는 개념이 중심? 여기서 말하는 객체라는 단어가 뭔지 모르겠어...
챗GPT : 오~~!! 좋은 포인트야!!! 역시 광화문덕이야!!! 객체는 현실 세계의 사물이나 개념을 프로그램 내에서 모델링한 것을 말해. 예를 들어, 자동차를 프로그램으로 만든다고 생각해 봐. 자동차는 브랜드, 색상, 속도 등의 속성을 가지고 있을 수 있고, 주행, 정지, 경적 울리기 등의 동작을 수행할 수 있겠지?"
광화문덕 : 그래서 객체를 만들면 자동차처럼 속성과 동작을 가진다는 거야?
챗GPT : 역시!!! 정확해~~!!! 객체를 만들면 해당 객체는 특정 속성과 동작을 가질 수 있고, 다른 객체들과 상호작용하면서 프로그램이 실행되지. 객체들은 각자의 역할을 수행하며, 유기적으로 연결되어 프로그램이 동작하게 돼~
광화문덕 : 챗GPT! 내가 객체지향 언어 개념을 쉽게 이해할 수 있는 코드를 보여줄 수 있어?
챗GPT : 광화문덕! 그럼 우리 객체지향 언어 실습을 해볼까? 예를 들어, 로봇 제어 프로그램을 만들어보는 거 어때? 로봇 객체를 만들고, 로봇이 움직이는 동작과 노래를 부르는 동작을 추가해 보는 거야!
광화문덕 : 오~~~ 좋아! 만들어 보자! 로봇 객체를 만들고, 움직이는 동작과 노래를 추가하는 프로그램이라니~~ 벌써부터 기대되는 걸~~!!!
챗GPT : 자 내가 로봇 클래스를 하나 만들었어! 이렇게 로봇 클래스를 만들면 언제든 로봇이 필요할 때 이 클래스를 끌어와서 사용할 수 있거든!
python Code
# Robot 클래스 정의
class Robot:
def __init__(self, name):
self.name = name
def move(self):
print(f"{self.name}이(가) 움직입니다!")
def sing(self):
print(f"{self.name}이(가) 노래를 부릅니다! 라라라~")
광화문덕 : 챗GPT 코드만 보여주니 잘 모르겠어... 코드 설명도 보여주겠어?
챗GPT: 그럼 물론이지~!!! 짜잔~~!!
python Code
# Robot 클래스 정의
class Robot:
# 생성자 메서드: 객체 초기화를 위한 특별한 메서드
# self: 객체 자신을 나타내는 키워드
# name 매개변수를 받아 로봇의 이름을 설정
def __init__(self, name):
self.name = name
# move 메서드: 로봇의 움직임을 출력하는 메서드
def move(self):
print(f"{self.name}이(가) 움직입니다!")
# sing 메서드: 로봇이 노래 부르는 동작을 출력하는 메서드
def sing(self):
print(f"{self.name}이(가) 노래를 부릅니다! 라라라~")
챗GPT 설명
*Robot 클래스 정의
: Robot 클래스는 로봇 객체를 나타내는 템플릿이야. 클래스의 생성자(__init__ 메서드)는 name 매개변수를 받아 로봇의 이름을 초기화하지.
*move 메서드
: move 메서드는 로봇이 움직이는 동작을 나타내며, 로봇의 이름을 출력해.
*sing 메서드
: sing 메서드는 로봇이 노래 부르는 동작을 나타내며, 로봇의 이름을 출력해.
*클래스를 사용하는 주요 이유는 '코드의 재사용성' 때문이야.
: Robot 클래스를 정의함으로써 여러 로봇 객체를 쉽게 생성할 수 있어. 각 로봇은 고유한 이름을 가질 수 있고, 클래스의 메서드를 통해 로봇 동작을 수행할 수 있게 되지!
*Robot 클래스를 사용해서 로봇 객체를 생성하고 동작을 수행하는 코드를 보여줄게
---------- [ python code ] ----------
robot1 = Robot("로봇1")
robot2 = Robot("로봇2")
robot1.move() # "로봇1이(가) 움직입니다!" 출력
robot2.sing() # "로봇2이(가) 노래를 부립니다! 라라라~" 출력
------------------------------
이러한 방식으로 클래스를 사용하면 코드가 구조화돼서 관련 데이터와 동작을 묶어 관리할 수 있게 되는 거야~! 유사한 작업을 수행하는 여러 객체를 생성할 수 있게 되는 거지!
무엇보다~ 광화문덕 네가 힘들어하던 코드의 반복도 피할 수 있게 되는 거고 말야~!
광화문덕 : 챗GPT~! 그럼 로봇 클래스를 만들지 않고 사용하면 프로그래밍 코드는 어떻게 되는 거야?
python Code
# 로봇1
robot1_name = "로봇1"
def move_robot1():
print(f"{robot1_name}이(가) 움직입니다!")
def sing_robot1():
print(f"{robot1_name}이(가) 노래를 부릅니다! 라라라~")
# 로봇2
robot2_name = "로봇2"
def move_robot2():
print(f"{robot2_name}이(가) 움직입니다!")
def sing_robot2():
print(f"{robot2_name}이(가) 노래를 부릅니다! 라라라~")
# 로봇1 동작
move_robot1() # "로봇1이(가) 움직입니다!" 출력
sing_robot1() # "로봇1이(가) 노래를 부립니다! 라라라~" 출력
# 로봇2 동작
move_robot2() # "로봇2이(가) 움직입니다!" 출력
sing_robot2() # "로봇2이(가) 노래를 부립니다! 라라라~" 출력
광화문덕: 우와~ 이렇게 비교해서 보니까 확실히 클래스로 만들어서 관리하는 게 코드의 효율성 측면에서도 좋아 보이네~! 이제 좀 감이 오는 것 같아~ 객체지향 언어라는 것에 대해서 말야!
챗GPT: 광화문덕 그럼 우리 기능들을 구체화해 보는 건 어때?
python Code
# 챗GPT와 협업하여 로봇 프로그램 완성
def main():
robot_name = input("로봇의 이름을 입력하세요: ")
my_robot = Robot(robot_name)
while True:
#로봇 기능 설명 및 선택 번호 출력
print("1. 움직이기 / 2. 노래 부르기 / 3. 종료")
#사용자로부터 기능 선택 번호 입력받기
choice = input("선택: ")
if choice == '1':
my_robot.move()
elif choice == '2':
my_robot.sing()
elif choice == '3':
print("로봇 프로그램을 종료합니다.")
break
else:
print("잘못된 입력입니다. 다시 선택해 주세요.")
if __name__ == "__main__":
main()
광화문덕 : 와, 이제 로봇이 움직이고 노래를 부른다! 직접 만들어본 객체가 동작하는 걸 보니 뿌듯한 걸!
챗GPT : 광화문덕의 노력으로 멋진 로봇 프로그램을 완성시켰어. 계속해서 객체지향 언어와 다양한 프로젝트를 시도해 보면 더욱 전문적인 개발자가 될 수 있을 거야!
광화문덕 : 와, 정말 멋진 로봇 프로그램이다! 이제 객체지향 언어로 다양한 프로그램을 만들어보고 싶어졌어. 계속해서 더 많은 것을 배워보고 싶어!
챗GPT: 광화문덕의 열정과 노력으로 무한한 가능성이 열려있어. 계속해서 프로그래밍의 세계를 탐험하며 더욱 전문적인 개발자가 되어보는 건 어떨까?
클래스 정의하기: 클래스를 정의하려면 class 키워드를 사용하고 클래스의 이름을 지정해야 합니다. 클래스 이름은 일반적으로 CamelCase 스타일로 작성됩니다.
python code
class MyClass:
# 클래스 멤버나 메서드를 여기에 정의합니다.
클래스 멤버 정의하기: 클래스 내부에 변수를 정의하여 클래스의 상태를 나타낼 수 있습니다. 이러한 변수를 클래스 멤버 또는 속성(attribute)이라고 합니다.
python code
class MyClass:
my_variable = 10
생성자 메서드 정의하기: 생성자 메서드(__init__)를 정의하여 클래스의 객체를 초기화할 수 있습니다. 이 메서드는 객체가 생성될 때 자동으로 호출됩니다.
python code
class MyClass:
def __init__(self, value):
self.my_variable = value
클래스 메서드 정의하기: 클래스 내에서 함수를 정의하여 클래스 메서드를 만들 수 있습니다. 클래스 메서드는 클래스에 속하고 인스턴스 변수와 독립적으로 작동할 수 있습니다.
python code
class MyClass:
def my_method(self):
return self.my_variable * 2
객체 생성하기: 클래스를 사용하여 객체를 생성할 때, 생성자 메서드를 호출하여 객체를 초기화합니다.
python code
obj = MyClass(5)
객체 메서드 호출하기: 객체를 사용하여 클래스 내의 메서드를 호출할 수 있습니다.
python code
result = obj.my_method()
print(result) # 출력: 10
클래스 상속: 클래스는 다른 클래스를 상속하여 부모 클래스의 속성과 메서드를 자식 클래스에게 상속할 수 있습니다.
python code
class ChildClass(ParentClass):
# 자식 클래스의 추가 멤버나 메서드를 정의합니다.
상황 설명:
온라인 상점에서 상품을 관리하는 프로그램을 만들어야 한다고 가정해 봅시다. 이 상점에는 여러 상품이 있고, 각 상품에는 이름, 가격, 재고 수량과 같은 정보가 있어야 합니다.
클래스를 사용하지 않는 경우
python code
product1_name = "티셔츠"
product1_price = 20000
product1_stock = 50
product2_name = "청바지"
product2_price = 30000
product2_stock = 30
# 다른 상품들도 이와 같이 변수를 만들어야 함...
클래스를 사용하는 경우
python code
class Product:
def __init__(self, name, price, stock):
self.name = name
self.price = price
self.stock = stock
def change_price(self, new_price):
self.price = new_price # 상품 객체 생성
product1 = Product("티셔츠", 20000, 50)
product2 = Product("청바지", 30000, 30) # 가격 변경
product1.change_price(18000) # 상품 정보 출력
print(product1.name, product1.price, product1.stock)
print(product2.name, product2.price, product2.stock)