Programming/Python

[ Python_심화 ] 4. 클래스_01

Jerrykim91 2020. 6. 26. 08:55
반응형

4. 파이썬 심화 - 클래스_01


클래스


클래스는 객체(Object)를 표현하기 위한 문법이여 프로그래밍으로 객체를 만들 때 사용하는 것이다.


예를 들어

게임을 만든다고 하면 전사, 법사, 궁수, 암살자 등 직업별로 클래스를 만들어서 표현 가능하다.

기본적으로 게임 캐릭터는 체력(피), 마나, 물리 공격력, 마법 공격력, 방어력 등등이 필요하다.

그리고 전사는 무기를 이용해서 베기, 찌르기 등등의 스킬이 있어야 한다.


자!

클래스의 속성(Attribute) -> 체력(피), 마나, 물리 공격력, 마법 공격력, 방어력

클래스의 메서드(Method) -> 무기를 이용해서 베기, 찌르기 등등의 액션

클래스의 속성과 메서드는 아주 중요하기 때문에 만약 모르겠다면 혹은 감이 안 잡힌다면

다른 예제를 찾아보고 개념을 잘 숙지하는 것을 추천한다.


만약 Car로 예를 들어보면 아래와 같다.

클래스의 속성(Attribute) -> 색상, 연식, 속도, 기어

클래스의 메서드(Method) -> 가속, 감속, 정지, 시동, 기어 변경 (동작)

 

객체지향 프로그래밍은

복잡한 문제를 잘게 나누어(분해) 객체로 만들고, 객체를 조합(조립)해서 문제를 해결한다.

따라서 복잡한 문제를 해결하는데 유용하며 기능을 개선하고 발전시킬 때도

해당 클래스만 수정하면 되기 때문에 유지보수에도 효율적이다.

※ 참고로 파이썬은 모든 것이 객체이다.



1. 클래스 & 메서드


클래스의 기본 구조


    class 클래스이름:
    
        def 메소드(self):
            code
    
    # 동일 
    
    class 클래스이름(object):
    
        def 메소드(self):
            code

사람 클래스 예시


클래스는 특정 개념을 표현, 인스턴스를 생성해야 한다.


    class Person:
    
        def Greeting(self): # 메소드(Method)
    
            print('Hello')
    
    Jerry = Person()  # 인스턴스(instance)

메서드를 호출은 위의 내용에 Jerry.Greeting() 를 추가하여 실행하면 된다.

메서드는 클래스가 아니라 인스턴스를 통해 호출해야 한다.

인스턴스.메소드() (인스턴스, 메서드)를 하면 호출 가능하다.


    class Person:
    
        def Greeting(self): # 메소드(Method)
    
            print('Hello')
    
    Jerry = Person()  # 인스턴스(instance)
    Jerry.Greeting()
    
    # 인스턴스 인지 아닌지 확인 
    isinstance(Jerry, Person)  # 객체의 자료형을 판단할때 사용 
    
    # OutPut
    # >>> 'Hello'
    # >>> True

인스턴스와 객체의 차이는 유사 하하다.

인스턴스를 클래스와 연관을 지어서 말을 할 경우 객체를 인스턴스라고 말한다.

그 외의 보통 객체라면 그냥 객체라고 보면 될 것 같다.

나도 아직은 많이 어려운 개념이라 조금 더 자세하게 알아보고 이 부분만 상세하게 리뷰 하도록 하겠다.


메서드 안에서 메서드를 호출도 가능하다.

    class Person:
    
        def greeting(self):
    
            print('hello')
    
        def Hello(self):
    
            self.greeting()  # self.메소드() -> 클래스 안의 메소드를 호출 
    
    Jerry = Person()  
    Jerry.Hello()
    
    # OutPut
    # >>> 'Hello'


2. 속성(Attribute)


속성(attribute)을 만들 때에는 __init__ 메서드 안에서 self.속성 에 값을 담는다.


    # 이렇게 
    
    class 클래스이름:
    
        def __init__(self): 
    
            self.속성 = 값
    
    # 생성자 : 객체를 생성, 초기화(옵션)

__init__ (Initialize)는 인스턴스를 만들 때 호출되는 특별한 메서드이다.

그리고 인스턴스를 초기화한다.

self 인스턴스 자기 자신을 의미하며 인스턴스가 생성될 때 자기 자신에 속성을 부여한다.


