Python(6) | 상속, 스페셜 메서드, 예외처리

2025. 10. 27. 20:05·개념 정리 step1/Python 기초

◻️1. 상속

파이썬 상속은 기존 클래스(부모 클래스)의 속성과 메서드를 새로운 클래스(자식 클래스)가 물려받아 코드의 재사용성과 확장성을 높이며, 자식 클래스에서 부모 클래스의 기능을 수정하거나 추가할 수 있는 기능을 제공한다. 또한 파이썬의 모든 클래스는 object라는 클래스로부터 상속받습니다.

 

class Animal:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def eat(self, food):
        print(f'{self.name} {food} 먹습니다')

    def sleep(self, hour):
        print(f'{self.name} {hour}시간 동안 잠을 잡니다')
 
class Dog(Animal):
    pass
 
rucy = Dog('루시', 15)
rucy.eat('사료')
rucy.sleep(12)
 
출력:
루시 사료 먹습니다
루시 12시간 동안 잠을 잡니다

 

 

1-1. 클래스 상속 시 생성자 호출 순서

1) 자식 클래스(child class)의 생성자가 호출됩니다.
2) 자식 클래스의 생성자에서 부모 클래스(parent class)의 생성자를 호출해야 합니다. 이를 위해 super() 함수를 사용합니다. super() 함수는 현재 클래스의 부모 클래스를 참조하며, 부모 클래스의 생성자를 호출할 수 있습니다.
3) 부모 클래스의 생성자가 호출됩니다.
4) 부모 클래스의 생성자가 실행을 마치면 자식 클래스의 생성자로 돌아가 자식 클래스의 생성자 코드가 실행됩니다.

class Parent:
    def __init__(self):
        print('부모 클래스 생성자 호출')  # 2

class Child(Parent):
    def __init__(self):
        print('Child 클래스 생성자 호출')  # 1
        super().__init__()  # super() 는 부모클래스를 뜻한다,
        print('모든 생성자 호출 완료')  # 3 __init__부모클래스 호출 후 돌아온 것이다.

child = Child()
 
출려:
Child 클래스 생성자 호출
부모 클래스 생성자 호출
모든 생성자 호출 완료

Object 클래스

Object 클래스는 파이썬에서 모든 클래스의 부모 클래스 역할을 하는 기본 클래스입니다. 파이썬에서 정의하는 모든 클래스는 자동으로 Object 클래스를 상속받습니다. 이를 통해 파이썬의 모든 객체는 Object 클래스에서 제공하는 기본적인 동작과 메서드를 사용할 수 있게 됩니다. 예를들어 str(), repr(), eq(), hash() 등이 있습니다.

class MyClass:
    pass

# 위의 코드는 다음과 동일합니다.
class MyClass(object):  # 아무것도 안적었지만 기본적으로 Object를 상속받는 것과 같다.
    pass

1-2. 메서드 오버라이딩

메서드 오버라이딩(Method Overriding)은 객체 지향 프로그래밍에서 중요한 개념 중 하나로, 서브 클래스(자식 클래스)에서 슈퍼 클래스(부모 클래스)의 메서드를 재정의하는 것을 의미합니다. 오버라이딩을 사용하면, 서브 클래스에서 상속받은 메서드의 동작을 변경하거나 확장할 수 있습니다. 오버라이딩할 때, 메서드의 이름은 물론이고 매개변수의 타입과 개수도 일치해야 합니다. 반환 타입은 일치할 필요는 없지만, 일반적으로 같게 유지하는 것이 좋습니다.

 

☑️중요 포인트

1. 동일한 매개변수(같은 이름)를 정의하면 덮어쓴다.

2. 부모클래스는 자식클래스를 사용 못한다.

 

 

1-3. 다중 상속

다중 상속은 클래스가 둘 이상의 부모 클래스로부터 상속을 받는 기능을 의미합니다. 파이썬은 다른 많은 객체 지향 언어와 달리 다중 상속을 지원합니다. 다중 상속을 사용하면 코드의 재사용성을 향상시킬 수 있지만, 동시에 복잡성이 높아지기 때문에 주의해야 합니다.

# 상속에 대한 규칙을 알아보는 메서드(순서를 알아볼 수 있다.)

print(Kim.mro())

