Python Class에 대해서 알아보자.
class의 사전적 의미는 굉장히 많이 있다
그 중 코딩에서 사용되는 class의 의미는 '부류'에 가깝다.
부류의 뜻은 "동일한 범주에 속하는 대상들을 일정한 기준에 따라 나누어 놓은 갈래" 라는 뜻이 있다.
즉 공통점이 많은 것들을 가리켜 "같은 부류" 라고 한다.
예를 들어 유재석 양세형 유병제 지석진 등의 공통점은 4사람 다 '코미디언'이란 직업을 가지고 있다.
이때 '코미디언'이 class가 된다.
그러나 '코미디언'이라는 것은 개념일 뿐이다.
코미디언의 실체 (instanace) 는 지석진, 유재석, 양세형, 유병재이다.
이 실체(instance)들을 object(객체) 라고 한다.
그럼 앞서 본 Car class 와 obejct 들을 파이썬 코드로 구현해 보자.
class ClassName:
...class 내용 코드들
참고로 class 이름은 각 단어의 앞글자를 대문자로 사용한다.
예를들어, Car, Comedian 처럼 말이다. 만일 한단어 이상으로 이루어져 있다면 밑줄(underscore) 없이 모든 단어를 다 붙이되 각 단어의 앞글자는 대문자로 해서 단어를 구분하게 된다.
class가 정의되면, class로 부터 실체화(instantiate) 할 수 있다.
hyundai = Car()
bmw = Car()
Car class를 실체(instance)화 한것이 hyundai와 bmw라는 객체(object) 인것이다.
앞서 부류란 어떠한 공통점들을 가지고 있는 것/사람 들을 이야기 한다고 얘기했었다.
즉 공통점이 중요한데, 자동차라면 브랜드, 엔진의 마력, 연비 등등이 공통 요소가 될것 이다.
이러한 공통 요소들을 class 에서 정의를 해주어야 한다.
그럼 하나 하나씩 공통 요소들을 정의해 보자.
class에 정의되는 공통 요소들을 전문어로 class의 attribute(성질 혹은 속성) 이라고 한다.
모든 자동차는 다음과 같은 공통 요소를 가지고 있다.
위 3개의 속성들을 class에서 정의하기 위해서는 다음과 같이 __init__ 함수를 통해서 정의 해주면 된다.
(참고로 class 안에서 정의해주는 함수(function)는 function이라고 하지 않고 method 라고 한다.
class Car:
def __init__(self, maker, model, horse_power):
self.maker = maker
self.model = model
self.horse_power = horse_power
먼저 __init__ 메소드의 이름을 자세히 보자.
init 이라는 단어의 앞 뒤에 밑줄 2개가 있다.
이렇게 앞뒤로 밑줄 2개가 있는 메소드들을 special methods라고 한다. 이들은 특별 취급을 받는다.
그 중 __init__ 메소드는 class가 실체화 될때 사용되는 함수 이다.
hyundai = Car("현대", "제네시스", 500)
여기서 이미 __init__ 메소드가 호출이 됐다. __init__ 이라고 메소드 이름을 명확하게 명시하지는 않았지만 클래스가 실체화 될때 자동으로 __init__ 메소드가 호출된다.
근데 여기서 이상한 부분이 있다.
__init__ 메소드의 parameter는 총 4개인데, 앞서 클래스를 실체화 할때는 3개만 넘겨주었다.
self 파라미터를 빼먹었는데, self 파라미터는 도대체 무엇이길래 빼먹는걸까?
self는 어떠한 실체를 가르키는 단어이다.
그렇다면 당연히 class에서 self는 class의 실체(instance)를 가르킨다.
self는 class의 실체(instance)인 객체(object)를 가르킨다.
그러므로 Car class에서 "self" 는 Car class의 객체인 hyundai나 bmw를 가르키고 있다.
그리고 클래스를 실체화 할때 파이썬이 해당 객체(self)를 자동으로 __init__ 함수에 넘겨준다.
그럼 이제 init 메소드 안에 코드를 보자.
class Car:
def __init__(self, maker, model, horse_power):
self.maker = maker
self.model = model
self.horse_power = horse_power
Parameter로 넘겨진 maker, model, 그리고 horse_power 값을 동일한 이름으로 self 에 저장 하는 것을 볼 수 있다.
저장하는 이유는 나중에 다시 사용하기 위해서이다.
클래스에서 __init__ 말고도 다른 메소드를 원하는 대로 추가할 수 있다.
Method와 attribute(속성)의 차이는 명사와 동사의 차이라고 생각하면 된다.
속성은 해당 객체의 이름 등의 정해진 성질인 반면에 메소드는 move, eat 등 객체가 행할 수 있는 어떠한 action같은 느낌이라고 생각할 수 있다.
움직이기, 멈추기, 경적 울리기 등이 있을 수 있다.
그럼 "경적 울리기"를 메소드로 추가해 보자.
class Car:
def __init__(self, maker, model, horse_power):
self.maker = maker
self.model = model
self.horse_power = horse_power
def honk(self):
return "빠라바라빠라밤"
honk 메소드에도 self 가 들어가 있는걸 볼 수 있다.
모든 메소드에는 self 파라미터가 첫번째 파라미터로 들어가야 한다.
honk 함수는 다음 처럼 사용할 수 있다.
hyundai = Car("현대", "제네시스", 500)
hyundai.honk()
> "빠라바라빠라밤"
네 이렇게 객체에서 메소드를 사용할때는 dot(.) 을 사용하여 객체를 호출 한다.
이를 dot notation 이라고한다.