파이썬 프로그래밍 시작 (12) 클래스, 오브젝트(object, 객체)
파이썬은 객체 지향 프로그래밍 언어입니다. 객체지향을 오브젝트 오리엔티드(object oriented)라고도 표현합니다. 어린이 파이썬 프로그래머 여러분에게는 갑자기 등장한 어려운 용어일 수 있습니다. 이 포스팅을 통해 몇 개의 프로그램을 실행해보며, 우리가 말을 배우듯 자연스럽게 의미를 익힐 수 있을 것입니다. 이번 포스팅에서는 파이썬 프로그래밍을 한 단계 상승시킬 수 있는 클래스, 오브젝트 등 객체 지향 개념에 대해 배워보겠습니다.
글의 순서
클래스와 객체(오브젝트, object)
함수만으로 만든 클래스
클래스에 변수 추가하기
여러 개의 오브젝트 만들기
클래스에서 변수를 할당하기 위한 함수 : __init__
클래스 내의 함수로 인자 전달
클래스 __init__ 함수에서 변수 추가 할당
파이썬 프로그래밍 : 클래스와 객체(오브젝트, object)
오브젝트를 우리말로 표현하자면 객체입니다. 물체로도 표현할 수 있습니다. 어떤 물건을 만들 때는 설계도가 있어야 하는데, 이 설계도에 해당하는 것이 클래스입니다. 테크보이 워니님은 빵과 빵틀로 객체와 클래스를 비유했습니다. 빵틀이라는 클래스에서 만들어내는 빵이 바로 객체입니다.
물건을 만드는 설계도나 틀에 해당하는 클래스는 변수와 함수로 구성됩니다. 변수와 함수들의 합입니다. 오브젝트는 클래스를 이용해서 만들어낸 물체인 것이고요. 객체 또는 물체를 영어로는 오브젝트(object) 또는 인스턴스(instance)라고 합니다. 객체, 물체, 오브젝트, 인스턴스는 모두 같은 의미입니다.
워낙 중요한 내용이라, 한번 더 정리해보겠습니다.
클래스는 설계도, 오브젝트는 설계도로 만들어낸 물체, 그러니까 오브젝트는 클래스로 만들어낸 물체. 오브젝트를 인스턴스라고도 함.
함수만으로 만든 클래스
파이썬 프로그래밍을 직접 해보면 클래스와 오브젝트를 더 빠르게 이해할 수 있습니다. 클래스를 함수와 변수의 조합이라고 말씀드렸는데요. 아래의 클래스01 코드는 함수만 가지고 만든 클래스를 보여줍니다. 클래스에 들어있는 함수를 파이썬 코드에서 활용하려면, 오브젝트까지 만들어봐야 합니다. 클래스01 은 Cafe라는 클래스를 설계한 후, 이를 이용하여 오브젝트 at_cafe까지 만든 것을 보여줍니다. 오브젝트 at_cafe는 at_cafe = Cafe() 의 형태로 만들어졌습니다.
실습코드 : 클래스01
class Cafe:
def ordering(self):
print("주문할게요.")
at_cafe = Cafe()
at_cafe.ordering()
클래스01 코드를 실행시키면 ‘주문할게요’가 출력됩니다. 클래스01 코드에서는 Cafe라는 클래스를 이용하여 at_cafe라는 오브젝트를 만들었습니다. 오브젝트는 클래스에 들어있는 함수를 사용할 수 있습니다. 오브젝트 at_cafe에서 클래스에 들어있는 함수를 사용하려면, 오브젝트 바로 뒤에 마침표를 찍은 후 클래스에 들어있는 함수이름을 쓰면 됩니다. 클래스01 코드에서는 at_cafe라는 오브젝트 바로 뒤에 점(‘.’)을 찍고 클래스에 들어있는 함수인 ordering을 붙여 썼습니다. Cafe라는 클래스에 들어있는 ordering이라는 함수는 self라는 인자를 받은 후 ‘주문할게요’를 출력합니다. 여기서는 self 라는 인자가 있다는 정도만 염두에 두시기 바랍니다. 여기서, 인자는 파라미터(parameter) 또는 아규먼트(argument)로도 불립니다.
요약해보면,
오브젝트를 만들 때, 클래스라는 설계도를 사용하였습니다. 오브젝트는 클래스 안에 들어있는 함수를 사용할 수 있는데, 오브젝트, 마침표, 클래스 안에 들어있는 함수이름의 형식으로 써서 함수를 사용합니다.
클래스에 변수 추가하기
클래스01 코드에서는 함수만으로 클래스를 만들었습니다. 이제는 변수까지 클래스에 넣어보겠습니다. 그냥 ‘주문할게요.’라고 말하게 하는 클래스가 이제는 ‘주문할게요. 저는 에스프레소’처럼 커피메뉴까지 말할 수 있도록 클래스02 코드처럼 coffee라는 변수를 추가하는 것입니다. 오브젝트에서 coffee라는 변수를 활용해야 할 경우, self.coffee와 같이 self 뒤에 마침표를 찍고 변수를 써줍니다. coffee라는 변수를 만들고, 이 변수를 self라는 파라미터(parameter,인자)에서 사용하는 방법입니다.
실습코드 : 클래스02
class Cafe:
coffee = "에스프레소"
def ordering(self):
print("주문할게요.저는 " + self.coffee )
at_cafe = Cafe()
at_cafe.ordering()
여러 개의 오브젝트 만들기
Cafe라는 클래스로 여러 개의 오브젝트를 만들고 싶다면, at_cafe라는 오브젝트를 만든 방법을 그대로 이용해서 오브젝트를 만들면 됩니다. 클래스03 코드는 at_cafe를 starbucks, twosome, ediya로 바꾼 경우입니다. 이렇게 오브젝트를 만들고 나서 클래스에 있는 함수 ordering을 이용해보겠습니다.
실습코드 : 클래스03
class Cafe:
menu = "에스프레소"
def ordering(self):
print("주문할게요.저는 " + self.menu)
starbucks = Cafe()
twosome = Cafe()
ediya = Cafe()
starbucks.ordering()
twosome.ordering()
ediya.ordering()
클래스03 코드를 실행시키면, 세 개의 함수 모두 ‘주문할게요. 저는 에스프레소’를 출력합니다. menu라는 변수가 클래스 안에서 고정되어 있기 때문입니다. 우리가 원하는 것은 각각의 오브젝트에 맞는 커피메뉴가 출력되어 나오는 것입니다. 커피메뉴를 각 커피전문점에서 주문하는 것처럼 바꾸려면 어떻게 해야 할까요? menu라는 변수를 Cafe라는 클래스를 만들 때 바로 할당하는 것입니다.
클래스에서 변수를 할당하기 위한 함수 : __init__
Cafe라는 클래스를 만들 때 menu라는 변수를 할당하기 위해서는 새로운 함수를 하나 더 써야합니다. 그게 바로 __init__ 함수입니다. 이 init 함수는 오브젝트를 생성할 때 처리할 내용을 만들어 줄 수 있습니다. 이때 꼭 기억해야 할 것은, 클래스 내부의 함수는 첫 번째 인자로 반드시 self를 받아야 한다는 것입니다. 참고로 init은 ‘초기화하다’라는 initialize를 줄여서 쓴 것이며, ‘__’ 는 키보드에서 쉬프트(shift)를 누른 상태에서 ‘-’를 입력한 것입니다.
__init__ 함수는 self를 첫 인자로 받아야 하며, 그 다음부터 우리가 새로 쓰고 싶은 변수들을 추가할 수 있습니다. 클래스04 코드는 init 함수를 사용한 모습을 보여주고 있습니다. __init__ 함수에서는 인자로 들어온 menu라는 변수를 사용할 때 self.menu의 형태로 사용합니다. 따라서 __init__ 함수 내에서 self.menu 변수에 menu를 담아둡니다.
클래스04는 각각의 오브젝트에 맞는 메뉴가 출력될 수 있게 만든 코드입니다. starbucks = Cafe(“에스프레소”)에서 보신 것과 같이 starbucks라는 오브젝트를 만들 때 “에스프레소”라는 메뉴를 클래스에 넘겨주고 있습니다. 클래스 안에 있는 ordering이라는 함수에는 변화가 없다는 것도 유심히 봐주시기 바랍니다.
실습코드 : 클래스04
class Cafe:
def __init__(self, menu):
self.menu = menu
def ordering(self):
print("주문할게요.저는 " + self.menu)
starbucks = Cafe("에스프레소 " )
twosome = Cafe("카페라떼 " )
ediya = Cafe("아메리카노 " )
starbucks.ordering()
twosome.ordering()
ediya.ordering()
클래스 안에 있는 함수로 인자 전달
이번에는 ordering이라는 함수를 조금 바꿔서, ‘주문할게요 저는 에스프레소’를 ‘주문할게요. 저는 에스프레소! 톨 사이즈’로 주문할 때 컵 사이즈까지 추가해 보겠습니다. 이렇게 하기 위해서는 함수를 부를 때 원하는 컵 사이즈를 넘겨줘야 합니다. 클래스05 코드에서는 ordering 이라는 클래스 내부의 함수를 부를 때 ‘톨 사이즈’라는 cup_size를 넘겨주는 모습을 보여줍니다. 마찬가지로 오브젝트 twosome, ediya에서 ordering 이라는 함수를 부를 때, 각각 ‘레귤러 사이즈’, ‘엑스트라 사이즈’라는 인자를 넘겨주고 있습니다. 이러한 컵 사이즈는 ordering 함수에서 cup_size로 받습니다.
실습코드 : 클래스05
class Cafe:
def __init__(self, menu):
self.menu = menu
def ordering(self, cup_size):
print("주문할게요.저는 " + self.menu + "! " + cup_size)
starbucks = Cafe("에스프레소 ")
twosome = Cafe("카페라떼 ")
ediya = Cafe("아메리카노 ")
starbucks.ordering("톨 사이즈 ")
twosome.ordering("레귤러 사이즈 ")
ediya.ordering("엑스트라 사이즈 ")
클래스 __init__ 함수에서 변수 추가 할당
다시 __init__ 함수로 돌아와서, 컵 사이즈를 init 함수에 할당해 보겠습니다. 이를 위해서는 오브젝트를 만들 때 cup_size를 추가해 줘야 합니다. 클래스06 코드에서는 __init__ 함수에 menu라는 변수와 함께 cup_size가 인자로 들어온 것을 보여줍니다. __init__ 함수 내에서 self.menu 변수에 menu를 담아두었듯, self.cup_size 변수에 cup_size를 담아둡니다. 클래스06은 각각의 오브젝트에 맞는 메뉴와 컵 사이즈가 출력될 수 있게 만든 코드입니다. starbucks = Cafe(“에스프레소”,”톨 사이즈”)에서 보신 것과 같이 starbucks라는 오브젝트를 만들 때 “에스프레소”라는 메뉴와 “톨 사이즈”라는 컵 사이즈를 클래스에 넘겨주고 있습니다. 클래스 안에 있는 ordering이라는 함수는 self만 인자로 받고 있습니다. 클래스06 코드 실행결과는 클래스05 실행결과와 동일합니다. 결과는 같은데 클래스 안에 있는 __init__ 함수와 ordering이라는 함수의 인자는 서로 다릅니다.
실습코드 : 클래스06
class Cafe:
def __init__(self, menu, cup_size):
self.menu = menu
self.cup_size = cup_size
def ordering(self):
print("주문할게요.저는 " + self.menu + "! " + self.cup_size)
starbucks = Cafe("에스프레소 ", "톨 사이즈 ")
twosome = Cafe("카페라떼 ", "레귤러 사이즈 ")
ediya = Cafe("아메리카노 ", "엑스트라 사이즈 ")
starbucks.ordering()
twosome.ordering()
ediya.ordering()
마치며 …
이 포스팅에서는 파이썬 프로그래밍의 수준을 한 단계 끌어올릴 수 있는 객체 지향 프로그래밍에 대해 알아보았습니다. 객체지향을 오브젝트 오리엔티드(object oriented)라고도 표현합니다. 클래스, 오브젝트의 개념과 오브젝트를 만들고 이용하는 방법을 차근차근 살펴보았습니다.
클래스를 설계도, 오브젝트를 설계도로 만든 물건이라고 기억해주시기 바랍니다. 물건을 물체, 객체, 오브젝트라고도 표현합니다. 어떤 물건을 만들든 만드는 방법이 필요합니다. 이 만드는 방법이 클래스입니다.
어린이 파이썬 프로그래머 여러분에게도 어느 정도 느낌이 왔을 것이라 기대합니다. 다음 포스팅에서는 이 객체 지향의 개념을 더 확장할 수 있는 상속(inheritance)에 대해 배워보겠습니다. 거의 다 와 갑니다. 조금만 더 힘을 내 주시기 바랍니다.
함께 참고하면 더 좋은 글 :
▶ 커피 로스팅 머신의 PID 제어기 파이썬 코딩
▶ 파이썬 IDE 설정. 비주얼 스튜디오 코드(Visual Studio Code, VS code)
▶ 파이썬 프로그래밍 시작하기 (1) 온라인 프로그래밍 환경 replit
▶ 파이썬 프로그래밍 시작 (2) 변수, 타입, 문자열 실습
▶ 파이썬 프로그래밍 시작 (3) 파이썬 함수
실습
▶ 파이썬 프로그래밍 시작 (4) 조건문
▶ 파이썬 프로그래밍 시작 (5) 연습문제 : 함수 만들기
▶ 파이썬 프로그래밍 시작 (6) 반복문
▶ 파이썬 프로그래밍 시작 (7) 반복문과
무한루프
▶ 파이썬 프로그래밍 시작 (8) 자료구조(Data Structure) : 리스트
▶ 파이썬 프로그래밍 시작 (9) 자료구조(Data Structure) : 튜플
▶ 파이썬 프로그래밍 시작 (10) 자료구조(Data Structure) : 딕셔너리
▶ 파이썬 프로그래밍 시작 (11) 연습문제 : 자료구조
▶ 파이썬 데이터 분석! 데이터 분석을 위한 코딩언어 파이썬
▶ 애플 실리콘 M1 시리즈 비교 : M1 Pro, M1 Max, M1 Ultra
참고자료
테크보이 워니(2020), 코딩 1시간만에 배우기 – 파이썬 (ft. 실리콘밸리 엔지니어)