Class가 무엇인가?
# 자동차 1
car_brand1 = "Kia"
car_color1 = "Red"
car_year1 = 1996
# 자동차 2
car_brand2 = "Hyundai"
car_color3 = "Blue"
car_year3 = 2009
# 자동차 3
car_brand3 = "BMW"
car_color3 = "Black"
car_year3 = 2000
브랜드, 색상, 제작년도가 있는 코드
만약 100대, 1000대 이상이 되면 일일이 쓰면 비효율적!
→ 클래스를 사용하자
class Car:
def __init__(self, brand, color, year):
self.brand = brand
self.color = color
self.year = year
car1 = Car("Kia", "Red", 1996)
car2 = Car("Hyundai", "Blue", 2006)
car3 = Car("BMW", "Black", 2000)
Car 는 자동차 클래스
car1, car2, car3 객체는 Car 클래스의 ‘인스턴스’
클래스 : 비슷한 속성을 가진 객체를 묶는 큰 틀
클래스 변수
class Car:
honk = "빵빵"
print honk
# NameError: name 'honk' is not defined
honk이라는 변수는 외부에서 호출이 안된다
클래스 안에 있는 변수는 '해당 클래스의 인스턴트’를 통해서 호출
my_car = Car()
my_car.honk
# '빵빵'
Car().honk
self는 뭔가요?
클래스 메소드의 첫 번째 인수로 self를 써 줘야지
해당 메소드를 인스턴스의 메소드로 사용 가능
쉽게 : 이 메소드를 부르는 객체가 해당 클래스의 인스턴스 인지 확인하려고
class Car:
honk = "빵빵"
def set_info(self, color, year):
self.color = color
self.year = year
def get_info(self):
print("color : %s , year: %d" %(self.color, self.year))
my_car1 = Car()
my_car1.set_info("Red", 2017)
my_car1.get_info()
#=> color : Red ,year: 2017
init 이란?
class Car:
honk = "빵빵"
def set_info(self, color, year):
self.color = color
self.year = year
def get_info(self):
print "color : %s ,year: %d" % (self.color, self.year)
my_car = Car()
my_car.set_info("Red", 2017)
my_car.get_info()
#=> color:Red, year:2017
new_car = Car()0
new_car.get_info()
# AttributeError: Car instance has no attribute 'color'
오류발생! set_info()를 안하고 get_info()를 먼저 불렀다…
클래스의 인스턴트를 생성할 때, 오류를 줄이고 싶다!
init 을 사용하자
초기화 메소드, 생성자라고 불림
인스턴스 = 클래스(변수1,변수2…)
class Car:
honk = "빵빵"
def __init__(self, color, year):
self.color = color
self.year = year
print "새로운 Car 인스턴스가 생성되었습니다."
def get_info(self):
print "color : %s ,year: %d" % (self.color, self.year)
my_car = Car("Red", 2017)
# 새로운 Car 인스턴스가 생성되었습니다.
my_Car.get_info()
# color : Red, year: 2017
새로운 인스턴스를 만들고 난 후 “새로운 Car 인스턴스가 생성되었습니다” 출력
즉 , init 메소드가 호출 되었다.
클래스 상속?
상속 : 물려받는다? 유산을 상속하다
부모의 클래스가 존재하고 그 부모 클래스를 '상속’받은 자식 클래스를 만들 수 있다.
자식클래스는 부모가 가진 메소드나 변수를 물려받아 그대로 사용 가능!
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def info(self):
print("이름: %s, 나이: %d" %(self.name, self.age))
class Employee(Person):
pass
em = Employee("goorm",20)
em.info()
#=> 이름: goorm, 나이: 20
Person 클래스는 init 메소드를 통해 이름, 나이를 초기값으로 받는다
info메소드를 통해 이름과 나이를 출력
Employee클래스를 보면 Person을 상속받았다
그래서 info를 동일하게 쓸 수 있다.
만약 메소드를 변형한다면?
메소드 오버라이딩이라고 부른다
class Person:
def __init__(self, name, age):
self.name =name
self.age = age
def info(self):
print "나는 부모 클래스 입니다."
class Employee(Person):
def info(self):
print "나는 자식 클래스 입니다."
per = Person("Python", 100)
per.info()
#=> "나는 부모 클래스 입니다."
em = Employee("goorm",20)
em.info()
#=> "나는 자식 클래스 입니다."
원래는 “나는 부모 클래스 입니다” 이지만
Person을 상속받아 자식클래스, 즉, Employee에서 메소드를 변형, 즉, 오버라이딩했다
따라서 "나는 자식 클래스 입니다"가 출력
예시를 하나 만들어보자
1 | class 클래스명(상속클래스): |
1 | class Klass(object): |
__init__
은 객체 생성 후 초기화 함수이다.
객체가 생성될 때 내부의 이름공간에 속성을 할당하여 초기화 역할만 한다.
이제 객체를 생성해 보자
1 | k = Klass("객체 생성") |
이름을 조회해 보자
1 | k.name |
1 | 결과 '객체 생성' |
k.name 과 k.getName()은 동일하다
Python의 가장 큰 특징이다. 굳이 getName을 사용하지 않아도 name로만 조회가 가능하다.
객체와 인스턴스의 관계
클래스는 객체를 만드는 도구이다.
클래스로 객체를 생성하고,
객체를 사용해서 특정기능을 처리할 수 있다.
여러개의 객체를 생성해 보자
1 | k1 = Klass("객체 생성1") |
생성관계
isinstance : 클래스와 객체의 생성관계를 확인하는 내장함수
1 | isinstance(k, Klass) |
1 | 결과 : True |
1 | isinstance(k1, Klass) |
1 | 결과 : True |
즉 k와 k1의 Klass를 통해서 생성된 것이다.
함수와 메소드 구분하기
함수들은 객체가 생성된 다음에 호출하기 때문에 메소드라고한다.
예를 들면 getName()을 쓰려면 Klass에서 만든 인스턴스를 이용해서 호출할 때 사용하는 것이다.
클래스에 어떤 메소드가 있는지 확인해보자
1 | Klass.__dict__ |
1 | k.__init__ |
객체를 호출할 때는 함수가 아니라 메소드로 처리함을 알 수 있다.
self에서는 객체에서 자동으로 전달되고 두 번째 인자에만 해당하는 값을 문자열로 전달하면 된다.
1 | k.__init__("메소드로 갱신") |
1 | 결과 : '메소드로 갱신' |