Chapter 11. 객체지향 활용

IT 지식 / Python·2026.08.25
OBJECT ORIENTED PROGRAMMING
Chapter 11. 객체지향 활용
객체지향 프로그래밍의 다양한 개념과 활용 방법을 배웁니다.

11.1 상속(Inheritance)

상속(Inheritance)은 기존 클래스가 가지고 있는 변수와 메서드를 새로운 클래스가 물려받아 사용하는 기능입니다. 상속을 사용하면 기존에 작성한 코드를 다시 작성하지 않고 재사용할 수 있습니다.

기존 기능을 제공하는 클래스를 부모 클래스(Parent Class) 또는 상위 클래스(Super Class)라고 하며, 부모 클래스를 상속받아 새롭게 만들어지는 클래스를 자식 클래스(Child Class) 또는 하위 클래스(Sub Class)라고 합니다.

기본 문법
Python
class 부모클래스:
    내용

class 자식클래스(부모클래스):
    내용

자식 클래스 이름 뒤의 괄호 안에 부모 클래스 이름을 작성합니다.

부모 클래스와 자식 클래스
Python
class Member:
    def login(self):
        print("로그인합니다.")
    def logout(self):
        print("로그아웃합니다.")

class Admin(Member):
    def member_delete(self):
        print("회원을 삭제합니다.")

admin = Admin()
admin.login()
admin.member_delete()
admin.logout()
실행 결과
로그인합니다.
회원을 삭제합니다.
로그아웃합니다.

Admin 클래스에는 login()과 logout() 메서드를 작성하지 않았지만, Member 클래스를 상속받았기 때문에 두 메서드를 사용할 수 있습니다.

Admin 객체는 다음 메서드를 사용할 수 있습니다.

  • Member 클래스에서 상속받은 login()
  • Member 클래스에서 상속받은 logout()
  • Admin 클래스에서 작성한 member_delete()
여러 자식 클래스 만들기

하나의 부모 클래스를 여러 자식 클래스가 상속받을 수도 있습니다.

Python
class Member:
    def login(self):
        print("로그인합니다.")
    def logout(self):
        print("로그아웃합니다.")

class Admin(Member):
    def member_delete(self):
        print("회원을 삭제합니다.")

class User(Member):
    def write(self):
        print("게시글을 작성합니다.")

admin = Admin()
user = User()

admin.login()
admin.member_delete()

user.login()
user.write()
실행 결과
로그인합니다.
회원을 삭제합니다.
로그인합니다.
게시글을 작성합니다.

Admin과 User 클래스는 모두 Member 클래스를 상속받았기 때문에 login()과 logout() 메서드를 사용할 수 있습니다. 각 클래스는 자신의 역할에 맞는 기능도 추가로 가지고 있습니다.

  • Member
    • login()
    • logout()
  • Admin
    • member_delete()
  • User
    • write()
상속의 장점

상속을 사용하면 다음과 같은 장점이 있습니다.

  • 기존 코드를 다시 작성하지 않아도 됩니다.
  • 공통 기능을 부모 클래스에 한 번만 작성할 수 있습니다.
  • 중복 코드를 줄일 수 있습니다.
  • 프로그램을 쉽게 확장할 수 있습니다.
  • 클래스의 역할을 구분하여 관리할 수 있습니다.

예를 들어 학생과 사원에게 이름과 나이를 출력하는 공통 기능이 필요하다면 Person 클래스에 공통 기능을 작성할 수 있습니다.

Python
class Person:
    def introduce(self):
        print("자기소개를 합니다.")

class Student(Person):
    pass

class Employee(Person):
    pass

student = Student()
employee = Employee()

student.introduce()
employee.introduce()
실행 결과
자기소개를 합니다.
자기소개를 합니다.
실습 1

Vehicle 클래스를 작성하고 move() 메서드에서 다음 내용을 출력하시오.

Python
def move(self):
    print("이동합니다.")

Car 클래스가 Vehicle 클래스를 상속받도록 작성하시오.

