객체지향 프로그래밍은 복잡한 문제를 잘게 나누어 객체로 만들고, 객체를 조합해서 문제를 해결한다. 따라서 현실 세계의 복잡한 문제를 처리하는데 유용하며 기능을 개선하고 발전시킬 때도 해당 클래스만 수정하면 되므로 유지 보수에도 효율적이다.
특정한 개념이나 모양으로 존재하는 것이다.
프로그래밍으로 객체를 만들 때 사용하는 것이다.
클래스의 데이터
클래스의 기능
클래스는 class에 클래스 이름을 지정하고 :(콜론)을 붙인 뒤 다음 줄부터 def로 메서드를 작성하면 된다.
메서드는 클래스 안에 들어있는 함수를 뜻한다.
class 클래스이름:
def 메서드(self):
코드
# ex) 사람 클래스
>>> class Person:
... def greeting(self):
... print('Hello')
>>> james = Person()
Person으로 변수 james를 만들었는데 이 james가 Person의 인스턴스(instance)다. 클래스는 특정 개념을 표현만 할뿐 사용을 하려면 인스턴스를 생성해야 한다.메서드는 클래스가 아니라 인스턴스를 통해 호출한다.
인스턴스.메서드()
>>> james.greeting()
Hello
인스턴스와 객체는 같은 것을 뜻한다. 보통 객체만 지칭할 때는 그냥 객체(object)라고 부르지만 클래스와 연관지어서 말할 때는 인스턴스(instance)라고 부른다.
다음과 같이 리스트 변수 a, b가 있으면 a, b는 객체다. 그리고 a와 b는 list 클래스의 인스턴스다.
>>> a = list(range(10))
>>> b = list(range(20))
isinstance 함수를 사용한다. 특정 클래스의 인스턴스가 맞으면 True, 아니면 False를 반환한다.
isinstance(인스턴스, 클래스)
isinstance는 주로 객체의 자료형을 판단할 때 사용한다.
def factorial(n):
if not isinstance(n, int) or n < 0:# n이 정수가 아니거나 음수이면 함수를 끝냄
return None
if n == 1:
return 1
return n * factorial(n - 1)
팩토리얼 함수는 1부터 n까지 양의 정수를 차례대로 곱해야 하는데, 실수와 음의 정수는 계산할 수 없다. 이런 경우에 isinstance를 사용하여 숫자(객체)가 정수일 때만 계산하도록 만들 수 있다.
__init__ 메서드 안에서 self.속성에 값을 할당한다.
class 클래스이름:
def __init__(self):
self.속성 = 값
# ex
class Person:
def __init__(self):
self.hello = '안녕하세요.'
def greeting(self):
print(self.hello)
james = Person()
james.greeting() # 안녕하세요.
# 실행 결과
안녕하세요.
__init__ 메서드는 james = Person()처럼 클래스에 ( )(괄호)를 붙여서 인스턴스를 만들 때 호출되는 특별한 메서드이다. 즉, __init__(initialize)이라는 이름 그대로 인스턴스(객체)를 초기화한다.
self는 인스턴스 자기 자신을 의미한다.
__init__ 메서드에서 self 다음에 값을 받을 매개변수를 지정한다. 그리고 매개변수를 self.속성에 넣어준다.
class Person:
def __init__(self, name, age, address):
self.hello = '안녕하세요.'
self.name = name
self.age = age
self.address = address
def greeting(self):
print('{0} 저는 {1}입니다.'.format(self.hello, self.name))
maria = Person('마리아', 20, '서울시 서초구 반포동')
maria.greeting() # 안녕하세요. 저는 마리아입니다.
print('이름:', maria.name) # 마리아
print('나이:', maria.age) # 20
print('주소:', maria.address) # 서울시 서초구 반포동
# 실행 결과
안녕하세요. 저는 마리아입니다.
이름: 마리아
나이: 20
주소: 서울시 서초구 반포동
클래스 바깥에서는 접근할 수 없고 클래스 안에서만 사용할 수 있다.
비공개 속성은 이름이 ____(밑줄 두 개)로 시작해야 한다.
class_private_attribute_error.py
class Person:
def __init__(self, name, age, address, wallet):
self.name = name
self.age = age
self.address = address
self.__wallet = wallet # 변수 앞에 __를 붙여서 비공개 속성으로 만듦
maria = Person('마리아', 20, '서울시 서초구 반포동', 10000)
maria.__wallet -= 10000 # 클래스 바깥에서 비공개 속성에 접근하면 에러가 발생함
비공개 속성은 이렇게 클래스 밖에서 접근하면 에러가 발생하기 때문에 클래스 안의 메서드에서만 접근해야 한다.
class Person:
def __init__(self, name, age, address, wallet):
self.name = name
self.age = age
self.address = address
self.__wallet = wallet # 변수 앞에 __를 붙여서 비공개 속성으로 만듦
def pay(self, amount):
self.__wallet -= amount # 비공개 속성은 클래스 안의 메서드에서만 접근할 수 있음
print('이제 {0}원 남았네요.'.format(self.__wallet))
maria = Person('마리아', 20, '서울시 서초구 반포동', 10000)
maria.pay(3000)
속성뿐만 아니라 메서드도 이름이 __(밑줄 두 개)로 시작하면 클래스 안에서만 호출할 수 있는 비공개 메서드가 된다.
class Person:
def __greeting(self):
print('Hello')
def hello(self):
self.__greeting() # 클래스 안에서는 비공개 메서드를 호출할 수 있음
james = Person()
james.__greeting() # 에러: 클래스 바깥에서는 비공개 메서드를 호출할 수 없음