Understanding Inheritance of classes

1️⃣ 클래스 상속의 정의 (Definition of Class Inheritance)
2️⃣ 클래스 상속의 사용 (Usage of Class Inheritance)
3️⃣ 클래스의 생성자 사용 (Using Class Constructors)
4️⃣ 부모 클래스 정의 (Defining Super Classes)
5️⃣ 자식 클래스 정의 (Defining Sub Classes)
6️⃣ 클래스 상속의 사용 (Applying Class Inheritance)
7️⃣ 메소드 오버라이딩 (Method Overriding)
8️⃣ 부모 메서드 호출 (Calling Parent Methods)
1️⃣ 클래스 상속의 정의
(Definition of Class Inheritance)
클래스는 상속을 통해 부모 클래스의 속성을 모두 가지고 올 수 있다.
부모 클래스를 superclass라고 하고, 자식 클래스를 subclass라고 한다.
메소드 오버라이딩 기법을 통해 메서드를 자식 클래스에서 재정의 할 수 있다.
클래스의 상속이란 기존의 클래스의 속성과 메서드를 새로운 클래스가 물려받아 이를 재정의 및 재사용 하는 것을 뜻한다. 이를 통해 코드 재사용성과 확장성을 높일 수 있다.
2️⃣ 클래스 상속의 사용
(Usage of Class Inheritance)

부모 클래스 (Parent Class): Country
class Korea(Country): #물려 받고 싶은 클라스를 괄호()안에 쓴다.
pass #country에 없는 메소드는 이곳에 추가하여 기존의 클래스를 재사용
자식 클래스 (Child Classes): Korea, US
기존 클래스 Country의 속성을 물려받아 이를 재정의 및 재사용한다.

3️⃣ 클래스의 생성자 사용
(Using Class Constructors)
생성자(constructor)란 객체가 생성될 때 자동으로 호출되는 메서드를 의미한다. 주로 초기값을 설정할때 생성자를 사용한다. 파이썬 메서드명으로 __init__를 사용하면 이 메서드는 생성자가 된다. __init__ 메서드의 init 앞뒤로 붙은 __는 밑줄(_) 2개를 붙여 쓴 것이다.
class Korea(Country): #물려 받고 싶은 클라스를 괄호()안에 쓴다.
def __init__(self): #파라미터가 없을시엔 self만 써도 OK
print("생성자가 수행되었습니다.")

💡생성자가 parameter 개수를 맞추지 못할경우 아래와 같은에러가 발생한다.
💡생성자 parameter 규칙을 맞추며 클래스를 객체화해야 한다. (2번째)


4️⃣ 부모 클래스 정의
(Defining super Classes)
Country 클래스의 정의
class Country: #super class definition
name = '국가명'
population = '인구'
capital = '수도'
def show(self): #Country는 show라는 메소드를 가지고있다.
print('국가 클래스의 메소드입니다.') #show 메소드의 역할은 문자 display

5️⃣ 자식 클래스 정의
(Defining Sub Classes)
Country 클래스를 상속하여 Korea 클래스 만들기
class Korea(Country): #클래스를 사용할땐 첫글자를 대문자로 입력하여 함수와 구분
def __init__(self,name): #Korea 클라스가 Country를 상속받았기 때문에 생성자가
#만들어졌다. 매개변수는 name이다. 아래에 언급된 대한민국이 여기로 넘어온다.
self.name = name
def show_name(self):
print('국가 이름은 :', self.name)
6️⃣ 클래스 상속의 사용
(Applying Class Inheritance)
a = Korea('대한민국') #대한민국이라는 인자값은 생성자로 넘어가게된다.
a.show #이 메소드는 3.부모 클래스 정의되었기 때문에 "국가 ~입니다."가 결과값으로 뜸
국가 클래스의 메소드입니다.
a.show_name() #5.자식클래스에서 이미 정의된 메소드이다.
국가 이름은: 대한민국
a.capital #자식클래스에서 따로 정의하지 않았기때문에 결과는 그대로이다.
'수도'
a.name #자식클래스에서 '대한민국' 인스턴트 변수로 정의하였기 때문에 결과는 대한민국
대한민국
a.population() #자식클래스 확인후 변수가없다면 부모클래스의 객체를 따라간다.
'인구'

7️⃣ 메소드 오버라이딩
(Method Overriding)
부모 클래스의 메서드를 재사용하는 것을 뜻한다. 즉 부모클래스에서 이미 정의된 메소드를 조금 고쳐쓰고 싶을때 사용한다.
✅ 부모 클래스의 메서드를 재사용
class Korea(Country):
def __init__(self, name, population, capital)
self.name = name
self.population = population
self.capital = capital
def show(self): #부모클래스에서 물려받은 show더라도 기존의 클래스는 무효처리
print( #아래의 메소드가 유효한 메소드로 재정의 되었다.
"""
국가의 이름은 {} 입니다.
국가의 인구는 {} 입니다.
국가의 수도는 {} 입니다.
""".format(self.name, self.population, self.capital)
)
✅ 메소드 오버라이딩의 사용

a = Korea ('대한민국', 50000000, '서울') #파라미터 3 위의 def init보면 파라미터 3개
a.show() #재정의한 메소드가 수행되었다.
국가의 이름은 대한민국 입니다.
국가의 인구는 5000000 입니다.
국가의 수도는 서울 입니다.
8️⃣ 부모 메서드 호출
(Calling super Methods)
super() 키워드를 사용해서 부모 메서드를 호출할 수 있다.
class Korea(Country):
...생갹
def show(self): #메소드 오버라이딩시 부모클래스의 기능도 사용하고 싶을때 사용
super().show() #spuer는 부모클래스를 뜻함 .이후로 country의 메소드사용가
print(
"""
국가의 이름은 {} 입니다.
국가의 인구는 {} 입니다.
국가의 수도는 {} 입니다.
""".format(self.name, self.population, self.capital)
)
QUIZ