Car 객체를 생성한 후 move() 메서드를 호출하시오.

실습 2

Person 클래스를 작성하고 hello() 메서드에서 다음 내용을 출력하시오.

Python
def hello(self):
    print("안녕하세요.")

Student 클래스와 Teacher 클래스가 Person 클래스를 상속받도록 작성하시오.

각 클래스의 객체를 생성하여 hello() 메서드를 호출하시오.

11.2 메서드 오버라이딩

메서드 오버라이딩(Method Overriding)은 부모 클래스에서 상속받은 메서드를 자식 클래스에서 다시 정의하는 것입니다. 부모 클래스의 기능을 그대로 사용하지 않고 자식 클래스에 맞게 변경할 때 사용합니다.

부모 메서드 재정의
Python
class Member:
    def menu(self):
        print("회원 메뉴를 실행합니다.")

class Admin(Member):
    def menu(self):
        print("관리자 메뉴를 실행합니다.")

admin = Admin()
admin.menu()
실행 결과
관리자 메뉴를 실행합니다.

Admin 클래스는 Member 클래스를 상속받았으며, 원래 Member 클래스에는 menu() 메서드가 있지만, Admin 클래스에서 같은 이름의 menu() 메서드를 다시 작성하였습니다. 따라서 Admin 객체에서 menu()를 실행하면 부모 클래스의 메서드가 아니라 자식 클래스의 메서드가 실행됩니다.

여러 클래스에서 오버라이딩하기

여러 자식 클래스가 같은 메서드를 각각 다르게 구현할 수도 있습니다.

Python
class Member:
    def menu(self):
        print("회원 메뉴를 실행합니다.")

class Admin(Member):
    def menu(self):
        print("관리자 메뉴를 실행합니다.")

class User(Member):
    def menu(self):
        print("일반회원 메뉴를 실행합니다.")

admin = Admin()
user = User()

admin.menu()
user.menu()
실행 결과
관리자 메뉴를 실행합니다.
일반회원 메뉴를 실행합니다.

Admin과 User 클래스는 모두 Member 클래스를 상속받았지만 menu() 메서드를 각각 다시 작성하였습니다. 따라서 객체에 따라 서로 다른 메뉴가 실행됩니다.

메서드 실행 순서

객체에서 메서드를 호출하면 파이썬은 다음 순서로 메서드를 찾습니다.

  1. 현재 객체의 클래스에서 메서드를 찾는다.
  2. 현재 클래스에 메서드가 없으면 부모 클래스에서 찾는다.
  3. 부모 클래스에도 메서드가 없으면 오류가 발생한다.
Python
class Parent:
    def hello(self):
        print("부모 클래스입니다.")

class Child(Parent):
    def hello(self):
        print("자식 클래스입니다.")

child = Child()
child.hello()
실행 결과
자식 클래스입니다.

Child 클래스에 hello() 메서드가 있으므로 부모 클래스의 메서드보다 먼저 실행됩니다.

자식 클래스에 메서드가 없는 경우
Python
class Parent:
    def hello(self):
        print("부모 클래스입니다.")

class Child(Parent):
    pass

child = Child()
child.hello()
실행 결과
부모 클래스입니다.

Child 클래스에 hello() 메서드가 없으므로 Parent 클래스의 메서드가 실행됩니다.

실습 3

Vehicle 클래스에 move() 메서드를 작성하시오.

Python
def move(self):
    print("이동수단이 이동합니다.")

Car 클래스가 Vehicle 클래스를 상속받도록 작성하시오.

Car 클래스에서 move() 메서드를 오버라이딩하여 다음과 같이 출력하시오.

Python
def move(self):
    print("자동차가 도로를 달립니다.")
실습 4

Shape 클래스에 draw() 메서드를 작성하시오.

Circle 클래스와 Rectangle 클래스가 Shape 클래스를 상속받도록 작성하시오.

각 클래스에서 draw() 메서드를 오버라이딩하여 다음과 같이 출력하시오.

