본문 바로가기
Tech Stack/Python

클래스

by jaeaemin 2021. 7. 30.

절차지향 프로그래밍 방식과 달리 객체지향 프로그래밍은 객체를 정의하는 것에서 시작한다.

클래스를 이용하면 생성하는 것은 새로운 타입을 생성하는 것이라고 하기도 한다. 앞서 배운 정수, 실수, 문자열 등 기본 자료형 & 자료구조 모두 클래스를 통해 만들어진 타입이다. 

파이썬에서는 함수도 객체로 처리하며 함수에 대해 type()함수를 사용하면 <class 'function'>이. 출력되는 것을 확인할 수 있다.

 

클래스 선언 
class 클래스이름:

선언된 클래스에 대해서 객체를 생성하기 위해서는 할당할 변수에 클래스를 연결해주면 된다. 클래스를 정의한다는 것은 새로운 데이터 타입을 정의한 것이기 때문에 실제로 사용하기 위해서는 인스턴스를 통해서 사용할 수 있다.

 

인스턴스 생성
class Car :
   pass 

hyundai = Car()
kia = Car()

위의 예제에서 Car 클래스를 할당받아서 Car()의 결과값을 돌려받은 현대와 기아가 Car의 객체이다.

이렇게 생성된 인스턴스는 Car의 인스턴스로 각각 설정한 변수이름으로 메모리에 할당되게 된다.

 

<객체와 인스턴스에 차이에 대해서 알아보자.>

클래스로 만든 객체를 인스턴스라고 한다. 쉽게 설명하면 kia = Car()에서 kia는 객체이다. 그리고 kia 객체는 Car클래스의 인스턴스이다. 

즉, 인스턴스는 특정 객체가 어떤 클래스의 객체를 받아들였는지 관계를 표현할 때 사용한다. 

" kia는 객체이며 kia는 Car클래스의 인스턴스이다. "

 

 

 

 

클래스 메서드

 

클래스 내부에 메서드를 설정하면 각 인스턴스에서 메서드를 사용할 수 있다. 정의할 때는 일반적인 정의와 마찬가지로 def를 사용한다. 

>>> class Car:
def set_info(self, name, price):
self.name = name
self.price = price


예제에서의 메서드 내부는 인자로 전달된 name, price값을 self.name, self.price에 바인딩(변수 대입)하는 것을 확인 할 수 있다. 

메서드 인자로 전달된 변수 name, price를 새롭게 클래스 변수에 가리키던 값들을 바인딩 하는것이다.

 

 

 

 

 

클래스 인스턴스 메서드 접근 

 


sonata = Car()        # 클래스 인스턴스 sonata생성
sonata.set_info('SONATA', '200000')

 

Car() 클래스안에 클래스 변수 sef_info함수에 인자를 추가하여서 호출하여서 인자값들을 self.name, self.price로 바인딩했다. 

이 대 self.xxx라는 형태를 인스턴스 변수라고 하고 클래스 인스턴스 내부 변수를 의미한다.  인스턴스 변수에 접근하기 위해서는 인스턴스 이름과 함께 변수명을 사용하여 접근할 수 있다.  ( 인스턴스 명 . 변수 명 )

 

>>> sonata.name
'SONATA'
>>> sonata.price
 
'200000' 

 

 

 

 

생성자 

 

객체가 생성될 때 자동으로 호출되어지는 메서드로, 초기값을 설정하거나 객체가 초기화 될 때 어떤 함수의 실행이 필요한 경우 생성자를 사용한다.

파이썬에서는 객체에서 __init__이라는 키워드를 통해 생성자 메서드를 나타내고 있다. 

 

>>>class Car
                  def __init__(self):
                          print("띄뛰 빵빵~~")


>>> my_car = Car()
 띄뛰 빵빵~~

 

클래스 내에 정의된 메서드는 클래스 공간에 저장된다. 따라서 모든 객체에 의해 참조(사용 또는 호출) 될 수 있다. 

 

Car  ( 클래스 ) {"__init__": function}.      - car의 메모리
my_car (인스턴스)                                             - my_car 인스턴스 메모리

 

따라서 클래스로부터 생성된 인스턴스의 개수를 셀 때, 모든 인스턴스가 참조할 수 있는 공간인 클래스에 저장할 수 있다.

클래스 내부 변수(self변수 아님)를 __init__ 함수에서 초기화를 시키면 인스턴스가 생성될 때 마다 클래스 내부 함수가 실행되고 클래스 변수가 카운팅 된다.

class MyClass:
count =
0

def __init__(self):
        MyClass.count +=
1
def get_count(self):
        return MyClass.count


a = MyClass()
b = MyClass()
c = MyClass()

print(a.get_count())    
     "3"     클래스 변수인 MyClass.count가 출력됬다. 

print(MyClass.count)
     "3"

 

즉 클래스 변수와 클래스 메서드는 모든 객체 인스턴스에서 공유할 수 있고,

 a.MyClass.count          b.MyClass.count           MyClass.count  세 가지 변수 동일한 변수로 같은 메모리를 공유한다.

이유는 위의 표와 마찬가지로 클래스가 위치하는 메모리 안에 변수를 할당하기 때문에 클래스 메모리를 가져와 콜하기 때문이다. 

 

 

 

 

 

상속

 

상속은 기존 클래스를 변경하지 않고 기능을 추가하거나 기존 기능을 변경하기 위해 사용한다. 기존 클래스가 라이브러리 형태로 제공되어 수정이 허용되지 않는다면 상속을 사용해서 알맞는 클래스를 만들고 이를 활용할 수 있다.

 

파이썬에서도 클래스의 상속이 가능하다. 클래스를 상속하기 위해서는 클래스 이름 뒤 괄호 안에 상속할 클래스 이름을 넣어주면 된다.

 

        class 클래스 이름 ( 상속할 클래스 이름 )

 

 

>>>class Elc_car(Car)

                  def Sound(self):
                          print("븨우우우우웅~~")

 

 

 

 

메소드 오버라이딩

 

상속 후에 클래스 내 함수를 추가하는 것도 가능하지만 이미 만들어진 함수를 다시 작성하는 것도 가능하다

부모 클래스에 존재하는 메서드를 동일한 이름으로 다시 만드는 것을 메서드 오버라이딩이라고 한다. 이렇게 오버라이딩 후 객체 인스턴스에서 함수를 호출하면 오버라이딩 된 메서드가 호출되게 된다.

 

Ev6 = Elc_car()

Ev6.sound()
"븨우우우우웅~~"

 

 

 

 

 

추상 클래스

 

 이름만 존재하는 클래스로 메서드만 정의하고 이를 상속 받은 클래스가 해당 메서드를 반드시 구현하도록 강제한다. 

 

from abc import *
class Car(metaclass=ABCMeta):
        @abstractmethod                         #추상 메서드 표시
        def drive(self):
                pass

 class Sonata(Car):
        def drive(self):                                #추상 메서드이므로 구현하지 않으면 객체 생성시 오류 발생 
                print("뛰뛰빵빵!!!")

sonata = Sonata()

 

 

 

 

매직 메서드

반응형

'Tech Stack > Python' 카테고리의 다른 글

패키지  (0) 2021.08.03
모듈  (0) 2021.08.02
입출력  (0) 2021.07.29
파일  (0) 2021.07.27
함수  (0) 2021.07.26