티스토리 뷰
클래스 작성하기
클래스는 객체를 생성하기 위해 객체의 형태를 정의하는 틀(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
'Python' 카테고리의 다른 글
[Python] sort()와 sorted()로 정렬하기 (0) | 2018.10.27 |
---|---|
[Python] COMPREHENSION (컴프리헨션) (0) | 2018.10.27 |
[Python] 리스트의 기초 연산들 (0) | 2018.10.27 |
[Python] 시퀀스 자료형 (0) | 2018.10.27 |
[Python] lambda 함수(무명 함수) (0) | 2018.10.27 |
- Total
- Today
- Yesterday