Python
def draw(self):
    print("원을 그립니다.")
Python
def draw(self):
    print("사각형을 그립니다.")
11.3 super()

super()는 자식 클래스에서 부모 클래스의 생성자 또는 메서드를 호출할 때 사용합니다. 자식 클래스에서 부모 클래스의 기능을 완전히 변경하지 않고 기존 기능을 함께 사용하려면 super()를 사용합니다.

부모 생성자 호출
Python
class Person:
    def __init__(self, name):
        self.name = name

class Student(Person):
    def __init__(self, name, score):
        super().__init__(name)
        self.score = score

student = Student("홍길동", 90)

print(student.name)
print(student.score)
실행 결과
홍길동
90

super().__init__(name)은 Person 클래스의 생성자를 호출합니다. 부모 생성자에서 name을 저장하고, 자식 생성자에서 score를 추가로 저장합니다.

super()를 사용하지 않는 경우
Python
Person.__init__(self, name)

그러나 일반적으로는 다음과 같이 super()를 사용하는 것이 좋습니다.

Python
super().__init__(name)

super()를 사용하면 부모 클래스 이름이 변경되더라도 코드를 수정할 부분이 줄어듭니다.

부모 메서드 호출
Python
class Parent:
    def hello(self):
        print("안녕하세요.")

class Child(Parent):
    def hello(self):
        super().hello()
        print("반갑습니다.")

child = Child()
child.hello()
실행 결과
안녕하세요.
반갑습니다.

Child 클래스의 hello() 메서드가 먼저 호출됩니다. 그 안에서 super().hello()를 실행하여 부모 클래스의 hello() 메서드를 호출합니다. 그 후 자식 클래스의 나머지 코드가 실행됩니다.

super() 활용
Python
class Employee:
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary

    def print_info(self):
        print("이름 :", self.name)
        print("급여 :", self.salary)

class Manager(Employee):
    def __init__(self, name, salary, department):
        super().__init__(name, salary)
        self.department = department

    def print_info(self):
        super().print_info()
        print("부서 :", self.department)

manager = Manager("김부장", 5000000, "개발부")
manager.print_info()
실행 결과
이름 : 김부장
급여 : 5000000
부서 : 개발부

Manager 클래스는 Employee 클래스의 생성자와 print_info() 메서드를 재사용하고 부서 정보만 추가하였습니다.

실습 5

Person 클래스의 생성자에서 이름을 저장하시오.

Student 클래스가 Person 클래스를 상속받도록 작성하고 점수를 추가로 저장하시오.

super()를 사용하여 부모 클래스의 생성자를 호출하시오.

실습 6

Member 클래스에 다음 메서드를 작성하시오.

Python
def login(self):
    print("로그인합니다.")

Admin 클래스에서 login() 메서드를 오버라이딩하고 super()를 사용하여 부모 메서드도 함께 실행하시오.

실행 결과
로그인합니다.
관리자 권한을 확인합니다.
실습 7

Order 클래스에 다음 메서드를 작성하시오.

Python
def save(self):
    print("주문 정보를 저장합니다.")

OnlineOrder 클래스에서 save() 메서드를 오버라이딩하고 super()를 사용하여 부모 메서드도 함께 실행하시오.

실행 결과
주문 정보를 저장합니다.
결제 정보를 저장합니다.
11.4 다형성(Polymorphism)

다형성(Polymorphism)은 같은 이름의 메서드를 호출하더라도 객체에 따라 서로 다른 동작을 실행하는 특징입니다. 다형성에서 ‘다형’은 여러 가지 형태를 의미합니다.

상속과 메서드 오버라이딩을 이용하면 같은 메서드 이름으로 여러 객체를 다르게 동작시킬 수 있습니다.

같은 메서드, 다른 동작
Python
class Member:
    def menu(self):
        pass

class Admin(Member):
    def menu(self):
        print("관리자 메뉴를 실행합니다.")

class Seller(Member):
    def menu(self):
        print("판매자 메뉴를 실행합니다.")

