기본적으로 Python이라는 언어는 객체지향(Object Oriented) 프로그래밍 언어이다.
꼭 해당 종류의 언어만 속하는 건 아니지만, 여기서는 OOP 언어인 것만 알고가자.
객체지향(Object Oriented) 프로그래밍 언어의 특징은 프로그램을 여러 개의 독립된 객체들의 모임으로 구성된 것으로 인식한다는 점이다. 그로 인해 각각의 객체는 메시지를 주고 받으며 데이터를 처리하는 방식으로 이뤄진다.
클래스(Class)는 특정 객체를 생성하기 위해 속성(변수)과 기능(메소드)을 정의하는 틀의 역할을 하는 것을 말한다. ex) 붕어빵 틀
객체(Object)는 클래스를 기반으로 만들어진 실제 사물을 말한다. ex) 붕어빵
공통된 속성과 기능에 모아서 클래스를 정의한 뒤 필요에 따라 객체를 생성해서 사용하면 공통적으로 필요한 프로그램 코드를 중복 작성할 필요가 없음!
그럼, 파이썬에서는 클래스를 어떻게 사용할까?
파이썬에서는 클래스를 사용하려면 아래의 구조를 가지고 있다.
class 클래스 이름:
멤버 변수
def __int__(self, 매개변수들): 초기화
… (Initializer)
def __del__(self, 매개변수들): 소멸자
…
def 메소드이름(self, 매개변수들): 메소드
기본적으로 다른 OOP 언어와 동일하게 의미를 두고 있으므로 잘 모르겠다면 찾아보도록 OOP 언어를 깊게 찾아 보자! (현재는 다른 OOP 언어를 배웠다고 가정하고 글을 쓰고 있다.)
인스턴스(Instance)는 클래스를 기반으로 실제 생성된 객체를 말한다.
이를 사용하는 방법은 아래와 같다.
class Car1:
model = "SM3"
price = 2000
def sale(self, price):
self.price = self.price - price
new_car1 = Car1() # 인스턴스 생성
new_car1.price = 1500 # 인스턴스의 멤버 변수 참조
new_car1.sale(200) # 인스턴스의 메소드 실행
self 인자를 사용함.self가 되어야 함.self.라는 인자를 적어야 함. 멤버 변수의 직접적인 접근을 차단하는 기능을 한다. 메소드에서 허용하는 방법으로만 멤버 변수의 접근을 허용하여 논리적인 오류를 방지하고 객체의 안정성을 높인다.
아까의 예제에서 설명하자면,
class Car1:
model = "SM3"
price = 2000
def sale(self, price):
self.price = self.price - price
new_car1 = Car1() # 인스턴스 생성
new_car1.price = 1500 # 인스턴스의 멤버 변수 참조
new_car1.sale(200) # 인스턴스의 메소드 실행
여기서 멤버 변수인 price값을 접근하여 가져오고 싶다면 어떻게 해야될까?
price = new_car1.price
이렇게 직접적으로 가져오면 될까? NO!!
멤버 변수의 값을 참조할 때는 멤버 변수를 직접 참조하는 것이 아니라 메소드를 이용하여 참조하게 하여야 함 => 정보 은닉 기능
class Car1:
model = "SM3"
price = 2000
def sale(self, price):
self.price = self.price - price
# 메소드 추가
def get_price(self):
return self.price
new_car1 = Car1()
new_car1.price = 1500
new_car1.sale(200)
print(new_car1.get_price()) # 메소드를 사용하여 멤버 변수의 값을 가져온다.
이미 만들어진 클래스의 멤버 변수와 메소드를 그대로 이어 받아서 필요한 부분만 재정의하거나 새로운 클래스를 만드는 것을 말한다.
상속을 해주는 클래스 : 부모 클래스, 슈퍼 클래스, 상위 클래스라는 용어로 불림.
상속을 받는 클래스 : 자식 클래스, 서브 클래스, 하위 클래스라는 용어로 불림.
# 단일 상속
class Dad():
def sing(self):
print("노래를 잘한다.")
class Child(Dad): #Dad 클래스를 상속 받는다.
def dance(self):
print("춤을 잘 춘다")
c = Child()
c.sing()
c.dance()
해당 코드를 이해하기 쉽게 그림으로 표현해보았다.

# 단일 상속
class Dad():
def sing(self):
print("노래를 잘한다.")
class Mom:
def math(self):
print("수학을 잘 한다.")
class Child(Dad): #Dad 클래스를 상속 받는다.
def dance(self):
print("춤을 잘 춘다")
c = Child()
c.sing()
c.math()
c.dance()
해당 코드를 이해하기 쉽게 그림으로 표현해보았다.

OOP 언어에서 가장 중요한 개념일지도 모른다.
Overriding은 자식 클래스에서 부모 클래스에 있는 메소드를 다시 정의하여 부모 클래스에 있는 메소드와 다른 기능을 하도록 하는 것이다. 일종의 기능을 upgrade 시킨다고 말할 수 있다.
class Dad():
def sing(self):
print("노래를 잘 한다.")
class Child(Dad): #Dad 클래스를 상속 받는다.
def sing(self):
super().sing() # 부모 클래스의 sing을 호출
print("랩을 잘 한다.")
c = Child()
c.sing()
>>>
노래를 잘 한다.
랩을 잘 한다.
해당 코드를 이해하기 쉽게 그림으로 표현해보았다.

뛰어난 글이네요, 감사합니다.