파이썬 week9_1
클래스와 객체지향
1.객체 지향 프로그래밍과 객체
객체(인스턴스)란?
list, str, int처럼 속성과 메소드를 가진 요소들, 클래스에서 좀더 디테일한게 객체, 다양한 속성을 가짐
※속성 : 리스트의 원소, 메소드 : list.sort(), list.appen()
클래스 vs 객체(인스턴스)
- 클래스 : 프로그램상 사용되는 속성과 행위를 모아놓은 집합체, 객체의 설계도 혹인 형틀(청사진)
- 인스턴스 : 클래스로부터 만들어지는 각각의 개별적인 객체, 서로 다른 인스턴스는 서로 다른 다양한 속성 값을 가질 수 있음.
ex) 클래스 = 고양이 , 객체1 = '네로', 객체2 = '냥이'
2. 객체 지향 프로그래밍의 장점
다양한 처리기능(메소드)가 잘 정의 되어있어 쉽게 이용가능
3. type()과 id()의 차이
type은 해당 객체의 자료형(str,int,float,dic)을 반환, id는 고유 아이디를 반환 >> 고유 아이디는 중복될 수 없음
4. 절차적 프로그래밍 vs 객체 지향 프로그래밍
- 절차적 프로그래밍 : 데이터 하나하나를 함수를 통해 처리
- 객체 지향 프로그래밍 : 객체간 상호작용으로 컴퓨터의 작업을 표현
※객체의 장점 : 여러 속성과 메소드(함수)를 포함할 수 있다는 것
6. 클래스 정의 방법
- 메소드(method, 멤버 함수)는 클래스 내부에서 정의되어 클래스나 클래스의 인스턴트가 사용하는 함수를 말한다.
즉, 메소드를 우리가 직접 만들수 있다. - 메소드의 매개변수인 self는 자기 자신을 참조하는 변수이며 메소드의 첫 번째 매개변수로 반드시 들어가야한다.
내이름은 나비, 색깔은 검정색, 야옹 야옹~~
내이름은 네로, 색깔은 흰색, 야옹 야옹~~
내이름은 미미, 색깔은 갈색, 야옹 야옹~~
각 고양이의 속성을 설정해주고 정의한 메소드(meow)로 출력
__init__은 객체의 속성을 만들고 속성변수의 기본값을 가지도록하기 위해 필요
self.~ = ~ 과 같이 변수를 설정해주는 것은 self가 있어야 어느 객체를 참조하는지 알 수 있기때문에
※클래스안 def는 꼭 return으로 마무리 안해도됨.
7. 문자열화 메소드
- 생성자
객체를 만들 때 객체 내부의 변수(속성)가 기본값을 가지도록 하는 역할 >> 오류가 나지 않기 위해?
__init__이라는 이름을 가짐
객체가 생성될 때 자동으로 실행 - __str__() 메소드
객체의 이름과 속성정보를 정의해서 출력이 자동으로 출력되도록함
위 와같이 {} 플레이스홀더를 두고 format() 메소드로 출력을 하게 되어도 __str__() 메소드가 자동으로 수행되어 객체 nabi의 속성정보가 자동 출력 됨.
8. 캡슐화
- 메소드와 변수를 외부에서 함부로 조작하는 것을 제한
- 잘못된 값이 들어오려고할 때 차단
※def get_age(self): 는 없어도 됨. 나중에 고양이 나이 불러오기위한 메소드
ex) nabi.get_age()
9. 객체의 아이덴티티 연산 : is, ==
is 연산자는 두 인스턴스의 아이디(id)가 같으면 True 반환
== 연산자는 두 인스턴스의 속성 값이 같으면 True 반환
10. 클래스와 특수 메소드
특수 메소드란(__anyname__)
Python의 특수 메서드는 "이중 밑줄"을 의미하는 dunder 메서드라고도 합니다. 이러한 메소드에는 이름의 시작과 끝에 이중 밑줄이 있습니다. Python 언어의 특정 사용 사례를 위해 예약되어 있다는 점에서 특별합니다. 객체에 대한 특정 작업에 대한 응답으로 Python 인터프리터가 특수 메서드를 호출합니다.
특수 메소드는 __init__, __str__ 등 이있다.
10.1 클래스의 메소드 정의의 필요성
Vector 2D라는 class의 간에 계산을 시도하였으나 +연산자를 정의 해주지 않아 오류가 발생
10.2 클래스내 add() 메소드 만들기
기존에는 벡터간 연산에 불가능했지만 벡터간 연산을 만들어 줌으로써 가능하게 됨
10.3 +연산자(__add__() 특수메소드) 정의하기
위 두 그림 처럼 파이썬 자체에 +연산자와 __add__메소드는 같은 것으로 인식하기 때문에 어떤 것을 써도 무관
10.4 파이썬의 대표적인 연산자와 해당하는 특수 메소드
11. 클래스 변수와 __dict__
11.1 클래스 속성 vs 클래스 변수
클래스 속성 = 인스턴스 변수 => 개별 인스턴스(객체)마다 다른 값을 가짐
클래스 변수 => 모든 개별 인스턴스가 공유해야 하는 값
아래 그림처럼 모든 개별 인스턴스가 필요로 하는 값은 클래스 변수로 지정하여 공유하면 데이터 중복이 줄어들고, 오류의 원인을 찾는 것도 간단해짐.
11.2 __dict__ 속성
아래와 같이 인스턴스변수의 이름과 값을 dictionary 형태로 반환
12. 객체와 참조, 할당연산의 의미
어떤 변수들이든 할당된 객체가 불변형 객체면 같은 객체(id 동일)를 갖는다. 또한 새로운 변수(m)에 객체가 할당된 기존변수(n)을 할당연사으로 할당하면 m은 n의 객체를 재참조하여 같은 객체를 참조한다.
위에서 본것 처럼 리스트는 불변형 객체가 아니다.