class Customer(Member):
    def menu(self):
        print("구매자 메뉴를 실행합니다.")

admin = Admin()
seller = Seller()
customer = Customer()

admin.menu()
seller.menu()
customer.menu()
실행 결과
관리자 메뉴를 실행합니다.
판매자 메뉴를 실행합니다.
구매자 메뉴를 실행합니다.

모든 객체에서 menu()라는 같은 메서드를 호출했지만 객체의 종류에 따라 서로 다른 기능이 실행됩니다. 이처럼 같은 메서드가 객체마다 다르게 동작하는 것이 다형성입니다.

함수에서 다형성 사용하기
Python
class Admin:
    def menu(self):
        print("관리자 메뉴를 실행합니다.")

class Customer:
    def menu(self):
        print("구매자 메뉴를 실행합니다.")

def show_menu(member):
    member.menu()

admin = Admin()
customer = Customer()

show_menu(admin)
show_menu(customer)
실행 결과
관리자 메뉴를 실행합니다.
구매자 메뉴를 실행합니다.

show_menu() 함수는 객체가 관리자(Admin)인지 구매자(Customer)인지 확인하지 않습니다. 전달된 객체가 menu() 메서드를 가지고 있다면 해당 메서드를 실행합니다. 이처럼 하나의 함수에서 여러 객체를 동일한 방식으로 사용할 수 있는 것이 다형성의 장점입니다.

객체 리스트 활용
Python
class Admin:
    def menu(self):
        print("관리자 메뉴")

class Seller:
    def menu(self):
        print("판매자 메뉴")

class Customer:
    def menu(self):
        print("구매자 메뉴")

members = [
    Admin(),
    Seller(),
    Customer()
]

for member in members:
    member.menu()
실행 결과
관리자 메뉴
판매자 메뉴
구매자 메뉴

반복문에서는 모든 객체의 menu() 메서드를 동일한 방법으로 호출합니다. 그러나 실제로 실행되는 메서드는 각 객체에 따라 달라집니다.

도형의 다형성
Python
class Shape:
    def area(self):
        pass

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return self.radius * self.radius * 3.14

shapes = [
    Rectangle(10, 5),
    Circle(3)
]

for shape in shapes:
    print(shape.area())
실행 결과
50
28.26

같은 area() 메서드를 호출했지만 사각형과 원의 넓이 계산 방법은 서로 다릅니다.

실습 7

다음 클래스를 작성하시오.

Python
class Car:
    def move(self):
        print("자동차가 달립니다.")

class Bus:
    def move(self):
        print("버스가 운행합니다.")

class Bicycle:
    def move(self):
        print("자전거가 움직입니다.")

객체를 리스트에 저장한 후 반복문을 이용하여 move() 메서드를 호출하시오.

11.5 캡슐화(Encapsulation)

캡슐화(Encapsulation)는 객체의 데이터와 기능을 하나로 묶고 외부에서 중요한 데이터에 직접 접근하지 못하도록 제한하는 것입니다. 객체의 데이터가 외부에서 임의로 변경되면 프로그램에 문제가 발생할 수 있습니다. 따라서 중요한 데이터는 클래스 내부에서 관리하고 필요한 경우 메서드를 통해 접근하도록 만듭니다.

접근 제한이 필요한 이유
Python
class Account:
    def __init__(self, balance):
        self.balance = balance

account = Account(10000)
account.balance = -50000
print(account.balance)
실행 결과
-50000

잔액은 음수가 되면 안 되지만 외부에서 balance 변수에 직접 접근하여 잘못된 값을 저장할 수 있습니다. 이러한 문제를 줄이기 위해 데이터를 외부에서 직접 접근하기 어렵게 만듭니다.

__변수 사용하기
Python
class Account:
    def __init__(self, balance):
        self.__balance = balance

account = Account(10000)
print(account.__balance)
실행 결과
AttributeError

__balance는 클래스 외부에서 해당 이름으로 직접 접근할 수 없습니다.

