파이썬_클래스와 메서드

hou·2022년 1월 2일
0
2022년01월02일

클래스

클래스란 객체를 표현하기 위한 문법이다.
게임 케릭터를 예로 들면 전사, 궁수, 마법사 클래스가 있을것이다.

여기서 전사 클래스의 체력, 마나, 공격력, 주문력을 담당하는 설정은 클래스의 속성(attribute)이고,
전사 클래스가 하는 행위;(베기, 찌르기)는 메서드(method)라고 한다.

이렇게 프로그래밍 하는 방법을 객체지향(object oriented) 프로그래밍이라고 한다.

클래스 이름을 짓는 방법은 대문자로 시작하고,
메서드의 첫 매개변수는 self로 지정해야한다.

class 클래스이름:
    def 메서드(self):
        코드

클래스 생성 방법

클래스는 특정 개념만 표현할 뿐 사용하려면 인스턴스를 생성해야 한다.
인스턴스 = 클래스()

이러한 형태는 int, list, dict 등도 동일한데 이들도 클래스이다.

>>> a = int(10)
>>> a
10
>>> b = list(range(10))
>>> b
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> c = dict(x=10, y=20)
>>> c
{'x': 10, 'y': 20}

인스턴스와 객체(object) 구분법

둘 다 같은 것인데 상황에 따라 다르다.
상황은 object만 부르냐 혹은 클래스와 연관지어 부르냐에 따라 다르다.

a = list(range(10))
b = list(range(20))

위의 리스트에서 a, b는 객체다. 그리고 list 클래스의 인스턴스다.


클래스에 속성 만들고 사용하기

class 클래스이름:
    def __init__(self):
        self.속성 =

__init__ method 안에 self.속성에 값을 할당한다.
__init__ method는 인스턴스를 만들 때 자동으로 호출된다.


예시를 통해 __init__ 메서드와 self를 잘 봐보자

class Person:
    def __init__(self, name, age, address):
        self.hello = '안녕하세요.'
        self.name = name
        self.age = age
        self.address = address
 
    def greeting(self):
        print('{0} 저는 {1}입니다.'.format(self.hello, self.name))
 
maria = Person('마리아', 20, '서울시 서초구 반포동')
maria.greeting()    # 안녕하세요. 저는 마리아입니다.
 
print('이름:', maria.name)       # 마리아
print('나이:', maria.age)        # 20
print('주소:', maria.address)    # 서울시 서초구 반포동

mariaPerson 클래스의 객체로 지정과 동시에 속성값을 같이 보낸다. 이 때 __init__ 메서드가 호출되어 maria를 구성한다.
selfmaria가 들어간다.

후에 maria.greeting()을 통해 maria를 구성하는 Person 클래스에서 greeting 메서드를 호출한다.


__slots__

특정 속성만 허용하고 다른 속성을 제한하고 싶을 때 사용한다.

>>> class Person:
...     __slots__ = ['name', 'age']    # name, age만 허용(다른 속성은 생성 제한)
...
>>> maria = Person()
>>> maria.name = '마리아'                     # 허용된 속성
>>> maria.age = 20                            # 허용된 속성
>>> maria.address = '서울시 서초구 반포동'    # 허용되지 않은 속성은 추가할 때 에러가 발생함
Traceback (most recent call last):
  File "<pyshell#32>", line 1, in <module>
    maria.address = '서울시 서초구 반포동'
AttributeError: 'Person' object has no attribute 'address'

클래스 언패킹

리스트나 딕셔너리 언패킹처럼 가능하다.

리스트 언패킹

class Person:
    def __init__(self, *args):
        self.name = args[0]
        self.age = args[1]
        self.address = args[2]
 
maria = Person(*['마리아', 20, '서울시 서초구 반포동'])

딕셔너리 언패킹

class Person:
    def __init__(self, **kwargs):    # 키워드 인수
        self.name = kwargs['name']
        self.age = kwargs['age']
        self.address = kwargs['address']
 
maria1 = Person(name='마리아', age=20, address='서울시 서초구 반포동')
maria2 = Person(**{'name': '마리아', 'age': 20, 'address': '서울시 서초구 반포동'})

클래스의 비공개 속성, 메서드

비공개로 속성을 만들면 클래스 안에서만 사용할 수 있고 바깥에서는 접근할 수 없다.

비공개 속성

class 클래스이름:
    def __init__(self, 매개변수)
        self.__속성 =
class Person:
    def __init__(self, name, age, address, wallet):
        self.name = name
        self.age = age
        self.address = address
        self.__wallet = wallet    # 변수 앞에 __를 붙여서 비공개 속성으로 만듦
 
maria = Person('마리아', 20, '서울시 서초구 반포동', 10000)
maria.__wallet -= 10000    # 클래스 바깥에서 비공개 속성에 접근하면 에러가 발생함

__wallet 이름 앞에 언더바2개 넣으므로써 비공개 속성으로 만든다.
같은 Person 클래스 안에서만 사용이 가능하다.

비공개 메서드

클래스의 속성 뿐만 아니라 메서드도 비공개가 가능하다.

class Person:
    def __greeting(self):
        print('Hello')
 
    def hello(self):
        self.__greeting()    # 클래스 안에서는 비공개 메서드를 호출할 수 있음
 
james = Person()
james.__greeting()    # 에러: 클래스 바깥에서는 비공개 메서드를 호출할 수 없음
profile
할 수 있다

0개의 댓글