본문 바로가기
프로그래밍/파이썬 문법

호기심 파이썬 : 클래스 (생성자 / 인스턴스 생성 후 초기화 / 인스턴스 변수 접근 / 접근 지정자)

by 인성패밀리 2022. 11. 30.
반응형

이번에는 클래스 생성자 문법에 대해서 알아보겠습니다. 클래스를 이용하여 객체를 만들면 객체 고유의 속성 값을 가질 수 있습니다. 물론 필요없다면 안 가져도 됩니다.

 

오늘 알아볼 내용입니다.

1. 생성자

2. 접근 지정자

class Person:
    def __init__(self, name, age):
        """사람 객체 속성값 초기화"""
        self.name = name
        self.age = age


p1 = Person("홍길동", 20)
print(f"안녕하세요 제 이름은 {p1.name}이고, 나이는 {p1.age}살 입니다.")

1. 생성자

__init__ 메소드를 간략히 init method 라고 합니다. 

함수에 밑줄이 양쪽에 두 번 그어져 있으면 특별한 기능을 하는 메소드입니다.

여러 가지 특수 메소드 중에서 init 메소드는 인스턴스(객체)를 처음 생성 시 인스턴스 변수를 초기화하는 역할을 합니다.

때문에 init 메소드에 self를 제외한 매개변수가 있으면 인스턴스 생성 시 값을 전달해주어야 합니다.

 

그래서 이 메소드를 생성자라고도 합니다.

 

마지막 print문 보면 p1.name, p1.age로 써져 있는 부분이 있는데 이렇게 인스턴스의 인스턴스 변수에 접근이 가능합니다.

 

2. 접근 지정자

인스턴스 변수에 대해서 접근이 가능하게, 불가능 하게 할 수도 있습니다. 해당 내용은 상속에 대해서 추가로 이해해야하는 개념이 있지만 그 부분은 넘어가겠습니다.

 

위의 예제 중 p1.name 처럼 클래스 밖에서 인스턴스의 인스턴스 변수에 접근이 가능한 경우와 불가능한 경우가 있는데 대표적으로 위의 예제처럼 사용하면 아무곳에서나 접근이 가능합니다.

 

그렇다면 불가능하게 해보겠습니다. 나이를 공개하는 것을 꺼려한다는 경우에 나이에는 접근하지 못하게 할 수도 있습니다. 다음 코드를 보겠습니다.

class Person:
    def __init__(self, name, age):
        """사람 객체 속성값 초기화"""
        self.name = name
        self.__age = age


p1 = Person("홍길동", 20)
# print(f"안녕하세요 제 이름은 {p1.name}이고, 나이는 {p1.age}살 입니다.")  # 오류남
print(f"안녕하세요 제 이름은 {p1.name}입니다.")

아까 코드랑 다른 점이 보이시나요? self.age가 self.__age로 변했습니다.

 

주석 처리된 부분을 해제하고 실행하면 다음과 같은 에러 메세지가 보입니다.

AttributeError: 'Person' object has no attirbute 'age' 이런 에러 메세지가 보입니다.

Person이란 객체에 속성 age가 없다고 나옵니다.

 

분명 age가 있는데 접근이 불가능해서 이런 에러메세지가 보이는 것입니다.

 

클래스에서 접근이 가능한 변수를 public 변수라고 하고 접근이 불가능한 변수를 private 변수라고 합니다.

이때 접근 지정자를 이용하여 public인지 private인지 구별이 가능한데 self.age는 public이고 self.__age는 private 입니다.

public 접근 지정자는 아무것도 없으며 private 변수는 변수 이름 앞에 밑 줄이 두 개 붙어있습니다.

 

이런 접근 지정자를 사용해서 내가 감추고 싶은 것을 감출 수 있습니다.

 

사실 접근 지정자가 하나 더 있는데 self._age와 같은 접근 지정자도 있습니다. protected 라고 합니다. 일반적으로 사용할 때는 private한 특성을 지니고 있으나 private은 상속이 불가능하고 protected는 상속이 가능하다는 특징을 가지고 있습니다.

 

다음에는 메소드 문법에 대해서 알아보겠습니다. 해당 내용까지 이해하시면 대부분의 클래스의 1/3 정도를 이해하신 것과 다름 없습니다.

반응형

댓글