클래스 내부에서 사용하기
Python
class Account:
    def __init__(self, balance):
        self.__balance = balance

    def print_balance(self):
        print("잔액 :", self.__balance)

account = Account(10000)
account.print_balance()
실행 결과
잔액 : 10000

외부에서는 __balance에 직접 접근하지 않고 print_balance() 메서드를 이용합니다.

데이터를 보호하는 입금과 출금
Python
class Account:
    def __init__(self, balance):
        self.__balance = balance

    def deposit(self, money):
        if money > 0:
            self.__balance += money
        else:
            print("입금액은 0보다 커야 합니다.")

    def withdraw(self, money):
        if money <= 0:
            print("출금액은 0보다 커야 합니다.")
        elif money > self.__balance:
            print("잔액이 부족합니다.")
        else:
            self.__balance -= money

    def print_balance(self):
        print("잔액 :", self.__balance)

account = Account(10000)
account.deposit(5000)
account.withdraw(3000)
account.print_balance()
실행 결과
잔액 : 12000

잔액은 입금과 출금 메서드를 통해서만 변경됩니다. 따라서 잘못된 데이터가 저장되는 것을 줄일 수 있습니다.

파이썬의 접근 제한

파이썬의 __변수는 다른 언어의 완전한 private와는 차이가 있습니다. 외부에서 직접 사용하기 어렵도록 변수 이름을 변경하여 관리하는 방식입니다. 초보자 단계에서는 중요한 데이터를 클래스 외부에서 직접 변경하지 못하도록 하기 위한 방법으로 이해하면 됩니다.

실습 8

Student 클래스를 작성하시오.

생성자에서 점수를 __score에 저장하시오.

점수를 출력하는 print_score() 메서드를 작성하시오.

출력 예시
점수 : 90
실습 9

Account 클래스를 작성하시오.

다음 기능을 구현하시오.

  • 잔액을 __balance에 저장한다.
  • 입금 기능을 작성한다.
  • 출금 기능을 작성한다.
  • 현재 잔액을 출력한다.
  • 잔액보다 큰 금액은 출금할 수 없다.
11.6 Getter와 Setter

캡슐화된 인스턴스 변수의 값을 가져오는 메서드를 Getter라고 하며, 캡슐화된 인스턴스 변수의 값을 변경하는 메서드를 Setter라고 합니다. Getter와 Setter를 사용하면 데이터를 가져오거나 변경하는 과정에서 조건을 검사할 수 있습니다.

Getter 만들기
Python
class Student:
    def __init__(self, name):
        self.__name = name

    def get_name(self):
        return self.__name

student = Student("홍길동")
print(student.get_name())
실행 결과
홍길동

get_name() 메서드는 __name의 값을 외부에 반환합니다.

Setter 만들기
Python
class Student:
    def __init__(self, name):
        self.__name = name

    def get_name(self):
        return self.__name

    def set_name(self, name):
        self.__name = name

student = Student("홍길동")
student.set_name("김철수")
print(student.get_name())
실행 결과
김철수

set_name() 메서드를 이용하여 이름을 변경하였습니다.

Setter에서 값 검사하기
Python
class Student:
    def __init__(self, score):
        self.__score = score

    def get_score(self):
        return self.__score

    def set_score(self, score):
        if 0 <= score <= 100:
            self.__score = score
        else:
            print("점수는 0점부터 100점까지 입력할 수 있습니다.")

student = Student(90)
student.set_score(150)
print(student.get_score())
실행 결과
점수는 0점부터 100점까지 입력할 수 있습니다.
90

잘못된 점수는 저장하지 않았기 때문에 기존 점수인 90이 유지됩니다.

property 사용하기

파이썬에서는 property를 사용하여 Getter와 Setter를 일반 변수처럼 사용할 수 있습니다.

Python
class Student:
    def __init__(self, name):
        self.__name = name

    def get_name(self):
        return self.__name

    def set_name(self, name):
        self.__name = name

    name = property(get_name, set_name)

