파이썬/기본문법

파이썬 클래스 만들기 및 클래스 상속 받기

코데방 2024. 2. 16.
728x90

파이썬 클래스 만들기

 

클래스 만들기 또한 간단합니다.

 

 

1. 클래스 선언을 해줍니다. 한 줄이면 됩니다. 

 

# 학생 클래스
class Student:

 

 

 

 

2. 클래스 객체가 가지고 있을 데이터가 있다면 생성자로 매개변수를 받아줍니다.

 

생성자라는건 클래스를 이용해 객체 인스턴스를 만들 때의 초기값이라고 생각하면 됩니다. 

파이썬의 경우 "__init__()" 메소드를 이용해 만들어주면 됩니다.

 

클래스 내부의 모든 메소드의 첫 매개변수는 "self"를 넣어줘야 합니다.

클래스 내부에서 자기 자신을 지칭하는 용도입니다. 

클래스가 가질 "self.변수"에다가 매개변수로 받은 변수들을 넣어주면 됩니다. 

물론 바로 넣지 않고 필요한 만큼 변형을 해서 넣어도 됩니다.

# 학생 클래스
class Student:
    # 초기 생성자 메소드
    # Student 클래스(객체)의 인스턴스 생성 시 입력해주는 매개변수
    def __init__(self, name, gender, grade):
        self.name = name
        self.gender = gender
        self.grade = grade

 

 

 

 

3. 클래스 객체가 가질 기능인 메소드를 입력해줍니다. 

 

일반적인 함수를 만들 듯이 클래스 내부에 함수를 만들어주면 됩니다.

보통 클래스 내에서 사용하는 함수를 메소드라고 부릅니다.

 

# 학생 클래스
class Student:
    # 초기 생성자 메소드
    # Student 클래스(객체)의 인스턴스 생성 시 입력해주는 매개변수
    def __init__(self, name, gender, grade):
        self.name = name
        self.gender = gender
        self.grade = grade

    # 학생 정보 출력하기 메소드
    def info_student(self):
        print(f"이름 : {self.name}, 성별 : {self.gender}, 학년 : {self.grade}")

    # 학생 이름 바꾸기 메소드
    # self는 인스턴스 생성 시 들어온 변수
    # new_name은 메소드 호출 시 새로 입력해주는 변수
    def strudent_name_change(self, new_name):
        old_name = self.name  # 기존 이름 저장
        self.name = new_name  # 새로운 이름으로 바꿔줌
        print(f"{old_name}이 {new_name}로 변경되었습니다.")

 

 

 

 

4. 인스턴스 만들어 사용하기

 

클래스를 이용해 내용을 넣어 실제로 만들어진 객체를 인스턴스라고 부릅니다.

 아래와 같이 사용해주면 됩니다. 클래스 내부 모든 메소드의 매개변수에는 "self"를 넣어줍니다. 

 

타입 지정이 없어서 나중에 보면 헷갈릴 수 있으니 주석을 잘 달아두는 것이 좋을 것 같습니다. 

 

# Student 클래스 객체의 인스턴스 생성
student1 = Student("코데방", "남", 2)

# 학생 정보 출력 메소드 호출
student1.info_student()

# 학생 이름 바꾸기 메소드 호출
student1.strudent_name_change("퐈이어")

 

 

 

 

 

파이썬 클래스 상속 받기

 

곰인형이 하나 있다고 치면 곰 몸통을 하나의 클래스로 만들고, 몸통은 같되 팔다리가 다른 여러 인형들을 만들 수 있을 것입니다.

 

이 때 몸통이 부모 클래스고 이것을 가져와(상속받아) 팔다리를 붙인 클래스를 자식 클래스라고 볼 수 있습니다.

부모 클래스(몸통) 부분이 바뀌면 상속받은 모든 클래스의 공통된 부분이 바뀌기 때문에 인형 갯수가 많아질 수록 상속으로 인한 관리 효율이 좋아질 것입니다.

 

위의 학생 클래스를 상속받아 학생들의 가족 정보를 관리하는 클래스를 만들어보면 아래와 같이 만들 수 있습니다.

 

 

 

1. 먼저 상속 클래스를 선언합니다. 그냥 클래스 선언에 괄호치고 부모 클래스를 적어주면 됩니다.

 

# Student 클래스를 상속받는 자식 클래스 
class Student_Familly(Student):

 

 

 

 

2. 마찬가지로 생성자를 만들어줍니다.

 

일반 클래스와 조금 다른건 부모 클래스의 생성자를 그대로 호출해서 사용하고, 자식 클래스에서 추가로 받을 매개변수를 다시 "self"를 이용해 저장해주면 된다는 점입니다. 

 

# Student 클래스를 상속받는 자식 클래스
class Student_Familly(Student):
    def __init__(self, name, gender, grade, mother_name, father_name):
        Student.__init(self, name, gender, grade) # 부모 클래스 생성자 호출
        
        # 자식 클래스에서 추가로 받을 매개변수 저장
        self.mother_name = mother_name
        self.father_name = father_name

 

 

 

 

3. 추가로 사용할 메소드를 생성해줍니다.

 

나머지는 일반 클래스와 같습니다. 필요한 메소드를 추가해주면 됩니다.

 

# Student 클래스를 상속받는 자식 클래스 (부모이름까지 추가할 수 있음)
class Student_Familly(Student):
    def __init__(self, name, gender, grade, mother_name, father_name):
        Student.__init__(self, name, gender, grade)  # 부모 클래스 생성자 호출

        # 자식 클래스에서 추가로 받을 매개변수 저장
        self.mother_name = mother_name
        self.father_name = father_name

    # 학생 이름 치면 부모님 정보 출력하는 메소드
    def student_familly_info(self, student_name):
        print(
            f"{self.name} 학생의 엄마는 {self.mother_name}이고, 아빠는 {self.father_name}입니다."
        )

 

 

 

 

