1 용어와 개념
- 객체(object): 속성(attribute, field)과 method를 갖는 데이터 구조체. 메모리상에 존재하는 데이터.
- 클래스(class): 객체를 만드는 주형. 속성 + 기능으로 구성.
- 속성(attribute, field): 객체가 가진 데이터. 보통 객체.~로 () 없이 표현 가능하다.
- method: 객체가 갖는 기능. 함수와 비교하자면 클래스에 포함된 함수를 메서드라고 한다.
- 인스턴스(instance): 객체와 같은 말이지만 특정 클래스로부터 만들어진 실체의 측면을 강조
- self: 클래스 호출 시 인스턴스 자기 자신이 들어갈 매개변수.
- 객체지향(object oriented) 프로그래밍: 복잡한 문제를 잘게 나누어 객체로 만들고, 그것들을 조합해 문제 해결하는 방식
- 현존하는 프로그래밍은 대부분 객체 지향 프로그래밍
- 객체 사용하면 장점은 코드 재사용, 모듈화에 용이
1-1 객체와 메모리
- 변수는 객체의 메모리 주소를 저장하고, 이를 이용해 객체를 참조한다.
- 변수 지정 없이도 객체를 생성할 수 있지만, 메모리 주소가 없으니 접근해서 사용할 수가 없다.
- 얕은 복사: 객체 주소를 복사하는 것.
b = a를 하고, a에 변동을 주면 b도 바뀐다. 왜냐하면 b가 a의 주소를 그대로 복사한 것이라서 하나의 객체를 공유하는 것.
- 깊은 복사: 객체 자체를 복사하는 것.
b = a[:] b = [i for i in a] b =[].expend(a) b=copy()
2 클래스 선언
class Car:
def __init__(self, color, length):
self.color = color
self.length = length
self.default = default
self.__hide = "숨김"
def doStart(self):
print('start')
- init: 클래스로 인스턴스 생성되는 최초에만 실행되어, 속성(attribute)을 만드는 method
- method들은 처음에 init으로 가서 self를 먼저 받고, 이후에 parameter들이 지정된다. parameter가 없어도 속성을 그냥 설정할 수 있다.
- self의 앞에 __로 표시되는 것은 비공개 속성. 외부에서 접근, 변경 못하는 속성으로, 클래스의 메서드 안에서만 접근, 변경 가능.
2-1 객체 생성(클래스 호출)
car1 = Car('red', 200)
- 여기 있는 'red'가 color에, length가 200으로 들어간다.
- 속성은 변경 가능.
car1.color = 'green' 이렇게
3 클래스 상속
- 부모 클래스의 속성과 메소드를 상속받아 자식 클래스에서 추가, 재정의(override)해서 사용 가능.
- 다중 상속 가능
- 예제로는 게임 캐릭터. 부모 클래스는 모든 캐릭터의 특성, 자식 클래스는 직업별 특성.
class character:
def __init__(self, name, HP):
self.name = name
self.HP = HP
def attack(self):
print("공격합니다.")
class warrior(character):
def __init__(self, name, HP, passive)
super().__init__(name, HP)
self.passive = passive
def attack(self):
print("스턴 공격을 합니다.")
def skill(self, AP):
print(f"{self.name}이 후려치기를 사용합니다. {AP} 데미지를 부여합니다.")
class 자식클래스명(부모클래스명):
super(): 부모 클래스의 속성 그대로 들고온다
4 추상 클래스
- 상위 클래스에서 매서드를 만들지만 기능은 비워놓고, 하위 클래스에서 이 기능을 구현하지 않으면 에러가 발생해서, 기능을 강요.
- 사용하는 이유는 부모 클래스를 다양하게 상속해서 쓴다고 하면, 그 아래에서 핵심 기능이 다를 일이 많아져서, 비워두지만 핵심 기능이기에 꼭 만들어서 써라.
from abc import ABCMeta
from abc import abstractmethod
class Airplane(metaclass = ABCMeta)
@abstract method
def flight(self):
pass
class Airliner(Airplane):
def flight(self):
구현