Class에 대해 알아보기 전에 Object Oriented Programming(객체 지향 프로그래밍)이 뭔지 간단히 알아보자.
코드를 클래스 위주로 작성하는 것을 Object Oriented Programming(객체 지향 프로그래밍) 이라고한다.
Class의 수많은 사전적 의미 중에서 코딩에 사용되는 class 라는 단어가 가지는 의미는 "부류"에 가장 가깝다. 비슷한 사람들을 가리켜 "저들은 같은 부류의 사람들이다" 라고 한다. 즉 공통점이 많은 사람들을 가리켜 "같은 부류" 라고 한다.
자동차를 예로 들어 보자면, Lexus, BMW, Benz, Hundai 는 자동차라는 공통점이 있다. 그러므로 이 4가지는 같은 부류라고 할 수 있다.
하지만 그렇다고 Lexus, BMW, Benz, Hundai가 같은 자동차는 아니다. 그저 자동차라는 공통점을 가지고 있는 부류일 뿐이다.
즉, 여기서 car 가 class
가 된다. 그러나 car 라는 것은 개념일 뿐 car 의 instanace
(실체)는 Lexus, BMW, Benz, Hundai다.
이 실체들을 object
(객체) 라고 한다.
정리를 해보자. Class는 함수와 입출력(변수)의 정보를 담은 설계도 라고 생각하면 이해하기 쉽다. Class 에서 사용되는 용어를 간단히 확인한 후에 다음 단계로 넘어가자.
인스턴스(instance)
: 클래스를 기반으로 생성한 객체
속성(attribute)
: 클래스의 변수
메소드(method)
: 클래스의 함수.객체.메서드
형식으로 사용
self
매개변수
- 객체가 자기 자신을 참조하도록 한다.
- 메소드에서 클래스에 정의된 모든 속성 및 다른 메소드에 접근 수 있다.
- 메소드를 선언할 때 첫 번째 매개변수로 반드시 self를 명시하도록 한다.
- 메소드를 호출할 때는 self 매개변수에 아무런 인수를 전달하지 않아도 된다.
- 변수명 = 클래스명(인자1, …) 에서 변수명이 self가 된다!
( __init__ )
초기화 메소드
- 클래스를 만들 때는 반드시 사용한다.
- 가장 먼저 호출하기를 원하는 메소드에 사용된다(가장 먼처 호출이 안되면 오류가 나는 기본 함수에 사용됨)
변수(variable)
- 클래스 변수(class variable)
- 해당 클래스를 사용하는 모든 인스턴스에서 사용하는 공통된 값이다.
변수명 = 객체
- 인스턴스 변수(instance variable)
- init() 메소드에서 선언된 변수
- 인스턴스가 생성될 때마다 새로운 값이 할당된다.
self.변수명
상속
class Add(상속이름)
이제 앞서 본 Car class 와 obejct 들을 파이썬 코드로 구현해 보자. 먼저 class가 정의되어야 한다.
class Car:
# 내용 코드
class가 정의되면, class로 부터 실체화(instantiate) 할 수 있다. 아래와 같이 함수를 호출 하듯이 클래스도 호출 하면 실체화된다.
hyundai = Car()
bmw = Car()
Car class를 실체(instance)화 한것이 hyundai와 bmw라는 객체(object) 인것이다.
이제는 비어있는 class 안을 채워보자. 앞서 class는 부류 라고 했다. 그리고 부류란 어떠한 공통점들을 가지고 있는 것들을 이야기 한다고 했다.
즉 공통점이 중요한데, 자동차라면 브랜드, 엔진의 마력, 연비 등등이 공통 요소가 될것이다. 이러한 공통 요소들을 class 에서 정의를 해주어야 한다.
그럼 하나씩 공통 요소들을 정의해 보자. Class에 정의되는 공통 요소들을 attribute
(성질 혹은 속성) 라고 한다. 다음 3가지 공통 요소를 정의해보자.
위 3개의 속성들을 class에서 정의하기 위해서는 다음과 같이 __init__
함수를 통해서 정의 해주면 된다.
class Car:
def __init__(self, maker, model, horse_power):
self.maker = maker
self.model = model
self.horse_power = horse_power
먼저 __init__
메소드의 이름을 자세히 보자. 이렇게 앞뒤로 밑줄 2개가 있는 메소드들을 special methods라고 한다. 이들은 특별 취급을 받습니다. 그 중 __init__
메소드는 class가 실체화 될때 사용되는 함수 입니다.
예를 들어:
hyundai = Car("현대", "제네시스", 500)
여기서 이미 __init__
메소드가 호출이 됐다. __init__
이라고 메소드 이름을 명확하게 명시하지는 않았지만 클래스가 실체화 될때 자동으로 __init__
메소드가 호출이 된다.
__init__
메소드의 parameter는 총 4개인데, 앞서 클래스를 실체화 할때는 왜 3개만 넘겨주었을까? self 파라미터를 빼먹었는데, 이 self 파라미터는 도대체 무엇이길래 빼먹는걸까?
class에서 self 는 누구를 말하는 걸까? Class 자체를 말하는것은 아닐것이다. 왜냐하면 앞서 보았듯이 class 자체는 공통점이 있는 부류를 가리키는 개념 이기 때문이다. 반면에 self는 어떠한 실체를 가르키는 단어다.
즉, self는 class의 실체(instance)인 객체(object)를 가리킨다.
그러므로 Car class에서 self 는 Car class의 객체인 hyundai나 bmw를 가르킨다. 그리고 클래스를 실체화 할때 파이썬이 해당 객체(self)를 자동으로 __init__
함수에 넘겨준다.
정리하자면:
__init__
메소드는 클래스가 실체화 될때 자동으로 호출이 된다.__init__
메소드의 self 파라미터는 클래스가 실체화된 객체를 넘겨주어야 하며, 파이썬이 자동으로 넘겨준다.__init__
메소드의 self 파라미터는 항상 정의되어야 있어야 하며 맨 처음 파라미터로 정의 되어야 한다 (그래야 파이썬이 알아서 넘겨줄 수 있으므로)
그럼 다시 __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 에 저장 하는 것을 볼 수 있습니다. 이건 객체(=self)에 maker, model, 그리고 horse_power를 저장하는 것이다. 이건 다른 메소드에서 다시 사용하기 위함이다.
클래스에서 __init__
말고도 다른 메소드를 원하는 대로 추가할 수 있습니다. Method와 attribute(속성)의 차이는 명사와 동사의 차이라고 생각하시면 된다. 속성은 해당 객체의 이름 등의 정해진 성질인 반면에 메소드는 move, eat 등 객체가 행할 수 있는 어떠한 action같은 느낌이라고 생각할 수 있다.
그럼 자동차가 할 수 있는 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 f"{self.maker} 빠라바라빠라밤"
honk 메소드에도 self 가 들어가 있는걸 볼 수 있다. 모든 메소드에는 self 파라미터가 첫번째 파라미터로 들어가야 한다.
honk 함수는 다음 처럼 사용할 수 있습니다.
hyundai = Car("현대", "제네시스", 500)
hyundai.honk()
> "현대 빠라바라빠라밤"
이렇게 객체에서 메소드를 사용할때는 dot(.) 을 사용하여 객체를 호출한다.
객체.메소드
이를 dot notation 이라고 한다.