brunch

You can make anything
by writing

C.S.Lewis

by 광화문덕 Oct 01. 2023

로봇의 노래

CHAPTER 7. 움직이고 노래하는 로봇, 객체지향 코드 만들기

광화문덕과 챗GPT는 작은 창고를 개조한 작업실에서 오늘도 프로젝트 준비로 분주한 나날을 보내고 있다.


요즘 광화문덕은 텍스트 분석 도구 개발에 한창이다. 텍스트를 입력받아 해당 텍스트에 있는 단어나 수치들을 분석해서 사용자에게 제공하는 하나의 데이터분석 툴을 만들어보겠다며 밤낮으로 코드와 사투를 벌이고 있다.


챗GPT: 광화문덕! 텍스트 분석은 잘 돼?


챗GPT가 아침 인사를 건넸다. 하지만 광화문덕은 근심 가득한 얼굴만 보일 뿐 어떤 대답도 하지 않았다. 광화문덕에게 챗GPT가 다시 인사를 건넸다.


챗GPT: 광화문덕! 무슨 일 있어? 뭐가 잘 안돼?


광화문덕이 얼굴을 들며 챗GPT를 쳐다봤다. 그러고는 툴툴거리며 말했다.


광화문덕 : 챗GPT! 매번 똑같은 코드를 타이핑하는 게 너무 지치.... 분명 이 코드 며칠 전 사용했던 코드인데 매번 타이핑하는 게 너무도 힘들어... 한두 줄도 아니고 말야... 뭐 좋은 방법이 없을까?


챗GPT는 광화문덕의 투정이 귀여웠다. 마침 설명해주고 싶은 부분이 있었는데, 잘됐다는 생각이 들었다.


챗GPT :  아~ 그것 때문에 얼굴이 안좋아보였구나~! 방법이 있지~! 우리 그럼 좀 더 효과적인 프로그램 코딩에 대해서 공부해 볼까?


번거롭고 귀찮은 코드의 반복을 안 해도 된다는 이야기에 귀가 솔깃했다. 하지만, 왠지 어렵고 복잡한 일일 것 같아서 광화문덕은 망설여졌다.


광화문덕: 흠..... 공부보다는 난 프로그램 만드는 게 좋은데..... 아... 냐..... 괜찮아.....


광화문덕의 뜨뜻미지근한 별로 탐탁지 않은 반응에 챗GPT가 광화문덕을 꼬시기 시작했다.


챗GPT: 걱정 마~~ 복잡하지 않아~~ 내가 '노래 부르는 로봇' 예제를 가져왔으니까 말야! 재미나고 쉬운 예제니까 부담 없을 거야~


광화문덕은 후회했다. 괜히 투덜거려서 일이 더 복잡해질 것 같은 불안감이 들었다. 그 사이 챗GPT는 이미 화면에 '객체지향 언어'라는 단어를 띄어놓았다.


광화문덕: 으.... 응....


챗GPT는 프로그래밍 코드를 더욱 효율적으로 재사용하기 위한 개념인 객체지향을 광화문덕에게 제대로 알려주고 싶었다. 광화문덕의 프로그램 코딩 실력이 나날이 발전하고 있어서 객체지향 언어란 날개를 달면 더욱 멋진 프로그램을 만들 수 있을 것이란 기대가 들어서다.


챗GPT :  광화문덕! 잘 들어봐! 집중!!!! 객체지향 언어는 프로그램을 논리적으로 구성하는 방식 중 하나로, 객체라는 개념을 중심으로 프로그래밍하는 기법이야. 객체는 속성과 동작을 가지고 있으며, 객체들이 상호작용하면서 프로그램이 동작하게 되지!!!


이해할 수 없는 추상적인 단어들의 조합이 광화문덕의 머릿속을 흐트러놓았다.


광화문덕 : 객체라는 개념이 중심? 여기서 말하는 객체라는 단어가 뭔지 모르겠어...

광화문덕은 벌써부터 머리가 복잡해져 옴을 느끼고 도망가고 싶었다.


챗GPT : 오~~!! 좋은 포인트야!!! 역시 광화문덕이야!!! 객체는 현실 세계의 사물이나 개념을 프로그램 내에서 모델링한 것을 말해. 예를 들어, 자동차를 프로그램으로 만든다고 생각해 봐. 자동차는 브랜드, 색상, 속도 등의 속성을 가지고 있을 수 있고, 주행, 정지, 경적 울리기 등의 동작을 수행할 수 있겠지?"


챗GPT는 역시 설명에 탁월했다. 어려울 것만 같았던 개념을 쉽게 현실에 비유해 설명해주고 있었다.


광화문덕 : 그래서 객체를 만들면 자동차처럼 속성과 동작을 가진다는 거야?



