__new__, __init__ 차이점

2024. 3. 20. 15:13·프로그래밍 언어/파이썬

__new__와 __init__는 객체 지향 프로그래밍 언어인 파이썬에서 클래스의 인스턴스 생성 과정에 관여하는 두 가지 특별한 메소드입니다. 이 둘은 서로 다른 목적과 시점에서 호출되며, 객체의 생명주기에서 중요한 역할을 수행합니다.

__new__ 메소드:

  • __new__는 클래스의 새 인스턴스를 생성할 때 호출되는 클래스 메소드(class method)입니다.
  • __new__는 클래스의 첫 번째 인수로 전달되며, 반드시 object를 반환해야 합니다. 이 메소드는 인스턴스가 메모리에 할당되기 전에 호출됩니다.
  • __new__ 메소드는 주로 불변 타입이나 싱글톤 패턴과 같이 인스턴스 생성 과정을 커스텀하게 제어할 필요가 있을 때 오버라이드합니다.
  • __new__의 주요 목적은 인스턴스를 생성하고 반환하는 것입니다.

__init__ 메소드:

  • __init__는 클래스의 인스턴스가 생성된 후에 호출되는 메소드로, 인스턴스의 초기화를 담당합니다.
  • __init__는 self를 첫 번째 인수로 받으며, 이는 이미 생성된 인스턴스를 참조합니다. 추가적인 인수는 인스턴스 변수를 초기화하는 데 사용할 수 있습니다.
  • 이 메소드는 값을 반환하지 않으며, 주로 인스턴스 변수의 초기화나 인스턴스 생성 직후에 필요한 다른 초기 설정 작업을 수행하는 데 사용됩니다.

차이점 요약:

  • __new__는 인스턴스를 생성하는 역할을 하며, 클래스의 새 객체를 메모리에 할당하고 그 객체를 반환합니다. __new__ 메소드는 클래스 메소드로서, 첫 번째 인수로 클래스 자신을 받습니다.
  • __init__는 이미 생성된 인스턴스의 초기화를 담당하며, 인스턴스 변수의 초기값을 설정하는 등의 작업을 수행합니다. __init__ 메소드는 인스턴스 메소드로서, 첫 번째 인수로 인스턴스 자신(self)을 받습니다.
  • 간단히 말해, __new__는 "생성(create)"에, __init__는 "초기화(initialize)"에 초점을 둡니다.

코드 예시

아래 예시들은 __new__와 __init__ 메소드를 사용하는 방법을 보여줍니다. __new__ 메소드를 사용하여 싱글톤 패턴을 구현하는 예시와 __init__ 메소드를 사용하여 인스턴스를 초기화하는 방법을 설명합니다.

싱글톤 패턴 구현 (__new__ 사용 예시):

싱글톤 패턴은 특정 클래스의 인스턴스가 프로그램 전체에서 단 하나만 존재하도록 보장하는 디자인 패턴입니다. 이 패턴은 전역 상태를 관리하거나 공유 리소스에 대한 일관된 접근점을 제공하는 데 유용할 수 있습니다. __new__ 메소드를 오버라이드하여 이 패턴을 구현할 수 있습니다.

class Singleton:
    _instance = None  # 클래스 레벨의 인스턴스 참조 변수

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

    def __init__(self, value):
        self.value = value

# 싱글톤 인스턴스 생성
singleton1 = Singleton("First")
print(singleton1.value)  # 출력: First

# 동일한 인스턴스 반환
singleton2 = Singleton("Second")
print(singleton2.value)  # 출력: Second
print(singleton1.value)  # 출력: Second
print(singleton1 is singleton2)  # 출력: True

인스턴스 초기화 (__init__ 사용 예시):

__init__ 메소드는 객체의 초기 상태를 설정하는 데 사용됩니다. 객체 지향 프로그래밍에서 초기화 작업은 객체가 예상대로 동작하기 위해 필요한 상태를 설정하는 중요한 단계입니다.

class Car:
    def __init__(self, brand, model, year):
        self.brand = brand
        self.model = model
        self.year = year

    def display_info(self):
        print(f"Car: {self.brand} {self.model}, Year: {self.year}")

# Car 인스턴스 생성 및 초기화
car = Car("Tesla", "Model S", 2020)
car.display_info()  # 출력: Car: Tesla Model S, Year: 2020

이 수정 사항은 __new__와 __init__의 사용 사례와 중요성에 대한 설명을 더욱 풍부하게 하고, 각 메소드의 역할과 프로그래밍 상황에서의 적용을 좀 더 명확히 이해할 수 있도록 돕습니다.

저작자표시 (새창열림)

'프로그래밍 언어 > 파이썬' 카테고리의 다른 글

r string, u string이란  (0) 2024.03.20
__repr__, __str__의 차이점  (0) 2024.03.20
매직메소드란?  (0) 2024.03.20
MRO(Method Resolution Order)  (0) 2024.03.20
GIL(Global Interpreter Lock)  (1) 2024.03.20
'프로그래밍 언어/파이썬' 카테고리의 다른 글
  • r string, u string이란
  • __repr__, __str__의 차이점
  • 매직메소드란?
  • MRO(Method Resolution Order)
hyeseong-dev
hyeseong-dev
안녕하세요. 백엔드 개발자 이혜성입니다.
  • hyeseong-dev
    어제 오늘 그리고 내일
    hyeseong-dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (286) N
      • 여러가지 (107)
        • 알고리즘 & 자료구조 (72)
        • 오류 (4)
        • 이것저것 (29)
        • 일기 (1)
      • 프레임워크 (39)
        • 자바 스프링 (39)
        • React Native (0)
      • 프로그래밍 언어 (38)
        • 파이썬 (30)
        • 자바 (3)
        • 스프링부트 (5)
      • 컴퓨터 구조와 운영체제 (3) N
      • DB (17)
        • SQL (0)
        • Redis (17)
      • 클라우드 컴퓨팅 (2)
        • 도커 (2)
        • AWS (0)
      • 스케쥴 (65)
        • 세미나 (0)
        • 수료 (0)
        • 스터디 (24)
        • 시험 (41)
      • 트러블슈팅 (1)
      • 자격증 (0)
        • 정보처리기사 (0)
      • 재태크 (5)
        • 암호화폐 (5)
        • 기타 (0)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    Python
    ecs
    mybatis
    자바
    시험
    WebFlux
    RDS
    EC2
    celery
    백준
    #개발자포트폴리오 #개발자이력서 #개발자취업 #개발자취준 #코딩테스트 #항해99 #취리코 #취업리부트코스
    취업리부트
    Docker-compose
    reactor
    항해99
    OOP
    그리디
    SAA
    완전탐색
    spring
    FastAPI
    파이썬
    프로그래머스
    Redis
    AWS
    docker
    Spring WebFlux
    Spring Boot
    java
    DP
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
hyeseong-dev
__new__, __init__ 차이점
상단으로

티스토리툴바