새벽코딩

[Python] OOP-2 . 생성자 (Constructor) 본문

Programming/Python

[Python] OOP-2 . 생성자 (Constructor)

midnightcoder 2023. 1. 20. 16:01

1) 생성자의 개념

 - 생성자(Constructor)는 인스턴스를 생성하면 무조건 호출되는 메서드 이다.

 - 인스턴스를 생성하면서, 필드값을 초기화 하는 역할을 하는 메서드 이기도 하다.

class Car:
    color = ""
    speed = 0

    def upSpeed(self, value):
        self.speed += value

    def downSpeed(self, value):
        self.speed -= value

    def printFields(self, myCar):
        print("%s의 색상 : %s, 속도 : %dkm" % (myCar, self.color, self.speed))

if __name__ =="__main__":
    myCar1 = Car()
    myCar2 = Car()
    myCar3 = Car()

위에 Car class는 따로 생성자를 정의하지 않았는데, 이런 경우는 Python  interpreter가 알아서 추가해준다.

(묵시적으로 아무런 값으로 설정되지 않은 기본 생성자를 추가해준다)

 

2) 생성자의 기본

- 생성자는 아래와 같은 이름을 갖는다. 언더바 ( _ ) 2개가 붙은것을 Python 에서는 reserved method라고 한다.

  (프로그램 작성시, 이런 reserved된 이름을 사용해서 함수명, 변수명을 만들 수 없다)

__init__()

 ① 매개변수가 없는 생성자 → 기본생성자

class Car:
    color = ""
    speed = 0
    
    def __init__(self):
        self.color = "red"
        self.speed = 0

# and then when creating instance, it calls the constructor

myCar1 = Car()

마지막 라인에, 생성자를 호출하면서 color은 red로 그리고 speed는 0으로 초기화가 이루어진다.

이렇게, 매개변수가 self 만 있는 생성자를 기본 생성자라고 한다.

 

Python에서 생성자의 규칙
  1. 생성자명은 __init__ 으로 작성해야한다.

  2. 생성자는 return 값이 없다.

  3. 생성자가 여러개 존재하면 안된다.

② 매개 변수가 있는 생성자

class Car:
    color = ""
    speed = 0

    def __init__(self, color, speed):
        self.color = color
        self.speed = speed
        
# main part
myCar1 = Car("red", 30)
mycar2 = Car("blue", 200)

이 경우, 인스턴스를 만들 때 초기값을 매개변수로 받아서 초기화 한다.

단, 이 경우에는 매개변수 없이 Car instance를 생성하면 오류 발생

 

어떤 옵션을 선택하냐에 따라서, 생성되는 차량의 instance가 가지고 있는 변수들의 초기값이 다르게 초기화된다.

3) Car 클래스의 전체 코드 (생성자 추가, getter() 메서드 추가)

class Car :
   name = ""
   speed = 0
   # 매개변수가 있는 생성자
   def __init__(self, name, speed) :
      self.name = name
      self.speed = speed
   # 아래 2개의 메서드는 getter() 메서드라고 한다.
   def getName(self):
      return self.name

   def getSpeed(self) :
      return self.speed

#변수 선언 부분
car1, car2 = None, None

#메인 코드 부분 #
car1 = Car("아우디", 0)
car2 = Car("벤츠", 30)
print("%s의 현재 속도는 것입니다." % (car1.getName(), car1.getSpeed()))
print("%s의 현재 속도는 0입니다." % (car2.getName(), car2.getSpeed()))

OOP에서 캡슐화라는 개념이 존재하는데, class의 filed를 위부로 노출시키는 것을 방지하는 것을 의미한다.

setter() method와 getter() method가 있는데, 보통 getter() 만 주로 쓰인다.

(최소한 필드의 값을 읽어야 연계된 프로그램에서 그 값을 활용가능하기 떄문)

 

비유하자면, 캡슐안에 Variables과 Method가 들어있고, 캡슐 껍질에 getter() 가 존재하면서 내부 필드를 가져올 수 있다.

 

참고 (접근 제어자?)

#변수 앞에 _ _를 붙이면 private 성질로 클래스 내부에서만 접근 가능
class Person:
    __name = ""
    __age = 0
    height = 180

참고2 __str__() 함수

def __str__(self):
    print(self.__name)
    print(self.age)
    print(self.height)
    print(self.weight)
    print(self.address)
    
  # __str__() method는 맴버변수의 값을 간단하게 확인하고자 할 때 주로 사용한다.
  # JAVA의 toString() method와 유사

 

 

출처 : 파이썬(Python) 기초부터 실무까지 part.4