1. 객체 지향 프로그래밍
(1) 객체란?
- 모든 것은 객체.
- 다른 언어는 그렇지 않은 것이 있다.
- 객체는 attributes(속성), method(메서드)를 갖는다.
- 속성은 상태(state)를 나타내며, 변수로 구현된다.
- 메서드는 동작(behavior)을 나타내며, 함수로 구현된다.
- id() : 객체의 identity 확인.
3) 얕은 복사, 깊은 복사
- 얕은 복사: 원본 데이터는 그대로 두고, 참조하는 데이터의 id만을 복사하는 것.
- 깊은 복사: 동일한 데이터를 복사하는 것.
(2) 객체 지향 프로그래밍이란?
- 객체를 활용한 프로그래밍.
2. 클래스 기본 문법
(1) 클래스 선언 및 인스턴스화
1) 클래스 선언
- class Car: 항상 같은 id.
- class Car(): 호출할 때마다 다른 id
2) 클래스 사용 - 객체 인스턴스화
- 인스턴스화: 클래스로 객체를 만드는 것.
- 선언한 클래스 이름에 괄호를 적고 적당한 변수에 할당해서 사용한다.
- 인스턴스 호출: 클래스 실행이라고 보자.
3) 표기법
- 함수 호출과 클래스로 객체 만드는 것은 문법이 매우 유사함.
- 이를 구분하기 위해 클래스명과 함수명을 다르게 표기하는 방법을 권장함.
- 카멜 케이스 표기법: 각 단어의 앞 글자를 대문자로 쓴 것 ex) MyCar
- 스네이크 케이스 표기법: 단어는 소문자로 쓰고 각 단어의 연결은 ''를 사용. ex) my_car
(2) 클래스 속성과 메서드
- 인스턴스의 속성으로 사용하고 싶은 변수는 self를 써준다. self 인자를 통해 선언된 객체의 값이라는 의미.
- 객체 안에서 self를 사용하면 인스턴스 객체의 고유 속성을 나타낼 수 있다.
- 클래스가 아닌 self, 즉 인스턴스화된 객체 자신의 속성이라는 뜻.
- 메서드 내부에서 self 접두사 없이 일반 변수와 같게 선언된 변수는 메서드 내부에서만 사용되므로 self를 사용해 참조할 수 없음.
- 클래스의 메서드는 인자로 해당 인스턴스(self)를 받아야 한다.
- 메서드 호출 시에는 self 인자를 전달하지 않음. self의 값은 interpreter가 제공한다.
- 인스턴스 변수를 정의할 때에는 접두사 self.를 붙여준다.
(3) 생성자
- 'init' 메서드 안에 인자를 전달함으로써 인스턴스 객체의 속성을 초기화할 수 있다.
- 인스턴스 초기화: 'init' 메서드 안에 정의된 속성(변수) color와 category는 클래스를 인스턴스화할 때 값을 설정할 수 있음.
- 이 때 'init' 함수는 생성자(constructor)라고 함.
- 'init' 정의시 def 키워드 사용. 클래스 안의 메서드이므로 self를 써야함.
- 'init'의 발음은 던더(double under) 이닛이라고 함.
- 다른 언어는 생성자가 객체 인스턴스화와 초기화 2가지 작업을 하는 것이 있음.
- 파이썬 생성자는 초기화만 수행함.
- 객체 인스턴스화는 클래스 사용 시 변수 할당을 통해 이루어짐.
- 매직 메서드: 앞뒤에 언더바()가 두 개씩 있는 메서드.
(4) 클래스 변수와 인스턴스 변수
- 클래스 변수: 클래스에 바로 선언된 속성. 클래스에 의해 생성된 모든 객체에서 같은 값을 조회할 때 가능함.
- 인스턴스 변수: 'init()'안에서 self를 사용해 선언된 변수. 객체가 인스턴스화 될 때마다 새로운 값이 할당되며 서로 다른 객체 간에는 값을 공유할 수 없음.
- 객체 단위로 변경되는 변수는 인스턴스 변수로 선언하자.
3. 클래스, 조금 더 알아보기 - 상속
- 다른 클래스의 객체들을 받아오는 것. 기존 코드를 재사용하는 것이다.
- 방법: 클래스 선언시 괄호 안에 상속받을 클래스 이름을 적어준다.
- 상속받은 클래스: 자식 클래스, 서브 클래스(sub class), 파생된 클래스(derived class)라고 한다.
- 기존 클래스: 부모 클래스, 슈퍼 클래스(super class), 베이스 클래스(base class)라고 한다.
- 메서드 추가하기: 클래스 선언시 상속하고, 이후 새 메서드를 아래 추가하면 같이 사용 가능함.
- 메서드 오버라이드: 부모 클래스에서 선언된 메서드에 대해, 자식 클래스에서 메서드를 다시 정의하는 것.
- super(): 부모 메서드 호출. 파이썬 내장함수이다.
4. n면체 주사위 만들기
(1) 기획
(2) 주 프로그램 - main 함수
(3) FunnyDice class
(4) FunnyDice class test, get_input()
- Everything is an Object: https://linux.die.net/diveintopython/html/getting_to_know_python/everything_is_an_object.html
- 파이썬 공식 문서: id() 함수 : https://docs.python.org/3/library/functions.html#id
- 파이썬 공식 문서: copy() 모듈 : https://docs.python.org/3/library/copy.html
- 파이썬 문서-클래스 : https://docs.python.org/3.8/tutorial/classes.html
- 매직 메서드: https://rszalski.github.io/magicmethods/
- Built-in Functions (super()) : https://docs.python.org/3/library/functions.html#super