객체
리스트는 변수(데이터)를 모으는 한 가지 방법이고 함수는 코드를 끊임없이 재사용 할 수 있는 방법을 제공함
객체(Object)는 함수와 데이터를 함께 묶는 한가지 방법
파이썬의 내부구조를 보면 거의 모든 것이 객체로 구 성됨
파이썬은 객체지향적(object-oriented) 언어임
현실 세계의 객체
객체란 무엇일까?
공을 예로 들면,
공은 들어올리거나 던지거나 발로 차거나 공기를 불어넣어 부풀릴 수 있음-> 행동(action)
색깔, 크기, 무게 => 속성(attribute)
파이썬의 객체
파이썬에서는 객체의 특징 또는 알고 있는 것을 속 성(attribute) 라고 하고 행동 또는 객체에 대해 할 수 있는 것을 가리켜 메서드(method)라고 함
공을 예로 들면
속성은
메서드는
속성이란 ?
속성은 공에 관해 알고 있는 것(또는 찾을 수 있는 것) 을 말함. 공의 속성은 숫자, 문자열 등과 같은 정보로 구성되어 있음
속성 표시
>>> print ball.size
속성에 값 할당
>>> ball.color = ‘green’
속성은 보통 객체가 아닌 변수에 할당
>>> myColor = ball.color
메서드란 ?
메서드는 객체를 통해 할 수 있는 것들
메서드는 어떤 일을 하기 위해 호출(call)할 수 있 는 코드 덩어리로 구성됨
메서드는 객체 안에 포함된 함수
인자를 전달하거나 값을 반환하는 것을 비롯해 다 른 함수를 통해 할 수 있는 일들은 메서드로 할 수 있음
따라서 객체 = 속성 + 메서드
객체 만들기
파이썬에서는 객체를 만들 때 두 가지 단계를 가짐
첫 번째
객체가 어떤 모습이고 어떻게 행동하는지(객체의 속 성과 메서드)를 정의함
정의만으로 객체가 만들어지지 않음(설계도와 같음)
객체의 설명이나 설계도를 클래스(class) 라고 함
두 번째
클래스를 이용해 실제 객체를 만듦(집을 만듦)
이 때 객체를 해당 클래스의 인스턴스(instance) 라 고 함
인스턴스를 생성 myBall = Ball( )
속성을 추가
myBall.direction = “down”
myBall.color = “green”
myBall.size = “small”
클래스와 인스턴스 만들기 예제
메서드
Ball 이라는 클래스를 만듦
Ball 클래스 사용하기
객체 초기화
공 객체를 만들었을 때 공 객체의 size, color, direction에는 아무것도 채워지지 않음.
객체를 생성하고 나서 이 속성을 채움
위의 방법 외에, 객체를 생성될 때 객체의 속성을 설 정하는 방법이 있음. 이를 초기화라고 함
클래스를 정의할 때 __init__( )라는 특별한 메서드를 정의하고 이를 이용해서 속성을 초기화 할 수 있음
__init__( ) 메서드는 클래스의 새 인스턴스가 만들어 질 때마다 실행됨
__init__( ) 메서드에 인자를 전달해서 원하는 특성을 갖는 인스턴스를 만들 수 있음
객체 초기화-계속
객체 초기화-계속
“마법“메서드: __str__( )
클래스를 만들 때 파이썬이 자동으로 포함시키 는 메서드: 특수 메서드
__init__( ), __str__( )
__str__( ) 메서드는 객체에 대해 print를 호출할 때 파이썬이 어떤 내용으로 표시할지 알려줌
인스턴스가 정의된 곳(__main__)
클래스 이름
인스턴스가 저장돼 있는 메모리상의 위치( 예:
0x00BB83A0)
print를 이용해 객체에 대한 다른 정보를 보여주 고 싶으면 직접 __str__( ) 를 정의할 수 있음
__str__( ) :객체가 출력하는 내용 변경
self란?
Ball 클래스를 이용해 두 개의 인스턴스 생성 cartersBall = Ball(“red”, “small”, “down”)
warrensBall = Ball(“green”, “medium”, “up”)
warrensBall.bounce( ) 를 실행(호출)하면 해당 메 서드(bounce( ) 는 어느 인스턴스에서 메서드를 호 출했는지를 알아야 함. 이 때 self 인자는 어느 객체 (이 경우 warrensBall)가 호출했는지를 알려줌
Ball.bounce(warrensBall)로 작성한 것과 동일
self의 이해
self의 이해:계속
객체에 메서드를 호출할 때 파이썬은 첫 번째 인 자가 호출한 객체가 되도록 만듦
초기화 메서드가 이제는 self.thing 이라는 속성에 값을 대입함
how_big 메서드는 self.thing의 길이를 반환
self를 사용해서 호출할 객체를 식별
self의 이해:계속
예제 클래스 – HotDog
HotDog 클래스에 몇 가지 속성과 메서드를 추가
속성
cooked_level: 핫도그의 구워진 상태
cooked_string: 핫도그의 상태를 나타내는 문자열
condiments: 핫도그 양념(케첩, 겨자소스 등) 목록
메서드
cook( ): 핫도그를 특정시간 동안 굽는다
add_condiment( ): 핫도그에 양념을 추가한다
__init__( ): 인스턴스를 생성하고 기본 특성을 설정한다
__str__( ): print 출력 결과를 더 보기 좋게 만든다
예제 클래스 – HotDog(계속)
첫 번째, __init__( ) 메서드 설정
핫도그를 굽는 메서드 설정
핫도그 전체 프로그램
핫도그 프로그램 실행하기
실행결과는
>>>
0 <- cooked_level 값 Raw <- cooked_string [ ] <- condiments
아래 내용을 예제에 추가한 뒤 실행 한 뒤 결과 확인하기 print “Now I’m going to cook the hot dog”
myDog.cook(4)
print myDog.cooked_level print myDog.cooked_string
데이터 숨기기
객체 안에 들어 있는 데이터(속성)을 보거나 변 경하는 두 가지 방법이 있음
myDog.cooked_level = 5 #직접 접근
myDog.cook(5) #메서드 이용
속성을 직접 수정하면
관계되는 모든 것을 직접 수정해야 하며
이치에 맞지 않는(구운 핫도그를 되돌리는) 상황 이 발생할 수 있음
메서드로만 데이터를 획득하거나 변경할 수 있 도록 객체의 데이터 접근을 제한하는 것을 데이 터 은닉(data hidging)이라고 함
다형성 : 동일한 메서드, 다른 동작 방식
다형성은 서로 다른 클래스에 이름이 같은 두 개(또 는 그 이상)의 메서드를 둘 수 있는 것을 말함
상속 : 부모로부터 배우기
객체지향 프로그래밍에서는 클래스는 다른 클래 스로부터 속성과 메서드를 물려 받을 수 있음.
다른 클래스로부터 속성과 메서드를 물려 받는 클 래스를 파생클래스(derived class) 또는 하위 클 래스(subclass)라고 함
상속 맛보기
super.__init__(self,”coin”) 으로도 표현
미리 생각하기
메서드(또는 함수)에 실제 코드를 넣지 않고 해 당 메서드에서 해야 할 일을 설명하는 주석만 작 성하는 방법: 코드 토막(code stub)
“pass” 키워드는 코드 토막을 만들 때 자리를 채 우는 용도로 사용함
도전과제
BankAccount 라는 클래스를 정의하시오. 이 클 래스에는 은행계좌의 이름(문자열), 계좌번호(문 자열이나 숫자), 잔액(실수)에 대한 속성이 있어 야 함. 그리고 잔액을 표시하고 입금과 출금을 수행하는 메서드가 있어야 함
도전과제 해답
# Copyright Warren & Carter Sande, 2013
# Released under MIT license http://www.opensource.org/licenses/mit- license.php
class BankAccount:
def __init__(self, acct_number, acct_name):
self.acct_number = acct_number self.acct_name = acct_name
self.balance = 0.0 def displayBalance(self):
print "The account balance is:", self.balance def deposit(self, amount):
self.balance = self.balance + amount print "You deposited", amount
print "The new balance is:", self.balance
해답 계속
def withdraw(self, amount):
if self.balance >= amount:
self.balance = self.balance - amount print "You withdrew", amount
print "The new balance is:", self.balance else:
print "You tried to withdraw", amount
print "The account balance is:", self.balance print "Withdrawl denied. Not enough funds."
myAccount = BankAccount(234567, "Warren Sande") print "Account name:", myAccount.acct_name
print "Account number:", myAccount.acct_number myAccount.displayBalance()
myAccount.deposit(34.52) myAccount.withdraw(12.25) myAccount.withdraw(30.18)