객체 지향 프로그래밍(OOP
: Object Oriented Programming)
객체(Object)
: 파이썬에서 다루는 모든 것 (문자열, 배열, 정수, 모듈 등)
id()
: 객체의 고유값(identity, 메모리 주소)을 반환
얕은 복사
: copy.copy()
깊은 복사
: copy.deepcopy()
추상화(abstraction): 컴퓨터 과학에서 추상화는 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것을 말한다.
캡슐화(encapsulation): 객체의 속성(data fields)과 행위(메서드, methods)를 하나로 묶는다.
실제 구현 내용 일부를 외부에 감추어 은닉한다.
(-> 모듈, 패키지, 라이브러리)
개발자가 객체를 설계하기 위한 것.
객체에는 속성, 메소드가 있다.
# 기본 형태
class 클래스명:
코드
# 인스턴스화
인스턴스명 = 클래스()
인스턴스화
: 클래스로 객체를 만드는 것
클래스: 카멜 케이스
함수: 스네이크 케이스
클래스에서 동작을 표현
def
로 선언
메서드의 첫 인자는 반드시 self
#
def 함수명(self):
코드
# 메서드 사용
인스턴스명.메서드명
# 속성값 접근
인스턴스.속성명
객체(인스턴스) 자기 자신을 의미
메서드는 해당 인스턴스(self)를 인자로 받아야 함
인스턴스 변수 정의 시 self.
를 붙여줌
변수를 인스턴스의 속성으로 쓰고 싶다면 self.
를 써주어야 함
__init__
)
__init__
함수는 생성자(constructor)이며, 인스턴스 객체를 초기화(initializing instance) 한다.
__init__
으로 인자를 전달하여 인스턴스 객체 속성 초기화
__init__
메소드 내부에서 정의된 변수는 클래스를 인스턴스화 할 때 값 설정 가능
def
로 정의
기존 클래스와 비슷한 기능, 속성을 유지하고 새로운 속성을 추가해서 다른 클래스를 만들고 싶을 때 상속을 사용한다.
코드 재사용!
상속 받은 클래스
: 자식, 서브, 파생 클래스
기존 클래스
: 부모, 슈퍼, 베이스 클래스
메소드 오버라이드(재정의, override)
: 기존에 있는 메소드를 변경하는 것
메소드 추가: 파생 클래스에 없는 메소드를 정의 하는 것
메소드 오버라이드: 파생 클래스에서 있는 메소드를 다시 정의하는 것
super()
함수# 기본 형태
def 부모 클래스의 메소드 이름():
super().메소드 이름()
# super를 활용한 변수 초기화
class 자식클래스명(부모클래스명):
def__init__(self, 부모클래스 속성, 속성):
self.부모클래스 속성 = 속성값
self. 속성 = 속성값 #새롭게 추가한다면
super()
를 통해 변수를 초기화하면 부모 클래스의 변경사항이 자식 클래스에도 반영된다.
# funnydice.py
from random import randrange
class FunnyDice:
def __init__(self, n=6):
self.n = n
self.options = list(range(1, n+1))
self.index = randrange(0, self.n)
self.val = self.options[self.index]
def throw(self):
self.index = randrange(0, self.n)
self.val = self.options[self.index]
def getval(self):
return self.val
def setval(self, val):
if val <= self.n:
self.val = val
else:
msg = "주사위에 없는 숫자입니다. 주사위는 1 ~ {0}까지 있습니다. ".format(self.n)
raise ValueError(msg)
def get_inputs():
n = int(input("주사위 면의 개수를 입력하세요: "))
return n
def main():
n = get_inputs()
mydice = FunnyDice(n)
mydice.throw()
print("행운의 숫자는? {0}".format(mydice.getval()))
if __name__ == '__main__':
main()