[코딩자율학습단] 나도코딩의 파이썬 입문 4주차




클래스 형식

class 클래스명:

    def 메서드명1(self, 전달값1, 전달값2, . . . ):

        실행할 명령1

        실행할 명령2

        . . .


    def 메서드명2(self, 전달값1, 전달값2, . . . ):

        실행할 명령1

        실행할 명령2

        . . .


매서드(method)

클래스 안에 정의하는 함수

일반 함수와 다르게 첫 번째 전달값 위치에는  self라고 넣는다.


인스턴스 변수

메서드 안에 정의한 변수 (클래스 안에서 사용하는 변수)

self.변수명 = 값


객체와 인스턴스는 사실 같은 개념이다. 객체를 만드는 것은 결국 클래스의 인스턴스를 만드는 것이다. 보통 객체를 단독으로 부를 때는 객체로, 클래스와 연결지어 부를 때는 인스턴스로 표현한다.


생성자 : __init__()

사용자가 따로 호출하지 않아도 객체를 생성할 때 자동으로 호출되는 메서드

객체를 생성할 때 생성자가 자동 호출되므로 self를 제외한 나머지 생성자의 전달값 개수만큼 값을 전달해야 한다.

만약 클래스에 따로 생성자를 정의하지 않았다면 전달값 없이 클래스명만으로 객체를 생성하면 된다.





코드를 작성할 때 문장이 너무 길어서 한 줄로 표현하기 어렵거나 보기 좋게 두 줄 이상으로 나눠 적으려면 나누려는 부분에 역슬래시(\)를 넣고 줄 바꿈을 한다. 그러면 실행했을 때 한 문장으로 인식한다.


상속(inheritance)

한 클래스의 내용을 다른 클래스가 물려받아 사용하는 것

다른 클래스로부터 상속받을 때는 클래스명 뒤에 소괄호를 적고 상속받을 클래스명을 명시하면 된다. 이 때 두 클래스는 실생활에서 자식이 부모로부터 상속받는 관계와 비슷해서 자식 클래스와 부모 클래스라고 표현한다.

부모 클래스의 __init__() 생성자를 호출하는 방식으로 코드를 간소화할 수 있다. 이 때  self도 함께 넘겨 줘야 한다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 일반 유닛
class Unit:
    def __init__(self, name, hp):
        self.name = name
        self.hp = hp
 
# 공격 유닛
class AttackUnit(Unit):
    def __init__(self, name, hp, damage):
        Unit.__init__(self, name, hp)
        self.damage = damage
        
    def attack(self, location):
        print("{0} : {1} 방향 적군을 공격합니다. [공격력 {2}]"\
            .format(self.name, location, self.damage))
        
    def damaged(self, damage):
        print("{0} : {1}만큼 피해를 입었습니다.".format(self.name, damage))
        self.hp -= damage
        print("{0} : 현재 체력은 {1}입니다.".format(self.name, self.hp))
        if self.hp <=0:
            print("{0} : 파괴됐습니다.".format(self.name))
cs



다중 상속 (multiple inheritance)

클래스를 2개 이상 상속받는 것

쉼표로 구분해 부모 클래스명을 나열하면 된다.

class 자식 클래스(부모 클래스1, 부모 클래스2, . . .):


메서드 오버라이딩(메서드 재정의, method overriding)

상속 관계일 때 자식 클래스에서 부모 클래스에 정의한 메서드를 그대로 사용하지 않고 같은 이름으로 메서드를 새롭게 정의해 사용하는 방법

메서드 오버라이딩할 때는 부모 클래스에 정의한 메서드를 그대로 자식 클래스에서 동일한 이름과 전달값으로 정의하고, 메서드 동작만 원하는 대로 변경하면 된다.


동작 없이 일단 넘어가기 : pass

아무것도 하지 않고 일단 그냥 넘어간다.

다른 작업을 먼저 하고 나서 나중에 코드 작성

continue와 break의 역할


부모 클래스 호출하기 : super()

클래스에서 이름을 직접 적지 않고도 부모 클래스에 접근하는 방법

상속하는 부모 클래스의 메서드를 사용할 때

단, super()를 사용하는 문장에서는 self를 함께 사용하지 않음을 주의

다중 상속을 받은 클래스에서  super()로 부모 클래스에 접근할 때는 순서상 가장 먼저 상속받은 클래스에 접근하게 된다. 그러므로 다중 상속을 할 때 모든 부모 클래스의 생성자를 호출하려면 super()를 사용하지 않고 각 부모 클래스의 이름을 명시해서 접근해야 한다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 공격 유닛
class AttackUnit(Unit):
    def __init__(self, name, hp, damage, speed):
        Unit.__init__(self, name, hp, speed)
        self.damage = damage
        
    def attack(self, location):
        print("{0} : {1} 방향 적군을 공격합니다. [공격력 {2}]"\
            .format(self.name, location, self.damage))
        
 
# 보병 유닛
class Soldier(AttackUnit):
    def __init__(self):
        AttackUnit.__init__(self"보병"4051)
 
cs



왜 __ init__에서 매개변수가 1개 일까?

Soldier 클래스의 __init__ 메서드는 추가적으로 외부 입력이 필요 없는 간단한 초기화를 수행한다.

AttackUnit 클래스의 __init__ 메서드는 클래스의 생성자가 객체를 초기화할 때 추가적인 데이터를 외부에서 입력바다야 하기 때문에 여러 매개변수를 사용한다.

AttackUnit : 다양한 유닛을 생성할 수 있도록 설계되었다. 이름, 체력, 공격력, 속도 등 각기 다른 유닛 속성을 초기화할 수 있어야 하므로 여러 매개변수를 받는다.

Soldier : 특정 유닛(보병)만 생성하는 역할을 하며, 속성이 고정적이다. 추가 입력 없이도 객체를 초기화할 수 있으므로 self 만 사용한다.







댓글 쓰기

다음 이전

POST ADS1

POST ADS 2