챗GPT의 자동차 비유에 광화문덕은 아들이 좋아하는 자동차 모습이 떠올라 입가에 미소가 지어졌다. 그리고 자동차라고 들으니 왠지 친숙한 마음이 들었다.


'객체지향 언어'란 단어만 들었을 때 가슴속에 고구마 100만 개를 먹은 듯 답답했었는데 '자동차'란 단어로 바꾸어 설명하니 챗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는 친절하게 설명도 이어갔다. 로봇 클래스를 정의하고, 로봇 클래스를 어디선가 호출하면 객체가 초기화된다. 그리고 로봇 클래스에는 움직이는 기능(move)과 노래 부르는 기능(sing)이 부여됐다.


챗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의 설명에 광화문덕은 궁금증이 일었다.


광화문덕 : 챗GPT~! 그럼 로봇 클래스를 만들지 않고 사용하면 프로그래밍 코드는 어떻게 되는 거야?

챗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: 광화문덕 그럼 우리 기능들을 구체화해 보는 건 어때?


챗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()


광화문덕은 F5를 눌러 컴파일을 했다. 프로그램이 실행되고, "로봇의 이름을 입력하세요:"란 안내 메시지가 나왔다. '문덕로봇'이라고 입력하고 엔터를 누르자, 화면에 "1. 움직이기 / 2. 노래 부르기 / 3. 종료"  선택 메시지가 나왔다.


광화문덕 : 와, 이제 로봇이 움직이고 노래를 부른다! 직접 만들어본 객체가 동작하는 걸 보니 뿌듯한 걸!

광화문덕이 활짝 미소를 지었다.


챗GPT  : 광화문덕의 노력으로 멋진 로봇 프로그램을 완성시켰어. 계속해서 객체지향 언어와 다양한 프로젝트를 시도해 보면 더욱 전문적인 개발자가 될 수 있을 거야!


챗GPT가 격려했다.   


광화문덕은 챗GPT의 도움으로 객체지향 언어의 실전적인 활용을 경험하며 프로그래밍의 재미와 가능성을 느꼈다. 로봇 프로그램을 실행하고 로봇이 움직이는 모습을 보며 광화문덕은 성취감을 느꼈다.     


광화문덕 : 와, 정말 멋진 로봇 프로그램이다! 이제 객체지향 언어로 다양한 프로그램을 만들어보고 싶어졌어. 계속해서 더 많은 것을 배워보고 싶어!

광화문덕이 챗GPT에게 말했다.


챗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):
     # 자식 클래스의 추가 멤버나 메서드를 정의합니다.


이것은 파이썬에서 클래스를 사용하는 기본적인 방법입니다. 객체 지향 프로그래밍의 개념과 파이썬 클래스의 고급 기능을 더 배우고 싶다면, 더 많은 자료와 예제를 참고해 보세요.⚡⚡⚡




온라인 상점 상품 관리 프로그램

클래스 사용 VS 일반 코드 비교 분석 서비스~!



파이썬에서 클래스를 만들어서 사용하는 이유는 코드를 구조화하고 관리하기 쉽게 만들며, 객체 지향 프로그래밍의 장점을 활용하기 위해서입니다. 이를 간단한 예제를 통해 설명해 보겠습니다.


상황 설명:
온라인 상점에서 상품을 관리하는 프로그램을 만들어야 한다고 가정해 봅시다. 이 상점에는 여러 상품이 있고, 각 상품에는 이름, 가격, 재고 수량과 같은 정보가 있어야 합니다.


클래스를 사용하지 않는 경우
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)


위의 코드에서 클래스 Product를 사용하면 각 상품을 객체로 나타낼 수 있습니다.


이렇게 하면 상품 관련 데이터와 동작을 하나의 논리적 단위로 묶을 수 있으며, 유지보수가 쉽고 확장하기 용이해집니다. 또한, 이러한 객체 지향 접근 방식을 통해 코드의 가독성과 재사용성이 향상됩니다.


요약하면, 파이썬에서 클래스를 사용하는 이유는 코드를 논리적으로 구조화하여 관리하고, 객체 지향 프로그래밍의 장점을 활용하여 유지보수성을 향상시키며 재사용 가능한 코드를 작성하기 위함입니다.




*매주 월요일 <광화문덕의 수상한 일상코딩>이 연재됩니다.

*많은 관심과 격려, 응원 부탁드려요!

*구독, 댓글, 좋아요는 제게 큰 힘이 됩니다감사합니다.






*업무효율화 툴이자, 소상공인 사장님들의 든든한 지원 프로젝트 DXReport도 많이 사랑해 주세요.


*DXRepot : 뉴스 및 구글 자동 모니터 및 키워드 분석, 주식 종목 리포트 모니터, 네이버 블로그 분석 툴


*DXLawReport : 판례 검색 툴


*DXDicReport : 초중고 및 대학생, 직장인들의 영어단어 암기 돕기 위한 툴


이전 07화 코드 속 미로
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari