객체지향프로그래밍이란 3편 -class를 생성하는 방법과 attribute의 모든 것-

1. class를 생성하기 위한 기본 문법

 

1-1) 클래스 정의

 

class <class이름>:   or  class <class이름>():

    <수행 문장>

class MyClass:
    
    pass

class Myclass():
    
    pass

 

1-2) 인스턴스 생성

 

my_instance = <class명>()

 

객체의 설계도인 class를 가지고 하나의 인스턴스 my_instance가 생성되는

 

my_instance = MyClass()

 

1-3) method 사용

 

<instance명>.<method명>()

 

my_instance.my_method()

 

1-4) 속성(attribute) 호출

 

<instance명>.<속성명>

 

my_instance.my_attribute

 

 

class만으로는 뭔가 할수는 없고 class를 통해 인스턴스를 만들어야 뭔가를 할 수 있어

 

1-5) 코드 예시

 

설계도 class인 Person에서 하나의 실체 person1 인스턴스를 생성

 

isinstance(a,b)는 a가 b로부터 만들어진 instance인가?

 

어떤 값이 정수인지 판단할때 isinstance(3.5, int) 이런 식으로 알고리즘 문제에서 많이 썼지

 

파이썬은 모든 것이 객체이며 모든 객체는 특정한 타입의 인스턴스이다

 

 

2. 객체간의 비교연산자

 

2-1) ==

 

동등한(equal)

 

두 변수가 참조하는 객체가 값(내용)이 동등한 경우 True

 

생긴게 같은것

 

에시) 쌍둥이.. 둘이 똑같이 생겨도 실제 근본은 다름

 

두 변수의 주소가 달라도 값만 동일하면 True

 

2-2) is

 

동일한(identical)

 

두 변수가 동일한 객체를 가리키면 True

 

예시) 분신술.. 둘이 완전히 근본이 동일함

 

두 변수의 주소가 동일하면 True

 

 

실제 코드 예시

 

 

3. 속성(attribute)

 

특정 데이터 타입(class)의 객체들이 가지게 될 상태/데이터를 의미함

 

속성은 변수로 나타냄

 

class변수와 instance 변수가 존재한다

 

class 변수는 class로 생성하는 instance들이 모두 공통적으로 가지는 속성

 

어떠한 사람이든 피의 색깔은 빨간색

 

instance 변수느 class로 생성하는 instance마다 모두 다르게 가지는 속성

 

어떤 사람이든 이름이 기본적으로 다름(물론 같을수도 있지만)

 

 

4. instance 변수

 

class로 생성한 instance마다 다르게 가지고 있는 속성(attribute)

 

각 instance들의 고유한 변수

 

이름, 주민등록번호, ....

 

생성자 메소드인 __init__에 self.<변수명>으로 정의된 변수들이 instance 변수들

 

인스턴스를 생성하고 나면, <instance명>.<변수명>으로 접근함

 

 

john.name으로 john이라는 인스턴스의 인스턴스 변수 name에 접근하고 마치 변수처럼 john.name = 'taeyeon'처럼 값도 바꿀 수 있음

 

여기서 self?는 인스턴스 자기자신을 의미함

 

어떤 명칭을 써도 instance의 메소드의 첫번째 변수를 인스턴스 자기 자신으로 인식하지만

 

일반적으로 파이썬 문화로 self라고 칭함

 

 

근데 __init__에는 3개의 parameter를 받는다고 하는데 실제 쓸때는 Person('john','intp')처럼 2개만 써도 동작하는데??

 

파이썬 설계상으로 첫번째 변수에는 알아서 인스턴스 자기자신이 들어감

 

실제 사용에는 안넣어도 알아서 들어가지만 class를 작성할 때는 항상 첫번째 변수를 self로 작성해줘야함

 

 

5. class 변수?

 

class의 생성자 __init__ method 밖에 정의된 변수

 

모든 instance가 공통으로 가지고 있는 속성

 

<class명>.<변수명>으로 접근할 수 있다

 

 

self.pi = pi라고 instance 변수를 만들지 않았음에도 <instance>.pi로 class변수 pi에 접근할 수도 있다.

 

당연한게 class 변수는 모든 instance들이 공통적으로 가지고 있는 변수니까

 

파이썬의 이름 탐색 규칙상으로 c1.pi하면 __init__에서 pi를 찾아보고, pi가 없으면 class변수쪽을 찾아봄

 

----------------------------------------------------------------

 

공용으로 쓸건 class변수로 정의하고 각자 instance마다 다르게 쓸건 instance변수로 정의하고..

 

공용으로 쓸거니까 instance도 instance.<변수명>으로 class변수에 접근할 수 있고

 

인스타그램의 유저수? >> 모든 유저에게 물어봐도 동일할테니까 class변수

 

사람의 피 색? >> 모든 사람에게 물어봐도 빨간색이라 할테니까 class변수

 

사람의 이름??  >> 사람마다 다를테니 instance변수

 

---------------------------------------------------------------------

 

그러면 instance.<class변수명> = value로도 class변수를 바꿀 수 있겠네??

 

하지만 실제로는 아래와 같이 해당 instance의 변수값만 바뀐다

 

 

이거는 파이썬 이름 탐색 규칙에 의해 c1.pi하면 c1의 instance 변수 공간에 pi를 탐색해봄..

 

근데 c1의 instance 공간에는 pi가 없으니까 c1.pi = 10이라는 c1만의 instance변수를 할당해버림

 

그래서 c2나 Circle의 class변수값은 5로 그대로지만 c1만 pi가 10으로 나온다

 

 

6. class변수 활용범

 

생성자 메소드인 __init__은 instance를 생성하면 반드시 한번 수행된다는 것을 이용한다면

 

instance가 얼마나 생성되었는지 확인하고 싶을 때..

 

어떤 사이트의 방문자수, 회원수 등에 이용가능

 

 

class내부에서 class변수에 접근하고 싶으면 >> (class명).<변수명>

 

instance 변수에 접근하고 싶으면..? 함수 내부에서 self라는 인자를 받았잖아.. 그 self가 instance니까.. 

 

self.<변수명>으로 instance변수에 접근 가능

 

비슷한 논리로 나중에 classmethod에서는 class를 cls로 받으니까 cls.<변수명>으로 class변수에도 접근 가능하거든

 

 

7. class 변수의 변경법

 

이미 살짝 언급했지만, 모든 instance가 공통으로 사용하는 class변수의 값을 변경하고 싶으면 반드시 '(class명).(class변수명) = (바꾸고 싶은 value)'로 바꿔야함

 

 

 

c2.pi = 10하면 c2의 instance변수 공간에 pi를 찾아서 pi가 없으니까 새로운 c2.pi = 10이라는 값을 할당한 instance 변수를 생성함

 

 

무조건 공통으로 사용하는 class변수 값을 바꾸고 싶으면 (class명).(class변수명) = value로 바꿔야함

 

 

TAGS.

Comments