class Person:
    
        def __init__(self):
    
            self.hello = '안녕!'  # 속성 생성 
    
        def Greeting(self):
    
            print(self.hello)     # 속성 사용 
    
    Jerry = Person()
    Jerry.Greeting()
    
    # Output
    # >>> '안녕!'

클래스로 인스턴스를 만들 때 값을 받는 방법은

__init__ 메서드를 이용해서 self 에 매개변수를 지정한 후

속성을 부여하면 값을 받을 수 있다.


    class 클래스이름:
    
        def __init__(self, 매개변수1, 매개변수2):
    
            self.속성1 = 매개변수1
            self.속성2 = 매개변수2

요렇게!!

위의 예제를 활용해서 매개변수를 추가해보면 아래와 같다.

    class Person:
    
        """
        매개변수 : self, 이름, 나이, 주소 
        """
    
        def __init__(self, name, age, address):
    
            self.hello   = '안녕!'
            self.name    = name  # self에 넣어서 속성으로 만듦
            self.age     = age
            self.address = address
    
        def Greeting(self):
            # print('{0} 나는 {1}야!'.format(self.hello, self.name))
            print(f'{self.hello} 나는 {self.name}야!')
    
    Joy = Person('조이', 30, '인천' )  # 인스턴스 생성 
    Joy.Greeting()
    
    print('이름:', Joy.name)     # 외부에서 인스턴스에 접근 할 경우 
    print('나이:', Joy.age)      # 인스턴스.속성 형식으로 접근 -> 인스턴스 속성
    print('주소:', Joy.address)    
    
    # Output
    # >>>  안녕! 나는 조이야!
    # >>>  이름: 조이
    # >>>  나이: 30
    # >>>  주소: 인천 

매개변수는 말 그대로 변수이지만

어떠한 매개체를 이용해서 변수로서 역할을 한다고 보면 될 것 같다.

그 매개체가 클래스 자기 자신인 거고 

 

3. 비공개 속성 (Private attribute )


Person 클래스에는 hello, name, age, address 속성을 활용해서

클래스 외부에서는 접근이 불가하고 내부에서만 사용 가능한 비공개 속성에 대해서 알아보자 ! 

비공개 속성은 __속성 과 같이 (__)로 만들어져야 한다.

__속성__속성__ 은 다르다.

비공개 속성은 클래스 외부에 드러내고 싶지 않은 값을 다룰 때 사용한다.

중요한 값일 경우 더더욱 외부에 공개되서는 안 될 때 비공개 속성을 사용한다.


기본 구조는 아래와 같다.

    class 클래스이름:
    
        def __init__(self, 매개변수)
            self.__속성 = 값 

이전에 했던 실습에 활용해보면

    class Person:
    
        """
        매개변수   : self, 이름, 나이, 주소 
        비공개속성 :  지갑
        """
    
        def __init__(self, name, age, address, wallet):
    
            self.hello    = '안녕!'
            self.name     = name      # self에 넣어서 속성으로 만듦
            self.age      = age
            self.address  = address
            self.__wallet = wallet    #  __를 붙여서 비공개 속성
    
        def Greeting(self):
    
            # print('{0} 나는 {1}야!'.format(self.hello, self.name))
            print(f'{self.hello} 나는 {self.name}야!')
    
        def pay(self, amount):
    
            if amount > self.__wallet:
                print('금액 부족')
                return
    
            self.__wallet -= amount   # 1. 비공개 속성은 클래스 안의 메소드에서만 접근가능
            print(f'잔여 금액 : {self.__wallet}원')
    
    
    Joy = Person('조이', 30, '인천', 500000 )  # 인스턴스 생성 
    # Joy.__wallet                    # 비공개 속성이라 외부에서 접근 불가능 -> 에러발생 
    Joy.pay(3900)  
    
    # Output
    # >>> 잔여 금액 : 496100원

아직은 언제 어느 때에 써야 할지 잘 모르겠지만 꽤나 유용해 보인다.




Reference

'Programming > Python' 카테고리의 다른 글

[ Python_심화 ] 5. 클래스 활용  (0) 2020.06.27
[ Python_심화 ] 4. 클래스_02  (0) 2020.06.27
[ Python_심화 ] 3. 클로저(Closure)  (0) 2020.06.25
[ Python_심화 ] 2. 변수  (0) 2020.06.25
[ Python_심화 ] 1. 재귀호출  (0) 2020.06.25