안녕하세요, 개발자를 꿈꾸는 직장인입니다.
오늘은 __init__함수를 알아보려 합니다.
init 함수가 왜 필요한지에 대해 먼저 살펴보겠습니다.
인스턴스 변수는 항상 사용 전에 미리 설정해야 합니다.
예를 먼저 살펴보겠습니다.
class User: pass user1 = User() user1.name = "Hoon" user1.email = "hoon@naver.com" user1.password = "123"
user1을 인스턴스로 만든 후에 name, email, password와 같은 변수들을 따로 설정을 해줘야 합니다!
위와 같이 코드를 짜게 되면 길이가 너무 길어지는데요, 인스턴스 변수 전부를 한 번에 설정할 수 있는 인스턴스 메소드를 한번 설정해 보겠습니다.
위의 예를 initialize라는 함수를 만들어 한번에 나타내 보겠습니다.
initialize의 파라미터로는 첫 번째로는 메소드를 호출하는 인스턴스가 자동으로 전달되는 self가 되고 다음부터 순서대로 나머지 name, email, password를 적습니다. 그러므로 def __init__(self, name, email, password): 가됩니다.
메소드 내부는 어떻게 될까요? 내부에서는 파라미터 self를 가지고 인스턴스 변수를 설정하게 됩니다.
이전 인스턴스 메소드/변수 글에서 나왔듯이 인스턴스가 self로 넘어오게 됩니다.
user1이 인스턴스라고 가정하면 self.name = name 은 user1.name = name이 되게 됩니다! 같은 방식으로 email, password도 동일하게 설정하게 되면 아래 코드와 같이 적을 수 있습니다.
class User: def initialize(self, name, email, password): self.name = name self.email = email self.password = password user1 = User() user1.initialize("hoon", "hoon@naver.com", "123")
결과는 동일하게 나왔는데요, 지금은 user1만 사용하여 길이 차이가 별로 안 나는 것 같지만 user가 10명까지 늘어나면 코드량이 엄청 줄어들게 됩니다! 이제 위와 같이 클래스 내부에 함수를 지정해주었다면,
user1 = User() # 유저를 생성하는 줄
user1.initialize("hoon","hoon@naver.com","123") #초기값을 지정하는 줄
위의 두줄만 적으면 되게 됩니다!
여기서 한 줄로 바꿀 수 있는 방법도 있는데요, 이것이 바로 __init__ 함수입니다!
함수 앞뒤로 "_(under bar)"가 두 개씩 있는 메소드를 magic method(special method)라고 정의합니다.
__init__은 인스턴스가 생성될 때 자동으로 호출이 됩니다.
사용 방법으로는 클래스 내부에 initialize 대신 __init__을 사용하고, 인스턴스를 생성하는 user1 = User()의 괄호 안에 initialize괄호 안의 파라미터들을 넣어주는 것입니다.
class User: def __init__(self, name, email, password): self.name = name self.email = email self.password = password user1 = User("hoon", "hoon@naver.com", "123") user2 = User("Minhee", "min@naver.com", "12")
한 줄로 완성된 것을 확인할 수 있습니다! 어떻게 이렇게 되는지 정리해 보겠습니다.
user1 = User("hoon", "hoon@naver.com", "123")
① 먼저 User 인스턴스가 생성이 되고,
② __init__메소드가 자동 호출이 됩니다
-. self에는 User인스턴스가 들어가게 됩니다.
-. 괄호 안 변수들이 오른쪽의 값으로 들어가면서 인스턴스 변수들의 초기값이 설정이 됩니다!
이렇게 두줄을 한 줄로 줄일 수 있기 때문에 보통 class에는 init 메소드를 꼭 작성해 줍니다!
'Python > 객체지향 및 자료구조' 카테고리의 다른 글
가변 타입 / 불변 타입 (0) | 2021.07.04 |
---|---|
클래스 메소드 (0) | 2021.07.03 |
__str__ 메소드 (0) | 2021.05.10 |
인스턴스 메소드 / 변수 (0) | 2021.05.07 |
객체(인스턴스)/객체 지향 프로그래밍 (0) | 2021.05.06 |
댓글