저번의 if __name__ == "__main__": 에 이어, 자주 보이는 다른 구문이 있다.

2024.01.19 - [✍🏻Language & FrameWork/Python] - [Python] if __name__ = "__main__": 이란 ?

 

[Python] if __name__ = "__main__": 이란 ?

Python 소스코드를 보면 module(.py 파일) 내부에 if __name__ == "__main__": 이라는 구문을 많이 볼 수 있다. Python 문법을 알고, 함수도 어느정도 작성할 수 있는 나에게 위의 구문은 보기만해도 낯선 것에

jijibae.tistory.com


class 를 정의하면 바로 첫 method(함수) 가 

    def __init__(self, ~~~) 의 꼴을 띄는 것이다.

 

또 새로운 것에 대한 강한 거부감이 들었지만, 이번에도 하나하나 뜯어보며 이해해보자.


1. Class 란?

"Class 와 Object(객체)" 의 관계는 많은 책에서 "붕어빵 틀과 붕어빵"로 비유한다.

  • Class : 똑같은 무엇인가를 계속 만들어낼 수 있는 설계 도면 같은 것 (붕어빵 틀)
  • Object : Class에 의해서 만들어진 피조물(붕어빵)

Class - Object

# 객체 a 생성
class bread:
    pass
    
a = bread()

 

가끔 객체를 인스턴스로 일컫기도 하는데 이는 객체와 클래스의 관계를 알려주는 것이다.

  • 클래스에 의해서 만들어진 객체를 인스턴스라고도 한다.
  • a를 단독으로 지칭할 때는 'a는 객체'
  • 클래스와 연관지어서 지칭할 때는 'a는 bread의 인스턴스'

2. Class 예시

[Do it] 점프 투 파이썬 에서는 Class를 설명할 때 계산기를 예로 든다.

# class 정의
class FourCal:
    def setdata(self, first, second):
        self.first = first
        self.second = second
        
    def add(self):
        result = self.first + self.second
        return result
        
    def mul(self):
        result = self.first * self.second
        return result
# 예시
a = FourCal()
b = FourCal()

a.setdata(4,2)
b.setdata(3,7)

print(a.add())
print(b.add())

print(a.mul())
print(b.mul())

6

8

10

21

 

정의를 보면 setdata(self, first, second)는 3개의 매개변수를 필요로하는데

실제 setdata에는 2개의 매개변수(first, second) 만을 전달한다.

  • 일반적인 함수와 달리 메서드의 첫번째 매개변수 self는 다른 의미를 가진다.
  • 파이썬 메서드의 첫번째 매개변수 명은 관례적으로 self 라는 이름을 사용하며, 다른 이름을 사용해도 괜찮다
  • 객체와 호출 입력 값들이 메서드에 어떻게 전달되는지에 대한 설명은 아래와 같다.

 

3. __init__(self) 란?

위의 setdata의 정의를 보면 다음과 같다.

def setdata(self, first, second):
    self.first = first
    self.second = second

이 함수의 역할을 보면 객체에 초깃값을 설정한다.

만일 객체에 초깃값을 설정하지 않고, add(), mul() 메서드를 수행하면 오류가 발생한다.

그 이유는 당연한데 해당 객체에 first, second 의 변수 없이 더하기, 곱하기를 수행하는 명령을 주었기 때문이다.

이렇게 메서드를 호출하여 객체의 초깃값을 설정하는 방법도 있지만, 생성자를 구현하는 것이 더 좋은 방법이다.

이때 파이썬 메서드 명을 __init__ 을 사용하면 이 메서드는 생성자가 된다.

def __init__(self, first, second):
    self.first = first
    self.second = second

2) 의 예에서는 setdata(4,2) 와 같이 객체에 초깃값을 설정하기 위해 따로 변수 값을 설정하는 메소드를 호출했다.

반면, __init__ 을 사용하여 생성자를 구현하면 자동으로 객체에 초깃값을 설정해준다. (가장 중요한 부분)

 

 

4. 생성자(Conductor)는 무엇일까?

  • 객체가 생성될 때 '자동으로 호출'되는 메서드를 의미한다.
  • 생성자를 사용하여 객체를 생성할 때에는 선언시 초기값을 함께 전달해야 한다.

 

5. 2)의 코드를 수정

class Fourcal():
    def __init__(self, first, second):
        self.first = first
        self.second = second
        
    def add(self):
        result = self.first + self.second
        return result
        
    def mul(self):
        result = self.first * self.second
        return result
a = FourCal(4, 2)
b = FourCal(3, 7)

# setdata() 메소드 생략

print(a.add())
print(a.mul())
print(b.add())
print(b.mul())

6

8

10

21

 

6. 마치며

마지막으로 __init__ 메서드의 매개변수에 어떠한 값들이 대입되는지 정리하며 마치겠다.

매개변수
self 생성되는 객체
first 4
second 2