티스토리 뷰

Python

[Python] 클래스와 객체

nc2u 2018. 10. 27. 23:04

클래스 작성하기

클래스는 객체를 생성하기 위해 객체의 형태를 정의하는 틀(template)과 같은 것이다.  클래스는 class 키워드를 사용하여 다음과 같은 구조를 이용해서 정의된다.

class 클래스이름:
    def 메소드1 (self, ...):
        ...
    def 메소드2 (self, ...):
        ...

클래스 안에는 인스턴스 변수와 메소드를 정의한다. 이들은 클래스의 멤버(member)라고 한다. 변수는 객체의 상태를 나타내고 메소드는 객체의 동작을 나타낸다.

클래스가 정의되면 객체를 생성할 수 있는데, 클래스 이름에 ()를 붙여서 함수처럼 호출 하면 객체가 생성된다.

a = Counter()   # 객체 생성 예제

 

생성자

파이썬에서는 생성자의 이름으로 __init__()을 사용한다. 생성자(constructor)는 객체가 생성될 때 객체를 기본값으로 초기화하는 특수한 메소드이다. 객체가 생성될 때, 생성자는 자동으로 호출된다. 생성자의 구조는 다음과 같다.

class 클래스이름:
    def __init__(self, ...):  # __init__()메소드가 생성자이다.
        ...

일반적인 메소드와 같이 생성자의 첫 번째 매개변수는 self 이어야 한다. self 는 현재 초기화 되고 있는 객체를 가리킨다.

생성자 안에서 인스턴스 변수가 생성되면, 이 변수의 범위는 클래스 전체가 된다. 예를 들어서 __init__() 메소드에서 생성된 변수 self.var 의 범위는 클래스 전체이다. 이것은 메소드 안에서만 생성되고 호출되는 지역변수와는 다르다.

 

메소드 정의

메소드는 클래스 안에 정의된 함수이므로 함수를 정의하는 것과 매우 유사하다. 하지만 첫 번째 매개변수는 항상 self 이어야 한다.

self 는 객체 자신을 참조하는 변수이다.  self 가 있어야만 객체의 인스턴스 변수에 접근할 수 있다. 예를 들어 객체의 인스턴스 변수에 접근할 때는 self.var 와 같은 형식을 사용하고 객체의 메소드에 접근할 때는 self.sub() 와 같은 형식을 사용한다.

 

정보 은닉

일반적으로 클래스 안의 인스턴스 변수나 메소드들은 객체를 통하여 클래스 외부에서 접근할 수 있다. 하지만 때로는 클래스 외부에서 객체를 통하여 접근할 수 없도록 제한할 필요가 있는 경우, 즉 파이썬에서 클래스의 private 멤버로 정의하려면 변수 이름 앞에 __을 붙이면 된다. private 멤버로 정의된 인스턴스 변수는 클래스 내부에서만 접근될 수 있다. 예를 들어서 Student 클래스 안의 인스턴스 변수들을 private 로 정의하면 다음과 같다.

class Student:
    def __init__(self, name=None, age=0):
        self.__name = name   # private 멤버 설정 예1
        self.__age = age     # private 멤버 설정 예2

obj = Student()
print(obj.__age)   # private 멤버의 호출 예

 

접근자(getter)와 설정자(setter)

private 인스턴스 변수는 클래스 외부에서 직접 접근할 수 없으므로 이를 사용하기 위해서는 별도의 메소드가 필요하다.

private 인수턴스 변수를 사용하기 위한 두 가지 종류의 메소드가 있다. 하나는 인스턴스 변수 값을 반환하는 접근자(getters)이고 또 하나는 인스턴스 변수값을 설정하는 설정자(setters)이다. 다음 예제와 같이 사용한다.

class Student:
    def __init__(self, name=None, age=0):
        self.__name = name
        self.__age = age

    def getAge(self):     # 접근자(getters) 예제
        return self.__age

    def getName(self):    # 접근자(getters) 예제
        return self.__name

    def setAge(self, age):    # 설정자(setters) 예제
        self.__age = age

    def setName(self, name):  # 설정자(setters) 예제
        self.__name = name


obj = Student("Hong", 20)
print(obj.getName())

접근자와 설정자의 사용 이유는 다음과 같다.


  • 접근자와 설정자를 사용해야만 나중에 클래스를 업그레이드 할 때 편하다.
  • 접근자에서 매개 변수를 통하여 잘못된 값이 넘어오는 경우, 이를 미리 차단할 수 있다.
  • 필요할 때마다 인스턴스 변수값을 계산하여 반환할 수 있다.
  • 접근자만을 제공하면 자동적으로 읽기만 가능한 인스턴스 변수를 만들 수 있다.

 

클래스 변수

어떤 경우에는 객체와는 상관없이 사용하고 싶은 변수가 있을 수 있다. 일반적인 경우라면 인스턴스 변수는 항상 객체를 통하여 사용하여야 하지만 파이썬에서는 객체를 통하지 않고 사용할 수 있는 변수를 생성하는 것이 가능하다. 이들 변수는 모든 객체를 통틀어서 하나만 생성되고 모든 객체가 이것을 공유하게 된다. 이러한 변수를 클래스 멤버(class memvber)라고 한다. 변수를 정의할 때 클래스 내부에 메소드와 동일한 수준에서 정의하면 클래스 변수가 된다.

인스턴스 변수는 객체가 생성될 때마다 별도로 생성되는 반면 모든 객체에 공통인 변수가 필요한 경우 클래스 변수(class variable)를 사용할 수 있다. 클래스 변수는 하나의 클래스에 하나만 존재한다. 클래스 변수는 객체 보다는 클래스와 연결되어 있다. 모든 객체들은 하나의 클래스 변수를 공유한다.  사용 예제는 다음과 같다.

class Television:
    serialNumber = 0   # 이것이 클래스 변수이다.
    def __init__(self):
        Television.serialNumber += 1  # 클래스 변수를 1 증가시킨다.
        self.number = Television.serialNumber

 



공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크