데이터 분석/파이썬

파이썬 중급 - 객체지향 프로그래밍, class (클래스)

김각도 2022. 10. 18. 10:20
반응형

객체지향 프로그래밍

 객체지향 프로그래밍이란 객체를 이용한 프로그램으로써, 객체는 속성과 기능으로 구분된다. 자동차를 예로 든다면, 객체는 자동차이며 속성은 색상이나 가격 등을 뜻하고, 기능은 전진과 후진 등을 뜻한다. 객체는 클래스에서 생성되는데, 속성과 기능을 정의해야 한다. 클래스 하나를 만들어 놓으면 원하는 수의 객체를 생성할 수 있다. 객체 사용은 코드 재사용과 모듈화에 좋다는 장점이 있다.

 

class (클래스)

 class (클래스)는 class 키워드와 속성(변수), 그리고 기능(함수)를 이용해서 만든다.

class Car:     # 클래스 선언

    def __init__(self, col, len):     # 생성자, 속성
        self.color = col
        self.length = len

    def doStop(self):    # 기능1
        print('STOP!')

    def doStart(self):    # 기능2
        print('START!')

    def carInfo(self):
        print(f'self.color: {self.color}')
        print(f'self.length: {self.length}')

class명은 첫글자를 대문자로 쓰는 것이 관례이다. class 안에 있는 함수는 매개변수로 self라는 키워드를 넣어야 한다. class를 선언했다고 해서 그 자체로 실행이 가능한 것은 아니며, 아래와 같이 클래스의 생성자를 호출하여 객체를 생성해야만 한다.

car1 = Car('red, 200)
car2 = Car('blue, 300)

이렇게 코드를 작성하면 car1과 car2, 서로 다른 속성을 가진 2개의 객체가 생성되는 것이다. 아래와 같이 코드를 작성하여 기능을 실행할 수도 있다.

car1.carInfo()
car2.carInfo()

만약 속성을 변경하고 싶다면 아래와 같이 코드를 작성하면 된다.

car1.col = 'black'
car2.len = 150

원본을 유지한 상태로 복사본을 만들어 데이터를 수정하고 싶다면 아래와 같이 copy()를 사용하면 복사본을 생성할 수 있다.

scores = [90, 80, 70]

copyScores = scores.copy()

 

얕은 복사와 깊은 복사

 복사는 얕은 복사와 깊은 복사로 나눌 수 있다. 얕은 복사는 scores1 = scores2처럼 단순히 객체의 주소만을 복사하여 동일한 하나의 객체를 공유하는 것으로서 객체 자체는 복사할 수 없지만, 깊은 복사는 객체 자체를 복사하여 또 하나의 동일한 객체를 생성하는 것이다. 얕은 복사는 할당연산자만 사용하면 되지만, 깊은 복사를 하는 방법은 다양하다.

상속

class에는 상속이라는 개념이 있는데, 다른 클래스를 상속하게 되면 해당 클래스의 기능을 전부 사용할 수 있다. 상속하는 방법은 다음과 같다.

class NormalCar:
    def drive(self):
        print('drive')

class TurboCar(NormalCar):
    def turbo(self):
        print('turbo')

이렇듯 상속받으려는 class명 옆에 괄호를 치고, 안에 상속될 class명을 넣어주면 된다. 위와 같은 코드로 인해 TurboCar라는 class는 NormalCar라는 class의 기능 또한 사용할 수 있게 된다.

 상속을 받은 하위 클래스에서 상위 클래스의 기능을 사용할 수는 있으나, 속성까지는 사용할 수 없다. 상위 클래스의 속성을 사용하고 싶다면 2가지 방법이 있다. 첫 번째는 하위 클래스의 함수에 class명.__init__(self, 하위 클래의 매개변수)라는 코드를 넣어서 강제로 호출하는 방법이다. 두 번째 방법은 super()라는 함수를 쓰는 것이다. 이것도 마찬가지로 하위 클래스의 함수 안에 super().__init__(하위 클래스의 매개변수)라는 코드를 넣으면 된다. 두 가지 방법 중에서는 후자가 더 많이 쓰인다. 후자의 경우 self 키워드를 사용하지 않아도 된다는 특징이 있다.

다중 상속

 상속을 하나의 클래스에서만 받을 수 있는 것은 아니다. class Car(Car01, Car02, Car03)과 같은 방식으로 상속할 class를 나열하면 여러 개의 class를 상속받는 것이 가능하다. 주의할 점은 다중 상속을 남발할 경우, 개발자 입장에서는 굉장히 헷갈릴 수 있으므로 꼭 필요한 경우에 필요한 개수만큼만 상속해야 한다.

오버라이딩

 하위 클래스에서 상위 클래스를 상속받은 경우 기능을 사용할 수 있게 되는데, 상위 클래스의 기능을 변경하여 사용하고 싶다면 변경할 기능을 상위 클래스의 함수명과 동일한 함수명에 재선언하여 기능을 재정의하면 된다. 이를 오버라이딩이라고 한다.

추상 클래스

 상위 클래스의 기능 선언을 보류해두고 하위 클래스에서 선언하고 싶을 경우, 추상 클래스를 사용할 수 있다. 추상 클래스란 상위 클래스에서 하위 클래스에 메소드 구현을 강요하여 하위 클래스에서 구현하지 않을 경우 에러를 발생시킨다. 추상 클래스를 사용하기 위한 코드는 아래와 같다.

from abc import ABCmeta
from abc import abstractmethod

class 상위클래스명(metaclass=ABCmeta):

    @abstractmethod
    def 함수명(self):
        pass

class 하위클래스명(상위클래스명):

    def 함수명(self):
        print('Hello')

반응형