출력: [<class '__main__.Kim'>, <class '__main__.Animal'>, <class '__main__.Human'>, <class 'object'>]

 

1-4. super() 함수 , mro()함수

super()는 파이썬의 내장 함수로서, 상속과 관련된 작업을 수행할 때 사용됩니다. 특히, 자식 클래스에서 부모 클래스의 메서드를 호출할 때 사용됩니다. super()의 주요 목적은 자식 클래스에서 부모 클래스의 메서드를 오버라이드(재정의)하면서도 그 오버라이드된 메서드 내에서 부모 클래스의 원본 메서드를 호출하는 것입니다.

# super()
 
class Parent:
    def hello(self):
        print('부모 클래스의 hello 메서드')

class Child(Parent):
    def hello(self):
        super().hello()
        print('자식 클래스의 hello 메서드')

child = Child()  # 부모 클래스의 hello 메서드
child.hello()      # 자식 클래스의 hello 메서드

MRO(Method Resolution Order)는 파이썬에서 다중 상속을 사용할 때, 메서드나 속성을 찾는 순서를 정의하는 규칙입니다. MRO는 특히 여러 부모 클래스를 상속받는 경우에 어떤 부모 클래스에서 메서드를 먼저 찾을지를 결정하며, 이를 통해 클래스 간의 메서드 충돌을 해결할 수 있습니다.


◻️2. 스페셜 메서드

파이썬의 스페셜 메서드 (또는 매직 메서드라고도 불림)는 더블 언더스코어(__)로 시작하고 끝나는 메서드 이름을 갖습니다. 이 메서드들은 특정 구문이나 내장 함수를 사용할 때 파이썬 인터프리터에 의해 자동으로 호출됩니다.

 

1. __repr__()

파이썬에서 객체의 “공식적인” 문자열 표현을 정의하는 특별한 메서드로, 주로 개발자나 디버깅을 위한 정보를 제공하는 데 사용됩니다. 이 메서드는 객체를 문자열로 변환할 때 자동으로 호출됩니다.

 

2. __str__()

사용자가 이해하기 쉽고 읽기 좋은 형태의 문자열 표현을 반환하는 메서드로, 주로 객체를 출력할 때 사용됩니다. __str__는 사용자가 보기 쉽도록 설계된 문자열 표현을 반환하며, print()나 str()을 통해 호출됩니다. 반대로 __repr__()는 객체의 공식적인 표현을 제공하고, repr() 함수를 통해 호출됩니다.

 

3. __len__()⭐

파이썬에서 객체의 길이 또는 크기를 반환하는 특별한 메서드로, len() 함수가 호출될 때 자동으로 호출됩니다. 이 메서드는 객체의 항목 수를 측정하거나, 특정한 크기(예: 리스트, 문자열, 튜플 등)를 나타내고자 할 때 구현됩니다.

class Queue:
    def __init__(self):
        self.item = [1, 2, 3, 4, 5]

    def __len__(self):
        return len(self.item)
 
queue = Queue()
print(len(queue))  # 클래스 안에 변수가 몇 개가 들어있는지 모른다. => len을 오버라이딩하면 item 숫자를 세준다.
 
출력: 5

4. __getitem__()⭐

파이썬에서 인덱싱을 지원하기 위해 사용되는 특별한 메서드로, 객체의 특정 항목을 가져오기 위해 대괄호([])를 사용할 때 호출됩니다. 이 메서드는 객체의 특정 인덱스나 키에 해당하는 값을 반환하는 역할을 합니다.

class MyList:
    def __init__(self, data):
        self.data = data
    def __getitem__(self, index):
        return self.data[index]
 
ml = MyList([10, 20, 30, 40])
print(ml[0])
print(ml[1])
print(ml[-1])
 
출력:
10
20
40

5. __call__()

파이썬에서 객체를 함수처럼 호출할 수 있게 해주는 특별한 메서드입니다. 이 메서드를 구현하면, 해당 클래스의 인스턴스를 함수처럼 사용할 수 있으며, 인스턴스에 대해 괄호(())를 사용하여 값을 전달하고 결과를 반환받을 수 있습니다.

class CallableObject:
    def __call__(self, *args, **kwargs):
        print(f'args:{args}, kwargs:{kwargs}')
 