4. 자식 클래스 인스턴스 생성 및 메소드 사용

 

이제 "Sudent" 클래스를 상속받은 "Student_Familly" 라는 클래스의 인스턴스를 생성하면 두 클래스의 모든 기능을 사용할 수 있게 됩니다.

 

# Student_Familly 클래스 객체의 인스턴스 생성
student = Student_Familly("코데방", "남", 2, "코엄마", "코아빠")

# 부모 클래스가 가진 메소드 호출해보기 (학생 정보)
print("\n부모클래스 메소드")
student.info_student()

# 자식 클래스가 가진 메소드 호출해보기 (부모 정보)
print("\n자식 클래스 메소드")
student.student_familly_info("코데방")

 

 

 

 

 

기타) 오버라이딩 

 

부모 클래스에 있는 메소드를 자식 클래스에서 수정할 수도 있습니다.

메소드를 덮어쓴다고 해서 "오버라이딩" 이라고 부릅니다. 

 

그냥 자식클래스에서 부모클래스에 있는 메소드와 같은 이름의 메소드를 만들면 해당 메소드가 호출됩니다.

수정이 되지 않거나 접근이 불가능한 클래스를 상속 받아 조금 고쳐쓰고 싶다거나 할 때 사용하면 됩니다. 

 

 

 

기타 ) 부모 클래스 생성자 호출 시 super() 사용

 

비쥬얼 스튜디오 코드에서 상속 클래스를 만들 때 생성자 자동 완성이 되면 부모 클래스의 생성자를 호출할 때 "super()"를 사용합니다.

 

"부모클래스이름.__init__():" 과 다른건 없지만 "super()"를 사용할 때는 매개변수에 "self"를 넣지 않습니다. 

게다가 아래에서 다룰 다중 상속 시에도 "super()"를 사용한 생성자 호출은 여러 클래스의 생성자를 동시에 호출할 수 없어 사용하기 힘들다는 단점이 있습니다.

 

개인적으로는 굳이 헷갈리게 "super()"를 사용하지 않고 모든 클래스의 형식을 통일시키는 것이 가시성 측면에서 좋지 않을까 생각합니다. 

 

class Bear(Bear_body, Bear_head):
    def __init__(self, color, size):
        super().__init__(color, size)
        
        #super()의 경우 첫 번째 상속 클래스의 생성자만 호출할 수 있음

 

 

 

 

파이썬 클래스 다중 상속

 

 

자식 클래스를 만들 때 여러 부모 클래스로부터 상속을 받을 수 있습니다.

곰인형 몸통을 만드는 클래스와 머리를 만드는 클래스를 상속받아 팔다리만 붙이면 인형이 완성되겠죠.

 

괄호안에 상속 받을 클래스들을 적어주고 생성자에서 각각의 클래스 생성자만 호출해주면 됩니다. 

 

 

* 주의사항)

다중 상속 구조에서 부모 클래스가 겹치면 아래와 같은 오류가 납니다.

Cannot create consistent method orderingPylance
TypeError: Cannot create a consistent method resolution
order (MRO)



"class A, B(A를 상속), C(A,B를 상속)" 이런 구조로 다중 상속을 한다면, 이미 B 안에 A가 들어있기 때문에 C에서 A,B를 다중 상속한다는 것은 A가 두 번 중복된다는 뜻이죠. 따라서 위와 같은 에러가 납니다. 

 

 

 

 

다중 상속은 아래와 같이 간단히 사용할 수 있습니다. 

그냥 상속과 같고 생성자만 여러 번 호출을 잘 해주면 됩니다. 

# 곰돌이 몸통 클래스
class Bear_body:

    # 몸통 클래스 생성자
    def __init__(self, color, size):  # 몸통 색깔과 사이즈
        self.color = color
        self.size = size

    # 몸통 정보 알려주는 메소드
    def info_bear_body(self):
        print(f"몸통 색상은 {self.color}, 사이즈는 {self.size} 입니다.")


# 곰인형 머리 클래스
class Bear_head:
    # 머리 클래스 생성자
    def __init__(self, head_color, head_size):  # 머리 색깔, 사이즈
        self.head_size = head_size
        self.head_color = head_color

    # 머리 정보 알려주는 메소드
    def info_bear_head(self):
        print(f"머리 색상은 {self.head_color}, 사이즈는 {self.head_size} 입니다.")


# 곰인형 팔다리 붙여서 완성된 클래스 (몸통, 머리 클래스 상속)
class Bear(Bear_body, Bear_head):
    def __init__(self, color, size, head_color, head_size, leg, arm):
        Bear_body.__init__(self, color, size)  # 몸통 클래스 생성자 호출
        Bear_head.__init__(self, head_color, head_size)  # 머리 클래스 생성자 호출

        # 추가로 받은 매개변수 저장
        self.leg = leg
        self.arm = arm

    # 곰인형 정보 최종 출력
    def info_bear(self):
        Bear_body.info_bear_body(self)  # 몸통 정보
        Bear_head.info_bear_head(self)  # 머리 정보
        print(f"다리는 {self.leg}, 팔은 {self.arm}. 다 달려있네요~")
        
        
# 곰인형 인스턴스 생성 후 정보 조회
bear = Bear("갈색", "Large", "노란색", "Samll", "다리다리", "팔팔")
bear.info_bear()

728x90

댓글

💲 추천 글