파이썬 클래스(Class)

천둥상어

·

2023. 12. 20. 23:57

반응형

파이썬_클래스_썸네일

"파이썬은 객체 지향 언어 (OOP: Object Oriented Programming) 입니다.

객체를 만들기 위해서는 일종의 설계도나 틀이 필요한데 이러한 데이터와 메서드를 포함하고 있는 것이 클래스 입니다."

 

클래스 (Class)

객체의 특징을 담고 있는 설계도나 틀을 추상화 한 것을 클래스라고 합니다.

과일 사과를 예시로 든다면 사과가 객체이고 과일이 가지는 특징이 클래스 입니다.

class Fruit:
    def __init__(self, fruitName):
        self.friutName = fruitName
        
    def bEat(self):
        # 먹을수 있다
        return True

    def taste(self):
        # 맛있다.
        print("sweet")

 

객체 (Object)

객체는 클래스 기반으로 생성된 실체로 인스턴스라고도 불립니다.

위에 생성한 과일 클래스사과라는 객체를 만들면 다음과 같습니다.

#사과 객체 생성
apple = Fruit(fruitName="apple")

#사과는 과일 클래스로 생성 되었기에 과일의 인스턴스나 메서드 호출이 가능함.
print(apple.fruitName)

apple.taste() # sweet

 

클래스 기본 구조

파이썬의 클래스 기본 구조는 다음과 같습니다.

'__init__' 메서는 파인썬 클래스의 생성자 함수 입니다.

생성자는 함수는 객체가 생성될 때 호출되는 특별한 메서드 입니다.

'self' 는 현재 인스턴스를 나타냅니다.

즉 객체 자신이 전달 됩니다. 클래스 내 정의된 속성에 접근할 수 있도록 합니다.

class ClassName:
    def __init__(self, param1, param2, ...):
        # 속성 초기화
        self.attribute1 = param1
        self.attribute2 = param2

    def method1(self, param1, param2, ...):
        # 메서드 동작 정의
        # self.attribute1 또는 ClassName.attribute1 등을 활용
        # 필요한 경우 메서드 내에서 다시 다른 메서드 호출 가능

 

상속 (Inheritance)

상속은 이미 정의된 클래스의 기능을 물려받아 재사용 하면서 고유한 특징을 추가하는 개념입니다.

위에서 생성한 과일 클래스로 사과 말고도 다른 과일도 만들수 있습니다.

하지만 객체 이름만 다를뿐 각각의 과일 고유의 특징은 없습니다.

'과일' 클래스를 상속 받아서 '사과' 클래스'배' 클래스를 만들어 봅니다.

class Apple(Fruit):
    def color(self):
        print("Red")
        
class Pear(Fruit):
    def color(self):
        print("Yellow")
        

#사과, 배 객체 생성
apple = Apple(fruitName="apple")
apple.color() # Red 
apple.taste() # sweet

pear = Pear(fruitName="pear")
pear.color() # Yellow
pear.taste() # sweet

사과와 배에 있는 color() 메서드 이름은 동일하지만 각 클래스의 고유 메서드 입니다.

그래서 호출하면 자신의 color() 메서드가 호출되고 자신의 과일 색상이 출력됩니다.

하지만 taste() 메서드는 과일 클래스로부터 상속 받고 있는 메서드이기 때문에 동일하게 'sweet'가 출력 됩니다.

 

클래스 변수 (클래스 변수와 인스턴스 변수)

클래스 변수는 크게 인스턴스 변수와 클래스 변수가 있습니다.
인스턴스 변수는 함수내에서 self 로 시작하여 선언과 수정을 할 수 있는 변수입니다.
클래스 변수는 함수 외부에서 선언되는 변수로 상수입니다. 

 

코드 테스트

과일 클래스에 price(가격) 변수는 인스턴스 변수로 추가를 하고, origin(원산지)는 클래스 변수로 추가합니다.

class Fruit:

    origin = "Korea"

    def __init__(self, fruitName):
        self.friutName = fruitName
        self.price = 0
        # 아래 생략

 

이제 사과 객체에서 가격과 원산지를 변경해 봅니다.

apple = Apple(fruitName="apple")
apple.price = 2000
apple.origin ="china"

print(apple.price) # 2000
print(apple.origin) # 'china'

 

설명과 다르게 origin 값이 변경 되었습니다.
클래스 변수는 객체 생성 후 변경이 불가능하다 했습니다.
그렇다면 출력된 origin 값이 정말 클래스 변수를 가리키고 있는지 확인해 봅니다.

 

과일 클래스에 origin 값을 출력하는 함수(printOrigin)를 만들고 해당 함수를 사과 객체에서 호출해 봅니다

인스턴스 변수는 self로 접근하지만 클래스 변수는 클래스로 접근해야 됩니다.

class Fruit:

    origin = "Korea"

    def __init__(self, fruitName):
        self.friutName = fruitName
        self.price = 0

    def printOrigin(self) :
        print(Fruit.origin)
        
apple = Apple(fruitName="apple")
apple.price = 2000
apple.origin ="china"

print(apple.price) # 2000
print(apple.origin) # 'china'
print(apple.printOrigin()) # 'Korea'

결과를  보면 print(Fruit.origin)은 'Korea'를 출력합니다.
그럼 print(apple.origin) 은 뭘까요?

apple.origin 은 클래스 변수가 아닌 인스턴스 변수 입니다. 
위 설명에서 객체는 인스턴스라고도 불리운다 했었죠? 
즉 인스턴스로 통한 접근이기 때문에 apple.origin = "china" 는 self.origin = "china"와 동일하게 동작합니다.

 

printOrigin() 메서드에 추가로 print(self.origin)를 작성하여 확인할 수 있습니다.

class Fruit:

    origin = "Korea"

    def __init__(self, fruitName):
        self.friutName = fruitName
        self.price = 0

    def printOrigin(self) :
        print(Fruit.origin)
        print(self.origin)

apple = Apple(fruitName="apple")
apple.origin ="china"
print(apple.printOrigin()) # 'Korea' 'china' 순서대로 출력된다.

 

다중 클래스 정의

파이썬에서는 하나의 파일에 여러 개의 클래스를 선언할 수 있는 다중 클래스 선언이 가능합니다.

다중 클래스 정의를 사용하면 하나의 파일에 여러 클래스를 정의하고 사용할 수 있습니다.

 

개인적으론 하나의 파일에는 하나의 클래스만 정의하는 것을 권장합니다.

PEP(Python Enhancement Proposals)에서 다중 클래스 선언에 대해 제약은 없습니다.

하지만 다른 언어 규격에서는 대체로 권장하지 않습니다.

모듈화나 재사용성에서 불리하기 때문입니다.

 

다중 클래스는 클래스간의 의존성이 있는 경우에만 사용하는게 좋습니다.

#student.py

class Boy():
    def __init__(self, name):
        self.name = name
                
class Girl():
    def __init__(self, name):
        self.name = name

 

반응형