student = Student("홍길동")
print(student.name)
student.name = "김철수"
print(student.name)
실행 결과
홍길동
김철수

외부에서는 student.name과 같이 일반 변수처럼 사용하지만 내부적으로는 Getter와 Setter가 실행됩니다.

데코레이터를 이용한 property
Python
class Student:
    def __init__(self, score):
        self.__score = score

    @property
    def score(self):
        return self.__score

    @score.setter
    def score(self, score):
        if 0 <= score <= 100:
            self.__score = score
        else:
            print("점수는 0점부터 100점까지 입력할 수 있습니다.")

student = Student(90)
print(student.score)
student.score = 95
print(student.score)
실행 결과
90
95

값을 읽을 때는 @property가 적용된 메서드가 실행됩니다. 값을 변경할 때는 @score.setter가 적용된 메서드가 실행됩니다.

실습 10

Product 클래스를 작성하시오.

가격을 __price 변수에 저장하고 Getter와 Setter를 작성하시오.

가격은 0보다 큰 값만 저장할 수 있도록 작성하시오.

실습 11

Person 클래스에 __age 변수를 작성하시오.

@property를 사용하여 나이를 출력하고 변경할 수 있도록 작성하시오.

나이는 0 이상인 값만 저장할 수 있도록 검사하시오.

11.7 특수 메서드

특수 메서드는 파이썬에서 특별한 상황에 자동으로 호출되는 메서드입니다. 특수 메서드의 이름 앞뒤에는 밑줄이 두 개씩 붙습니다. 이러한 메서드를 매직 메서드(Magic Method) 또는 던더 메서드(Dunder Method)라고도 합니다.

대표적인 특수 메서드는 다음과 같습니다.

  • __str__(): 객체를 문자열로 출력할 때
  • __repr__(): 객체의 공식적인 표현이 필요할 때
  • __len__(): len() 함수를 사용할 때
  • __eq__(): 객체를 ==로 비교할 때
  • __del__(): 객체가 삭제될 때
__str__()

객체를 print() 함수로 출력하면 기본적으로 객체의 클래스와 메모리 주소가 출력됩니다.

Python
class Student:
    def __init__(self, name, score):
        self.name = name
        self.score = score

student = Student("홍길동", 90)
print(student)
실행 결과
<__main__.Student object at 0x...>

__str__() 메서드를 작성하면 객체를 원하는 문자열로 출력할 수 있습니다.

Python
class Student:
    def __init__(self, name, score):
        self.name = name
        self.score = score

    def __str__(self):
        return f"이름 : {self.name}, 점수 : {self.score}"

student = Student("홍길동", 90)
print(student)
실행 결과
이름 : 홍길동, 점수 : 90

__str__() 메서드는 반드시 문자열을 반환해야 합니다.

__repr__()

__repr__()은 객체를 개발자가 확인하기 좋은 형태로 표현할 때 사용합니다.

Python
class Student:
    def __init__(self, name, score):
        self.name = name
        self.score = score

    def __repr__(self):
        return f"Student('{self.name}', {self.score})"

student = Student("홍길동", 90)
print(repr(student))
실행 결과
Student('홍길동', 90)

__str__()은 사용자가 보기 편한 문자열을 작성할 때 사용하고, __repr__()은 객체의 내부 정보를 명확하게 표현할 때 사용합니다.

__len__()

__len__() 메서드를 작성하면 객체에 len() 함수를 사용할 수 있습니다.

Python
class Classroom:
    def __init__(self):
        self.students = []

    def add_student(self, name):
        self.students.append(name)

    def __len__(self):
        return len(self.students)

classroom = Classroom()
classroom.add_student("홍길동")
classroom.add_student("김철수")
classroom.add_student("이영희")

print(len(classroom))
실행 결과
3
__eq__()

__eq__() 메서드는 두 객체를 == 연산자로 비교할 때 실행됩니다.

