Fundamental 13. n면체 주사위 위젯 만들기
<학습 목적>
1. 파이썬의 클래스 문법
2. 클래스를 활용한 객체 지향 프로그래밍
13.2~13.3 객체, 객체지향 프로그래밍
- 파이썬에서는 모든 것이 객체이다.
- 객체라고 불리는 것들은 모두 변수에 할당될 수 있고 어떤 함수의 인자로 넘겨질 수 있다.
- 파이썬에서 정의된 모든 클래스는 object 클래스를 상속받고 있다.
- object 클래스는 변수 할당과 object id값 부여를 담당한다.
- id() : 프로그램이 동작하는 동안 객체의 고유값(identity)을 반환한다.
- 객체는 상태를 나타내는 속성(attribute) 과 동작을 나타내는 메서드(method) 가 있다.
- 객체의 속성은 변수로 구현되고 객체의 메서드는 함수로 구현된다.
- 얕은 복사 copy.copy() : 원본 객체의 주소를 복사
- 깊은 복사 copy.deepcopy() : 원본 객체의 값을 복사
- 객체지향 프로그래밍은 객체를 활용한 모든 프로그래밍을 말한다.
- 거의 모든 프로그래밍 언어에서 사용되어 파이썬 또한 객체지향 프로그래밍 기반이다.
- 미국의 데니스리치(Dennis Ritchie)가 만든 C언어는 절차지향 프로그래밍 기반이다.
- 1995년에 만들어진 Java는 객체지향 프로그래밍 기반이다.
13.4 클래스 기본문법 : 클래스 선언 및 인스턴스화
- class mose : id(mose)를 여러 번 출력해도 같은 id값이 나온다.
- class mose() : id(mose())를 출력할 때마다 다른 id값이 나온다.
- 인스턴스화 : 클래스의 사용을 위해서 클래스로 객체를 만들어주는 과정
- 인스턴스화는 선언한 클래스 이름 mose에 ()를 적어준다. 즉, mose()
- PEP8 : 파이썬의 코딩 스타일을 개정한 문서
- CamelCase : 각 단어의 앞 글자를 대문자로 대치 (Ex. mystage → MyStage)
- snake_case : 모든 단어는 소문자, 단어 사이에 언더바 (Ex. mystage → my_stage)
- 클래스 이름은 주로 명사, 함수 이름은 주로 동사로 간주한다.
13.5~13.6 클래스 기본문법 : 클래스 속성과 메서드, 생성자
- 클래스의 속성은 상태(state)를 표현한다. 속성은 변수로서 나타낸다.
- 클래스의 메서드는 동작(behavior)을 표현한다. 메서드는 def 키워드로 나타낸다.
- 클래스 속성 접근 방법 : (인스턴스 객체명).(속성명)
- 클래스 메서드 호출 방법 : (인스턴스 객체명).(메소드명)
- 클래스 메서드 정의 시 self 인자를 사용하지 않으면 오류가 생긴다.
- 인스턴스의 속성으로 사용하고 싶은 변수는 self. 를 쓰면 된다.
- 객체 안에서 self를 사용하면 인스턴스 객체의 고유 속성을 나타낼 수 있다.
- 아래 코드블록과 같이 self. 라는 접두사 없이 일반 변수와 같게 선언된 변수는 메서드 내부에서 사용되어 self. 를 사용한 참조가 불가능하다.
- self는 자기 자신을 말하며 클래스에 의해 생성된 객체(인스턴스)를 의미한다.
- 메소드를 호출할 때 self 인자를 전달하지 않아도 된다. self 의 값은 대체로 인터프리터가 제공한다.
★11~14★
11. init 메서드 안에 인자를 전달함으로서 인스턴스 객체의 속성을 초기화할 수 있다.
12. init 메서드로 정의된 속성인 color와 category는 클래스를 인스턴스화할 때 값을 설정해줄 수 있다. 이를 초기화라고 한다.
13. init 함수는 생성자(constructor)로 정의한다.
14. init 함수 또한 def 키워드로 정의된 클래스 안의 메서드이므로 self 인자를 써야 한다.
- 파이썬의 생성자는 초기화만 수행한다.
- 객체의 인스턴스화는 클래스를 사용할 때 변수 할당을 통해 이루어진다.
- 앞뒤로 언더바가 2개씩 있는 메서드를 매직 메서드라고 한다. 알아보러 가즈아
13.7 클래스 기본 문법 : 클래스 변수와 인스턴스 변수
- 클래스 내 변수를 설정하는 방법은 보통의 변수와 동일하게 변수명을 쓰고 값을 할당하거나 매직 init 메서드 안에 self. 와 함께 설정하는 방법으로 총 2가지이다.
- 결론부터 설명하면, 객체 단위로 변경되는 변수는 인스턴스 변수로 선언해야 한다.
- 클래스 변수 : 클래스에서 바로 선언된 속성을 말한다.
- 클래스에 의해 생성된 모든 객체에서 같은 값을 조회할 때 사용 가능하다.
- 인스턴스 변수 : 매직 init 메서드 안에서 self를 사용해 선언된 속성을 말한다.
- 즉, 13.6의 코드블록에 따르면 color, catagory는 인스턴스 변수가 된다.
- 클래스 변수가 가진 속성은 self에 들어가는 인자들이 공유한다.
- 인스턴스 변수가 가진 속성은 self에 들어가는 인자들이 공유하지 않는다.
- 위에서 기술한 내용을 쉽게 예를 들자면, Car 클래스에 만들어진 car 객체의 제조사는 항상 같지만, 그 차의 색상이나 종류가 다를 수 있다고 한다면 제조사가 클래스 변수가 되고 색상이나 종류는 인스턴스 변수가 된다. 인스턴스 변수는 초기화가 가능하도록 구현한다.
13.8 객체지향 프로그래밍을 하는 이유
- 추상화(abstraction) : 복잡한 자료나 모듈, 시스템 등으로부터 핵심적 개념이나 기능을 뽑아내는 것
- 캡슐화(encapsulation) : 객체의 속성과 메서드를 하나로 묶어 실제로 구현한 내용의 일부분을 외부에 숨기거나 은닉하는 것
13.9 클래스의 상속
- Car 클래스의 기능을 유지한 채 다른 속성이 추가된 새로운 클래스인 NewCar를 선언할 때 상속 기능을 쓰게 된다.
- 상속은 새로운 클래스명 바로 다음 소괄호 안에 상속받을 클래스명을 적는다.
- 여기서 기존에 존재하는 Car 클래스를 부모 클래스, 또는 슈퍼 클래스라고 하고, 새롭게 선언한 NewCar 클래스를 자식 클래스, 혹은 서브 클래스라고 한다.
- 클래스 상속에 사용되는 3가지 사용법 : 메서드 추가(add), 메소드 재정의(override), 부모 메서드 호출(super())
- 메소드 재정의 : 기존에 있는 메서드를 변경하는 것
- super() : 파이썬의 내장함수로 자식 클래스에서 부모 클래스의 메서드를 호출할 때 쓴다.
- 결국 상속은 기존에 있는 코드를 재사용하기 위해 만들어진 기능이다.