📌 Python 클래스

  • 클래스__
    정의 : 새로운 타입을 생성, 객체 지향적(중심적)인 프로그래밍_
    형식 : class 클래스명(): 멤버(필드, 메소드) ~

  • 특징
    - 생성자, 소멸자가 있다.
    - 접근지정자, 메소드 오버라이딩이 없다.
    - 다중상속 가능, interface가 없다.
    - 생성자 없이 객체를 만들 수 있다.
    - this 대신 self를 사용한다.
class TestClass:    # prototype, 원형 클래스 (new로 객체를 만들 필요가 없다, 자동으로 객체가 된다.)
    aa = 1  # prototype : 멤버변수(멤버필드), public

    def __init__(self, *param): # 생성자
        self.aa = param # 인스턴스화 객체 : 맴버 변수
        print("생성자")

    def __del__(self):  # 소멸자
        print("소멸자")

    def printMessage(self): # prototype : 맴버 메소드
        name = "한국인"
        print(name)
        print(self.aa)

# 생성자 호출 없이 prototype 객체만 호출 및 사용
print(TestClass, id(TestClass))
print(TestClass.aa)

# 생성자 호출 후, 인스턴스(객체) 사용
# 생성자 호출 후, 인스턴스 사용 시 생성자와 소멸자가 자동으로 호출된다.
# 생성자 호출 시, 첫번째 인자인 self는 인스턴스를 저장한 변수를 인자로 자동으로 보낸다.
test = TestClass(1, 2) # 생성자 호출
TestClass.printMessage(test)   # prototype 객체로 메소드 호출 (unBound method call)
test.printMessage() # 인스턴스의 메소드 호출 (Bound method call)
# 소멸자 자동 호출(인스턴스 메모리 해제)


📌 Python 원형 객체 VS 인스턴스 객체

  • prototype VS instance
    - prototype 객체 : 모든 인스턴스에 공유가능한 설계도
    - 인스턴스화 객체 : 생성자에 선언된 필드만 가지고 있는 설계도

  • prototype과 인스턴스의 특징
    - 인스턴스화 객체는 자신에게 없는 필요한 맴버를 prototype 객체에서 공유가능한 맴버에 접근할 수 있다.
    - prototype과 인스턴스가 참조하는 주소는 다르다.
class Car:
    handle = 0  # prototype 맴버 변수(필드)
    speed = 0   # prototype 맴버 변수(필드)

    def __init__(self, name, speed):
        self.name = name        # 생성자를 호출한 인스턴스의 type 맴버 변수
        self.speed = speed      # 생성자를 호출한 인스턴스의 type 맴버 변수

    def showData(self): # prototype 맴버 메소드
        km = 'km/s'
        msg = f'속도 : {str(self.speed)}{km}'
        return msg

Car.handle = 20 # prototype 객체의 맴버 필드 수정
Car.speed = 10  # prototype 객체의 맴버 필드 수정, but 해당 맴버 필드는 생성자에서 인스턴스화 되어진다. (즉, prototype 해당 맴버 필드 참조 불가능)

car = Car('BMW M340i', 100)
print(car.handle, car.speed, car.name)
# 출력 : 20 100 BMW M340i

car2 = Car('BMW M550i', 100)
print(car2.handle, car2.speed, car2.name)
# 출력 : 20 100 BMW M550i

car2.handle = 10    # 이때, car2 인스턴스화 객체에는 새로운 맴버 필드인 handle이 생성된다.


📌 Python 클래스의 이해

  • 클래스의 이해
  • 모듈 소속
    - 전역 변수
    - 함수
    - 클래스
  • 클래스 소속
    - 맴버 필드
    - 메소드
  • 메소드 소속
    - 지역 변수
# 전역 변수(모듈 소속)
kor = 100

# 함수(모듈 소속)
def a1():
    print('모듈 맴버 : 함수')

# 클래스(모듈 소속)
class myClass:
    # 맴버 필드(클래스 소속)
    kor = 90

    def __init__(self, kor):
        self.kor = kor

    # 메소드(클래스 소속)
    def test2(self):
        # 지역 변수(메소드 소속)
        kor = 10
        print(self.kor) # 인스턴스의 맴버 필드를 출력
        print(kor)      # 지역변수를 찾다가 없으면 맴버 필드가 아닌 전역 변수를 출력한다.

my = myClass()
  • 전역변수와 지역변수의 관계
    - 메소드 내부에서 지역 변수를 출력할 때, 지역 변수를 찾다가 없으면
    - 클래스 내부의 맴버 필드를 참조하는 것이 아니라 전역변수를 참조한다.


📌 Python 클래스 포함 관계

  • 포함 관계
    - 특정 클래스 내부에서 다른 클래스의 생성자를 호출하는 것이다.
class Machine:
    cupCount = 1

    def __init__(self, coin, cupCount):
        self.coinIn = CoinIn()  # 포함 관계
        self.coinIn.coin = coin
        self.cupCount = cupCount

    def showData(self):
        msg = self.coinIn.culc(self.cupCount)
        print(msg)


class CoinIn:
    coin = 0
    change = 0

    def culc(self, cupCount):
        change = self.coin - cupCount*200
        if change >= 0:
            self.change = change
            return f'커피 {cupCount}잔과 잔돈 {self.change}원'
        return "요금 부족!!"


if __name__ == '__main__':
    coin = int(input('동전을 입력하세요 : '))
    cup = int(input('몇 잔을 원하세요 : '))
    useMuchine = Machine(coin, cup)
    useMuchine.showData()


profile
데이터 사이언티스트를 목표로 하는 개발자

0개의 댓글