Python
class Student:
    def __init__(self, name, score):
        self.name = name
        self.score = score

    def __eq__(self, other):
        return self.name == other.name and self.score == other.score

student1 = Student("홍길동", 90)
student2 = Student("홍길동", 90)
student3 = Student("김철수", 80)

print(student1 == student2)
print(student1 == student3)
실행 결과
True
False

student1과 student2는 서로 다른 객체이지만 이름과 점수가 같으므로 True가 출력됩니다.

__del__()

__del__() 메서드는 객체가 삭제될 때 호출될 수 있습니다.

Python
class Student:
    def __init__(self, name):
        self.name = name
        print(self.name, "객체가 생성되었습니다.")

    def __del__(self):
        print(self.name, "객체가 삭제되었습니다.")

student = Student("홍길동")
del student
실행 결과
홍길동 객체가 생성되었습니다.
홍길동 객체가 삭제되었습니다.

객체가 실제로 메모리에서 정리되는 시점은 실행 환경에 따라 달라질 수 있습니다. 따라서 중요한 파일 저장이나 데이터베이스 처리 등을 __del__()에만 의존해서는 안 됩니다.

실습 12

Book 클래스를 작성하시오.

다음 인스턴스 변수를 사용한다.

  • 제목
  • 가격

__str__() 메서드를 작성하여 다음과 같이 출력하시오.

Python
def __str__(self):
    return f"책 제목 : {self.title}, 가격 : {self.price}원"
실습 13

Team 클래스를 작성하시오.

팀원 이름을 리스트에 저장하고 __len__() 메서드를 작성하시오.

팀원이 4명일 때 다음과 같이 출력되도록 작성하시오.

Python
def __len__(self):
    return len(self.members)
실행 결과
팀원 수 : 4
11.8 클래스 간의 관계

프로그램에서는 하나의 클래스만 사용하는 것이 아니라 여러 클래스가 서로 관계를 맺으며 동작합니다. 대표적인 클래스 관계는 다음과 같습니다.

  • 포함 관계(Has-A)
  • 상속 관계(Is-A)
  • 객체 참조
포함 관계(Has-A)

포함 관계는 하나의 객체가 다른 객체를 가지고 있는 관계입니다.

예를 들어 자동차는 엔진을 가지고 있습니다.

Python
class Engine:
    def start(self):
        print("엔진이 작동합니다.")

class Car:
    def __init__(self):
        self.engine = Engine()

    def start(self):
        self.engine.start()
        print("자동차가 출발합니다.")

car = Car()
car.start()
실행 결과
엔진이 작동합니다.
자동차가 출발합니다.

Car 객체 내부에 Engine 객체가 저장되어 있습니다. 이와 같은 관계를 포함 관계라고 합니다.

외부에서 객체 전달하기
Python
class Engine:
    def start(self):
        print("엔진이 작동합니다.")

class Car:
    def __init__(self, engine):
        self.engine = engine

    def start(self):
        self.engine.start()
        print("자동차가 출발합니다.")

engine = Engine()
car = Car(engine)
car.start()
실행 결과
엔진이 작동합니다.
자동차가 출발합니다.

Engine 객체를 먼저 생성한 후 Car 객체를 만들 때 전달하였습니다.

상속 관계(Is-A)

상속 관계는 자식 객체가 부모 객체의 한 종류인 관계입니다.

예를 들어 학생은 사람의 한 종류입니다.

Python
class Person:
    def breathe(self):
        print("숨을 쉽니다.")

class Student(Person):
    def study(self):
        print("공부합니다.")

student = Student()
student.breathe()
student.study()
실행 결과
숨을 쉽니다.
공부합니다.

Student는 Person의 한 종류이므로 상속 관계를 사용할 수 있습니다.

포함과 상속 구분하기

다음 문장으로 관계를 구분할 수 있습니다.

  • A는 B이다. → 상속

프로그램·홈페이지·강의가 필요하신가요?

프로그램 판매, 무료 다운로드, 홈페이지 제작, IT 강의 상담을 도와드립니다.

상담 신청하기