본문 바로가기
프로그래밍/PYTHON

[15일차] python 클래스(Class)의 구성요소 / 캡슐화 / @property / @staticmethod

by B T Y 2017. 2. 28.
반응형

python 클래스의 구성요소 / @property / @staticmethod에 대해서 정리한다.




※ 클래스의 구성요소



- 멤버 변수


1. 클래스 변수

* 공유 변수 : 모든 객체가 서로 공유하는 단 하나의 변수

* @staticmethod는 기본적으로 클래스 변수와 비슷한 성질을 가지고 있다.



2. 객체(인스턴스) 변수

* 객체가 만들어지고 나서 사용 가능한 변수

* 객체가 생성된 이후에 멤버를 지정할 수 있다.





( python에서는 클래스안에 내용이 없어도 객체로 만든다음

객체 안에 변수를 만들어서 쓰는것도 지원하고 있다 )




- 멤버 메서드(함수)


* 멤버 메서드의 첫번째 인자는 self여야 한다.

* self를 통해서 객체의 멤버들에게 접근이 가능하다.




( self.변수명으로 객체안에 있는 변수라는걸 나타내준다 )



( Sample 클래스를 객체화해서 sample이라는 이름의 객체로 만든다음에 그안에 인스턴스 변수를

접근해보면 self.age와 self.name이 접근한걸 알수 있다 )





1. 생성자(생성 메서드)


* 이미 정의된 메서드(재정의)

* 사용자에 의해서 직접 호출되지 않는다.

* 객체가 생성될 때 자동으로 실행

* def __init__( self ):

( 객체를 생성할때마다 초기화 할 내용이 있다면 def __init__( self )안에 넣어주면 된다 )



2. 소멸자(소멸 메서드)


* 이미 정의된 메서드(재정의)

* 객체가 소멸될 대 자동으로 실행

* def __del__( self ):





※ 클래스 변수 vs 인스턴스 변수


1. 생성되는 시점이 다르다.

- 클래스 변수는 객체가 없어도 사용가능

( 즉, 객체보다도 먼저 만들어지는 변수 )

- 인스턴스 변수는 객체를 생성하지 않으면 사용할 수 없다.



2. 메모리 사용이 다르다.

- 클래스 변수는 클래스에 하나 존재하는 변수

- 인스턴스 변수는 객체마다 존재하는 변수



3. 접근하는 방법이 다르다.

- 클래스 변수는 클래스의 이름을 통해 접근

( 때문에 self를 사용하지 않는다(사용할수 없다) )


- 인스턴스 변수는 객체의 이름(변수)을 통해 접근

( self를 통해 멤버를 표현 )



- 전역변수, 객체변수, 지역변수의 범위에 대해서 알아본다.


variable.py





( 클래스 밖에 있는 변수는 전역변수로 언제든지 변수이름으로 접근 가능하고

self. 가 붙은 변수는 인스턴스 변수로 객체를 통해서 접근이 가능하다 )



- self

* 모든 메서드가 가지는 기본 인자

* 객체 자기자신을 나타내는 용도





※ 은행계좌와 관련된 클래스 설계

( 객체를 생성 -> 계좌 개설과 같은 의미 )


멤버 변수

  1. 잔액

  2. 계좌번호


멤버 메서드

  1. 입금

  2. 출금




( 객체 생성시 잔액과 계좌번호를 인자로 받아서 확인할수 있는 클래스이다 )



( 객체는 계속해서 생성할수 있지만 이 경우에는 변수 이름만 알면 누구든지 접근해서

잔액을 바꿀수 있기 때문에 문제가 된다 )




* 변수 앞에 '__'를 붙여주면 캡슐화를 통해서 외부에서 마음대로 값을 변조할수 없게 한다.

* @property를 이용하면 객체 변수를 접근할때 ()없이 변수처럼 접근할수 있다.



( 위에서 보면 잔액을 변경해도 계좌잔액을 통해 확인하면 값이 바뀌지 않은걸 확인할 수 있다 )





※ 클래스의 캡슐화


- 은닉성을 보장해준다.

- 내부에서만 접근 가능한 변수

( 변수 이름앞에 '__'를 붙여준다 )


- 객체지향 프로그래밍에서는 멤버 변수에 대한 외부로부터의 접근은 허용하지 않도록 하고 

멤버 메서드를 통해서 접근하도록 프로그래밍 하는것을 권장하고 있다.



- 아래와 같이 캡슐화를 이용해서 입출금 은행계좌 클래스를 만들수 있다.







- @property

입력받는 인자가 없을때는 멤버 메서드를 접근할때 '멤버 메서드()'가 아닌 '멤버 메서드'로 변수처럼 접근할 수 있다.

( 입력받는 인자가 있는 경우에는 사용하면 안된다 )




- 은행에 개설된 계좌의 총 갯수를 알고 싶다면?


  * 계좌의 갯수 == 객체의 갯수

 * 객체의 갯수? -> 객체가 생설될 때 마다 1씩 증가시켜 주는 변수

 * 생성 메서드를 이용하면 객체가 생성된 시점을 알 수 있다.





( 개설된 계좌 갯수를 체크하는 num_of_account 변수를 선언할때는 클래스 변수로 선언해줘야 한다 )


class_bank_account.py




반응형

댓글