callable_obj = CallableObject()
print(callable_obj)
callable_obj(1, 2, 3, a='A', b='B')  # 객체를 함수처럼 실행할 수 있다. *args, **kwargs 알아서 들어간다.
 
 
출력:
<__main__.CallableObject object at 0x7bc1effe4ef0>
args:(1, 2, 3), kwargs:{'a': 'A', 'b': 'B'}

◻️3. 파이썬 객체지향의 4대 패러다임

캡슐화: 객체 안에 데이터(속성)와 메서드(함수)를 감추고, 외부에 필요한 기능만 제공하는 것
상속: 기존 클래스(부모)의 속성과 기능을 새로운 클래스(자식)가 물려받아 재사용하는 것
다형성: 동일한 이름의 메서드가 상황에 따라 다르게 동작할 수 있는 것
추상화: 핵심 개념만 정의하고, 구체적인 내용은 자식 클래스에서 채우도록 설계하는 것 (설계의 틀 제공)


◻️4. 예외처리

예외(Exception)는 프로그램 실행 중 발생할 수 있는 예상치 못한 문제 또는 오류 상황을 의미합니다. 예외가 발생하면 프로그램은 중단되기 때문에 이를 적절하게 처리하여 중단을 방지하거나 오류에 대한 정보를 사용자에게 제공해야 합니다.

 

◽예외 처리 기본 구조

try:
    # 예외가 발생할 가능성이 있는 코드
except ExceptionType1:  # 'ExceptionType1'에는 실제 예외 유형이 들어갑니다.
    # ExceptionType1 예외가 발생했을 때 실행될 코드
except ExceptionType2:  # 'ExceptionType2'에는 다른 예외 유형이 들어갑니다.
    # ExceptionType2 예외가 발생했을 때 실행될 코드
# 추가적인 except 블록을 계속 추가할 수 있습니다.
else:
    # try 블록에서 예외가 발생하지 않았을 때 실행될 코드
finally:
    # 예외 발생 여부와 관계없이 항상 실행될 코드
try:  # 전체적으로 묶어도 관계없다
    print(10 / 3)  # 1
    print(5 / 0)   # 2
    print(4 / 2)
except ZeroDivisionError:  # 3
    print('예외가 발생했어요')
print('프로그램을 종료합니다') # 4
 
출력:
3.3333333333333335
예외가 발생했어요
프로그램을 종료합니다
 
 
 
 
예외처리 필기사항:
1. except:  => 그냥 사용하면 모든 클래스가 받아짐, 그럼 왜 이름을 쓰나? => 오류를 개별적으로 처리하기 위해서이다.
 
2. except IndexError:  # => ZeroDivisionEorro 같이 '다른' 에러코드를 넣으면 그냥 에러발생
 
3. 지정 except는 위에 작성해야된다.
 
4. else:  # except가 모두 실행되지 않으면 실행 (if-else랑 같음)

 

4-1. Exception 클래스

Exception 클래스는 파이썬의 내장 예외 계층 구조에서 거의 모든 내장 예외의 기본 클래스입니다. 이 클래스는 사용자 정의 예외를 만들거나 특정 예외 유형을 잡기 위한 기본적인 인터페이스를 제공합니다. 예외 유형은 Exception을 상속받아서 정의됩니다. 예를 들면 ValueError, TypeError, FileNotFoundError 등이 있습니다. 이 상속 구조 덕분에 except Exception 블록은 Exception을 상속받은 모든 예외를 처리할 수 있습니다.

# raise: 예외 상황을 발생시킴
try:
    raise Exception('예외가 발생했어요!!')
except Exception as e:
    print(e)
 
출력: 예외가 발생했어요!!
 
 
def func1():
    n = int(input('짝수를 입력하세요: '))
    if n % 2 == 1:
        raise Exception('홀수를 입력했어요!')
    print(n)
 
try:
    func1()
except Exception as e:
    print('예외가 발생: ', e)
 
출력:
짝수를 입력하세요: 9
예외가 발생: 홀수를 입력했어요!

예외처리를 어디에 두어야 될까?

def func1():
    func2()

def func2():
    func3()

def func3():
    print('%d' % '문자열')  # 문자열을 숫자, 에러임 / %d format: a real number is required, not str
 
try:
    func1()
except TypeError:
    print('타입이 올바르지 않습니다.')

