[python] 클래스 사용하기

클래스와 메소드 만들기

# 클래스는 class에 이름을 지정하고 :을 붙인 뒤 다음 줄부터 def로 메소드를 작성하면 된다.
# 메소드의 첫 번째 매개변수는 반드시 self로 지정해야 한다.
# self는 인스턴스 자기 자신을 의미한다.
# class 클래스이름:
#     def 메소드(self):
#         코드

# 간단한 클래스를 하나 만들어보자.
class Person:
    def greeting(self):
        print('hello')


# 만든 클래스를 사용해보자.
# 다음과 같이 클래스에 ()를 붙인 뒤 변수에 할당한다.
park = Person()  # park는 Person의 인스턴스(instance)이다.

# 이제 만든 메소드를 호출해보자.
park.greeting()  # 이렇게 인스턴스 뒤에 .을 붙이고 메소드를 호출하면 된다.

# 지금까지 사용한 int, list, dict 등도 모두 다 클래스이다.
# type을 사용하면 객체(인스턴스)가 어떤 클래스인지 확인할 수 있다.
# type(객체)
a = 1
print(type(a))
print(type(park))


# 내용이 빈 클래스를 만들려면 pass를 사용하면 된다.
# class 클래스이름:
#     pass

# 메소드 안에서 메소드를 호출할 때는 self.메소드() 형식으로 호출해야 한다.
# 그렇지 않으면 클래스 바깥의 함수를 호출한다는 뜻이 되므로 주의해야 한다.
class Cls:
    def f1(self):
        print('f1')

    def f2(self):
        self.f1()
        print('f2')


a = Cls()
a.f2()

# 어떤 인스턴스가 특정 클래스의 인스턴스인지 확인할 때는 isinstance 함수를 사용한다.
# isinstance(인스턴스, 클래스)  참이면 True 반환
print(isinstance(a, Cls))
print(isinstance(a, int))

속성 사용하기

# 이번에는 클래스에 속성을 만들고 사용해보자.
# 속성을 만들 때는 __init__ 메소드 안에서 self.속성 에 값을 할당한다.
# __init__ 메소드는 인스턴스를 만들 때 호출되는 특별한 메소드이다.
# 이 메소드는 이름 그대로 인스턴스를 초기화한다.
# 앞뒤에 __가 붙은 메소드는 파이썬이 자동으로 호출해주는 메소드로,
# 스페셜 메소드 또는 매직 메소드 라고 한다.
class Person:
    def __init__(self):
        self.hello = 'hello'

    def greeting(self):
        print(self.hello)


park = Person()
park.greeting()

# 클래스로 인스턴스를 만들 때 값을 받는 방법을 알아보자.
# __init__ 메소드에서 self 다음에 값을 받을 매개변수를 지정한다.
class Person2:
    def __init__(self, name, age, address):
        self.hello = 'hello'
        self.name = name
        self.age = age
        self.address = address

    def greeting(self):
        print('{0} I am {1}'.format(self.hello, self.name))


park = Person2('park', 24, 'suwon')  # self 뒤에 있는 매개변수에 들어간다.
park.greeting()

# 클래스 바깥에서 인스턴스의 속성에 접근할 때는 인스턴스.속성 형식으로 접근한다.
print(park.address)

# 지금까지는 __init__ 메소드에 인스턴스 속성을 추가한 뒤 사용했지만,
# 인스턴스를 만든 뒤에도 인스턴스.속성 = 값 형식으로 속성을 추가할 수 있다.
# 이렇게 추가하는 속성은 해당 인스턴스에만 생성되고, 같은 클래스로 다른 인스턴스를 만들었을 때에는 생성되지 않는다.
park.tmp = 'tmp'  # park 인스턴스에만 tmp라는 속성 추가


# 인스턴스는 생성한 뒤에 속성을 추가할 수 있으므로 __init__ 메소드가 아닌 다른 메소드에서도 속성 추가가 가능하다.
# 단, 이때는 해당 메소드를 호출해야 속성이 생성된다.
class Person3:
    def greeting(self):
        self.hello = 'hello'  # greeting을 한번 호출해야 생성


# 인스턴스에서 자유롭게 속성을 추가할 수 있지만 특정 속성만 허용하고 다른 속성은 제한하고 싶다면
# 클래스에서 __slots__에 허용할 속성 이름을 리스트로 넣어주면 된다.
# 속성 이름은 반드시 문자열로 설정해줘야 한다.
class Person4:
    __slots__ = ['tmp1', 'tmp2']


park = Person4()
park.tmp1 = 1
park.tmp2 = 2
# park.tmp3 = 3  # tmp3은 허용하지 않음

비공개 속성 사용하기

# 이번에는 클래스 밖에서는 접근할 수 없는 비공개 속성(private attribute)를 만들어보자.
# 비공개 속성은 __속성 처럼 이름이 __로 시작해야 한다.
# __속성__ 처럼 양옆에 __가 왔을 때는 비공개 속성이 아니다.
class Person:
    def __init__(self, name, age, address, wallet):
        self.name = name
        self.age = age
        self.address = address
        self.__wallet = wallet  # __wallet으로 비공개 속성을 만든다.

    def pay(self, money):
        if money > self.__wallet:
            print('There is not enough balance')
            return
        self.__wallet -= money
        print('balance: {0}'.format(self.__wallet))


park = Person('park', 24, 'suwon', 100)
# print(park.__wallet)  # 클래스 바깥에서 접근 시 에러 발생
park.pay(50)  # balance: 50
park.pay(60)  # There is not enough balance
# 이처럼 비공개 속성을 바꾸는 것은 클래스의 메소드에서만 할 수 있다.
# 비공개 속성과는 다르게 클래스 바깥에서도 접근할 수 있는 속성을 공개 속성(public attribute)라고 한다.

# 속성 뿐만 아니라 메소드도 이름이 __로 시작하면 클래스 안에서만 호출할 수 있는 비공개 메소드가 된다.

Updated:

Leave a comment