1. 객체(Object)의 개념
: 어떤 속성과 행동을 가지고 있는 데이터
: 수많은 사물을 프로그래밍 관점에서 객체라고 부름
: 인스턴스(Instance) 라고 부르기도 함
▶ 거북이 객체
import turtle
turtle.shape("circle") # 거북이를 원 모양으로 설정
turtle.shape() # 거북이의 현재 모양 확인
turtle.goto(100,100) # 거북이의 좌표 이동
turtle.xcor() # 거북이의 현재 X좌표 확인
turtle.ycor() # 거북이의 현재 Y좌표 확인
▶ 문자열 객체
myStr = "FirstMyLife" # 문자열 객체에 값을 대입
myStr.upper() # 문자열 객체를 대문자로 변환
myStr.count('i') # 문자에서 i가 몇 번 나왔는지 셈
myStr.isalpha() # 문자열 객체가 모두 영문자로 이루어졌는지 체크
2. 클래스와 객체의 관계
* 클래스
: 객체를 만들기 위한 설계도 또는 찍어내는 틀을 의미함
[토끼 클래스 생성해보기]
→ 토끼 클래스는 파이썬에서 제공하지 않으니 직접 한 번 만들어보자!
* 클래스를 만들기 위한 형식
class 클래스명 :
# 클래스 생성코드 구현
[연습문제_깡충깡충 뛰어다니는 토끼 만들기]
* 토끼 클래스에 필요한 속성과 행동
√ 속성(변수) : 토끼의 모양, X,Y의 위치 → 변수로 생성
√ 기능(행동): 이동하기( ) → 함수(메소드)로 구현
class Rabbit :
# 토끼의 속성(변수)
모양 = "" # 토끼 모양
X위치 = 0 # X위치
Y위치 = 0 # Y위치
# 토끼의 행동(메소드)
def goto(self,x,y) : # 토끼를 이동할 좌표로 이동시키는 코드
self.xPos = x
self.yPos = y
# 토끼 객체화
rabbit1 = Rabbit()
rabbit2 = Rabbit()
rabbit3 = Rabbit()
* 각 토끼(객체)는 별도의 속성과 메소드가 존재하므로 별도의 값을 대입
: 각각의 토끼는 객체이름.속성이름으로 접근 가능
: 각각의 토끼의 메소드는 객체이름.메소드이름() 형식을 사용
## 클래스 및 함수 선언부
class Rabbit :
# 토끼의 속성(변수)
모양 = "" # 토끼 모양
X위치 = 0 # X위치
Y위치 = 0 # Y위치
# 토끼의 행동(메소드)
def goto(self,x,y) : # 토끼를 이동할 좌표로 이동시키는 코드
self.xPos = x
self.yPos = y
## 전역변수 선언부
rabbit1 = None
userxX, userY = 0,0
## 메인코드
rabbit = Rabbit()
rabbit.shape = "토끼"
while True :
userX = int(input("토끼가 이동할 X좌표 => "))
userY = int(input("토끼가 이동할 X좌표 => "))
rabbit.goto(userX, userY)
print("**토끼의 현재 위치는 (",str(userX), ",", str(userY), ")")
3. 생성자와 특별한 메소드
* 생성자의 개념
: 객체를 생성하면 무조건 호출되는 메소드를 의미
: 객체를 생성하면 변수의 값을 초기화하는 메소드
: 생성자로 초기화를 하면 코드가 간결해짐
: 생성자는 클래스 안에서 __init__() 라는 이름으로 지정되어 있음
※ __init__()은 앞뒤에 언더바(_)가 2개씩 있음. init은 Initialize의 약자로 초기화한다는 의미를 가짐
class 클래스명 :
def __init__(self) :
# 초기화할 코드 입력
▶ 생성자의 형태
class Rabbit :
shape = "" # 토끼 모양
xPos = 0 # X위치
yPos = 0 # Y위치
def __init__(self) :
self.shape = "토끼"
def goto(self, x, y) :
self.xPos = x
self.yPos = y
rabbit = Rabbit() # 토끼 객체 생성
print('rabbit의 모양:', rabbit.shape)
[연습문제_대문자는 소문자로, 소문자는 대문자로 만드는 class 만들어보기(1)]
class replace :
def __init__(self, str) :
self.str = str
def replace1(self) :
result = self.str.upper()
return result
def replace2(self) :
result = self.str.lower()
return result
str1 = replace("dkdkdkdkdkdk")
str1.replace1()
str1.replace2()
[연습문제_대문자는 소문자로, 소문자는 대문자로 만드는 class 만들어보기(2)]
class replace :
def __init__(self) :
pass
def replace1(self, str) :
return str.upper()
def replace2(self,str) :
return str.lower()
result = replace()
print(result.replace1("abcd"))
print(result.replace2("ABCD"))
▶ 매개변수가 있는 생성자
class Rabbit :
shape = ""
xPos = 0
yPos = 0
def __init__(self, value) : # 매개변수가 1개 들어감
self.shape = value
def goto(self, x, y) :
self.xPos = x
self.yPos = y
rabbit1 = Rabbit("원")
print("rabbit1의 모양: ", rabbit1.shape)
rabbit2 = Rabbit("삼각형")
print("rabbit1의 모양: ", rabbit2.shape)
rabbit3 = Rabbit("토끼")
print("rabbit1의 모양: ", rabbit3.shape)
▶ __del__() 메소드
: __init__() 메소드가 생성자라면 __del()__ 메소드는 소멸자라고 부름
: __del__() 은 객체가 제거될 때 자동으로 호출됨
class Rabbit :
shape = ""
def __del__(self) :
print("이제", self.shape, "는 자유에요~~")
rabbit = Rabbit()
rabbit.shape = "도비"
del(rabbit)
▶ __add__() 메소드
: 객체끼리 덧셈을 할 경우에 실행되는 메소드
class Rabbit :
shape = ""
def __add__(self, other) :
print("객체", self.shape,"와", other.shape, "가 친구가 되었습니다.")
rabbit1 = Rabbit()
rabbit1.shape = "엽기토끼"
rabbit2 = Rabbit()
rabbit2.shape = "도비"
rabbit1 + rabbit2
▶ 특별한 메소드
: 비교 메소드
→ 객체 사이의 비교 연산자가 사용될 때 호출되는 메소드
비교연산자 | 메소드 |
< | __lt__() |
<= | __le__() |
> | __gt__() |
>= | __ge__() |
== | __eq__() |
!= | __ne__() |
4. 클래스와 상속
* 상속의 개념
: 기존의 클래스가 가지고 있는 속성과 행동을 그대로 물려받는 새로운 클래스를 만드는 것을 의미
: 상속을 받은 이후에는 새로운 클래스에서 추가로 속성이나 행동을 만들어서 사용할 수도 있음
▶ 상속 구현하기
class 서브클래스(슈퍼클래스) :
# 서브클래스 코드 구현
[연습문제_집토끼와 산토끼]
# 상속 구현하기
class Rabbit :
shape = ""
xPos = 0
yPos = 0
def goto(self, x, y) :
self.xPos = x
self.yPos = y
class HouseRabbit(Rabbit) :
owner = ""
def eatFeed() :
print("집토끼가 모이를 먹습니다")
class MountainRabbit(Rabbit) :
mountain = ""
def eatWildgrass() :
print("산토끼가 들풀을 먹습니다")
# 서브 클래스 객체 생성
hRabbit = HouseRabbit()
mRabbit = MountainRabbit()
# 두 객체 사용하기
hRabbit.shape = "원"
mRabbit.goto(100,100)
댓글