클래스 상속

JunD·2023년 11월 17일
  • java나 python등 프로그래밍 언어를 다룰 때 간단한 코드 정도는 굳이 클래스를 만들지 않고도 동작 가능하지만,

  • 복잡한 코드에서 클래스를 여러 개 만들어 사용할 때 여러 attiribute를 중복해서 사용하는 경우엔 굳이 하나씩 재선언 할 필요도 없고 좀 더 깔끔하게 코드를 작성할 수 있다.

  • 중복하여 속성을 사용하기 위해 상위 클래스의 속성을 가져와서 쓸 수 있는 것을 상속이라고 일컫는다.



Class 상속

예시 코드 1 (부모 클래스)


class overwatch:
    def __init__(self, name, HP):
        self.name = name
        self.HP = HP
        
    def get_name(self):
        print(f'영웅 이름 : {self.name}')
        
    def get_HP(self):
        print(f'영웅 HP: {self.HP}')
  • 위 코드는 오버워치 게임의 영웅별 이름, 체력을 입력 후 반환할 수 있다.

  • 오버워치에선 영웅이 탱커, 딜러, 힐러 세 종류의 포지션으로 나눠진다.

  • 앞서 언급했듯이 클래스를 상속하지 않으면 포지션 별 클래스 생성시 계속 변수를 중복해서 코딩해야하는 불편함이 존재한다.

이를 어느정도 해결하기 위해 super()를 사용한다


예시 코드 2 (자식 클래스)


class healer(overwatch):  # 괄호 안에 상속 받을 부모 클래스 
    def __init__(self, name, damage, HP, heal):  
        super().__init__( name, damage, HP)
        self.heal = heal
        
class dealer(overwatch):  
    def __init__(self, name, damage, HP, deal):  
        super().__init__( name, damage, HP)
        self.deal = deal
        
class tanker(overwatch):  
    def __init__(self, name, damage, HP, tank): # tank는 방볍 체력  
        super().__init__( name, damage, HP)
        self.tank = tank

  • overwatch 클래스(부모)의 __init__() 매직 메소드만 가져와서,
    딜러 / 힐러 / 탱커 (자식 클래스) 클래스 선언에선 name과 HP를 따로 선언할 필요가 없다.


변수의 개수 여러 개일 때 선언하는 방법

  • 현재 예시 코드에서는 name 과 HP 2개의 변수만 사용하여 직접 입력 하였지만, 실제 코드를 구성할 때는 수많은 변수를 사용할 수 있다.

  • 변수의 개수가 많을 시에는 아래 두 방법으로 여러 변수를 대체할 수 있다.

    1. *args
    2. **kwargs

방법 1) *args

  • args는 arguments의 약자

예를 들어 보자

def game_name(player, *names):
    print(player)
    for name in names:
        print(name)

        
player = '나'
name1 = '스타크래프트'
name2 = '롤'
name3 = '오버워치'
name4 = '서든어택'

game_name(player, name1,name2, name3, name4)

위 코드를 실행하면 아래와 같이 잘 동작하는 결과를 얻을 수 있다.


하지만, 만약 game_name(*names, player)라고 순서를 바꿔쓰면 어떻게 될까?

def game_name(*names, player,):
    print(player)
    for name in names:
        print(name)

        
player = '나'
name1 = '스타크래프트'
name2 = '롤'
name3 = '오버워치'
name4 = '서든어택'

game_name(player, name1,name2, name3, name4)

아래와 같이 오류가 발생한다.

파이썬은 어떤 변수에서 부터 어느 변수까지 *로 처리하는 지 알아서 모르기 때문에 묶이지 않는 변수와 선언할 때는 해당 변수 뒤에 선언을 해주어야 동작한다. (즉, 순서에 주의!)



방법 2) **kwargs

  • **kwargs는 keyword arguments의 약자로, key, value의 딕셔너리 형태로 함수에 전달된다.

    아래 예시를 보자

 def name(**kwargs):
    for key, value in kwargs.items():
        if 'kim'  ==  key:
            print(f'김씨가 {value}라고 말했습니다.')
            print( )
        else:
            print(f'{key}씨가 {value}라고 말했습니다.')
        
name(kim = '안녕하세요')
name(jun = '안녕히가세요')
 

결과는 아래와 같이 나온다

즉, 방금 언급했듯 함수 안의 값을 딕셔너리의 형태로 받는다



  • 추가로, *와 **도 매개변수 순서가 중요!
  • help(함수명)틍 통해 넣어야 하는 순서 확인 가능


정리

  1. 부모 클래스는 상속을 통해 보다 더 효율적으로 사용 가능

  2. __init__()매소드를 상속받기 위해 super().__init__()과 같이 사용 가능

  3. 함수 또는 클래스 내 인자 전달 시 *args, **kwargs 방식으로 전달 가능

  4. *args는 튜플 형태, **kwargs는 딕셔너리 형태로 값을 참조할 수 있다.

  5. 변수 / *변수 / **변수 입력 순서도 결과에 영향을 주니 주의하여 사용

profile
Data Scientist & Data Analyst

0개의 댓글