# 예외처리를 어디에 두어도 상관없다.

'개념 정리 step1 > Python 기초' 카테고리의 다른 글

Python(7) | 파일 입출력, 타입 어노테이션, 클로저, 데코레이터, 모듈  (0) 2025.10.29
Python(5) | def, callback, lambda, class  (1) 2025.10.25
Python(4) | 제어문(조건문, 반복문), 문제 풀이  (0) 2025.10.24
Python(3) | 컬렉션 타입 (list, tuple, dict, set), input(), 연산자  (0) 2025.10.22
Python(2) | 변수, 문자열 다루기  (0) 2025.10.21
'개념 정리 step1/Python 기초' 카테고리의 다른 글
  • Python(7) | 파일 입출력, 타입 어노테이션, 클로저, 데코레이터, 모듈
  • Python(5) | def, callback, lambda, class
  • Python(4) | 제어문(조건문, 반복문), 문제 풀이
  • Python(3) | 컬렉션 타입 (list, tuple, dict, set), input(), 연산자
고니3000원
고니3000원
프로젝트의 구현 과정과 기술적 노하우를 담았습니다. AI 모델 연구와 매일의 학습 기록을 차곡차곡 공유하고 있습니다.
  • 고니3000원
    곤이의 공부 블로그
    고니3000원
  • 전체
    오늘
    어제
    • 분류 전체보기 (231)
      • 1. AI 논문 + 모델 분석 (22)
        • AI 논문 분석 (13)
        • AI 모델 분석 (9)
      • 2. 자료구조와 알고리즘 (16)
        • 2-1 자료구조와 알고리즘 (13)
        • 2-2 강화학습 알고리즘 (3)
      • 3. 자습 & 메모(실전, 실습, 프로젝트) (27)
        • 3-1 문제 해석 (4)
        • 3-2 메모(실전, 프로젝트) (14)
        • 3-3 배포 실전 공부 (7)
        • 3-4 최신 기술 분석 (2)
      • 4. [팀] 프로젝트 및 공모전 (31)
        • 4-1 팀 프로젝트(메모, 공부) (1)
        • 4-2 Meat-A-Eye (6)
        • 4-3 RL-Tycoon-Agent (3)
        • 4-4 구조물 안정성 물리 추론 AI 경진대회(D.. (4)
        • 4-5 AgentShield(보안 플랫폼) (17)
      • 5. [개인] 프로젝트 및 공모전 (25)
        • 4-1 귀멸의칼날디펜스(자바스크립트 활용) (5)
        • 4-2 바탕화면 AI 펫 프로그램 (4)
        • 4-3 개인 프로젝트(기타) (3)
        • 4-4 공모전 (9)
        • 4-5 나만의 로컬 LLM 멀티 에이전트 구축 (4)
      • 6. 경진 대회 (kaggle, dacon 등) (12)
        • 6-1 연구 및 개선 기록 (11)
        • 6-2 공유 코드 분석하기 (1)
      • 개념 정리 step1 (32)
        • Python 기초 (7)
        • DBMS (1)
        • HTML | CSS (3)
        • Git | GitHub (1)
        • JavaScript (5)
        • Node.js (5)
        • React (1)
        • 데이터 분석 (6)
        • Python Engineering (3)
      • 개념 정리 step2 (60)
        • Machine | Deep Learning (15)
        • 멀티모달(Multi-modal) (23)
        • 강화 학습 (10)
        • AI Agent (9)
        • 메디컬 이미지 (3)
      • 개인 공부 - 내가 공부하고 싶은 모든 것 (3)
        • 1. 인프라 (2)
        • 2. 자율주행 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Notion-포트폴리오
    • Github
  • 공지사항

    • 나의 핵심 가치
  • 인기 글

  • 태그

    논문 리뷰
    파인튜닝
    강화학습
    알고리즘
    Python
    github
    paddleocr
    Agent
    transformer
    Ai
    OCR
    Vision
    파이썬
    구현
    인공지능
    자료구조
    공모전
    API
    ViT
    데이터분석
    llm
    전처리
    프로젝트
    RAG
    학습
    Lora
    pandas
    자바스크립트
    연구
    Ollama
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
고니3000원
Python(6) | 상속, 스페셜 메서드, 예외처리
상단으로

티스토리툴바