구분 | 설명 | 예시 |
---|---|---|
클래스 class | 객체를 생성하기 위한 틀 | 핸드폰 |
객체 object | 클래스로 선언된 변수 | 갤럭시, 아이폰 |
인스턴스 Instance | 클래스로부터 생성된 객체 | |
메소드 Method | Class Body 안에서 정의되는 함수 | 계산 기능, 검색 기능 |
속성 Attribute | 객체가 가진 데이터 (특징). 변수 | 크기, 색상, 가격 |
class ClassName :
def method_name(self) :
method_body
class_body
object = ClassName()
class ClassName :
attr1 = 0 # 클래스 (지역) 변수 선언 및 초기화
attr2 = 0
# 생성자 (객체 생성)
def __init__(self, param1, param2)
self.attr1 = param1 # 인스턴스 변수 생성 및 초기화
self.attr2 = param2
# 메소드 (클래스 함수)
def plus(self) :
attr3 = self.attr1 + self.attr2
return attr3
# 소멸자 (기본적으로 설정되어 있긴 함)
def __del__(self) :
del self.attr1
del self.attr2
__init__
초기화 함수 : 인스턴스를 만들 때 실행되는 함수__str__
문자열화 함수 : 인스턴스 자체를 출력 할 때의 형식을 지정해주는 함수class Human( ):
'''인간'''
def __init__( self, name, weight ):
'''초기화 함수'''
self.name = name
self.weight = weight
def __str__( self )
'''문자열화 함수'''
return "{} ( 몸무게 {}kg )".format( self.name, self.weight )
person = Human( "사람", 60.5 ) # 초기화 함수 사용
print( person ) # 문자열화 함수 사용
파이썬에서는 __str__
메소드를 사용해 class 내부에서 출력 format을 지정할 수 있다.
class Coord(object):
def __init__ (self, x, y):
self.x, self.y = x, y
def __str__ (self):
return '({}, {})'.format(self.x, self.y)
point = Coord(1, 2)
소괄호 ()
를 붙여서 만듦self
로 지정클래스의 인스턴스의 attribute로서 호출되면, 그 메서드는 첫 번째 인자로 인스턴스 객체 self
를 받는다. 첫 번째 인자를 설정하지 않으면 에러가 발생한다. 이 첫 번째 인자를 self
라고 쓴다.
메소드가 클래스의 인스턴스로 호출이 되고 첫 번째 파라미터인 self
로 인스턴스 자기자신이 자동으로 전달되는 방식이다. self.함수명()
형식으로 클래스 내외 다른 함수를 호출할 수 있다.
@classmethod
데코레이터 지정해야 사용 가능cls
= 클래스 자체
메서드 안에서 클래스 속성, 클래스 메서드에 접근해야 할 때 사용하고, 클래스 생성자에 다른 형태의 파라미터를 전달하기위해 사용한다.
@staticmethod
데코레이터 지정해야 사용정적 메소드는 클래스와 관련이 있어서 클래스 안에 두기는 하지만 클래스나 클래스의 인스턴스(객체)와는 무관하게 독립적으로 동작하는 함수이다.
객체 생성 시에 따로 초기화할 속성 값을 전달하지 않으면 기존에 정의한 속성 값으로 객체의 속성을 정의한다는 의미를 갖는다. 유틸리티 메서드를 구현할 때 많이 사용한다.
class Store:
def __init__(self, menu1, menu2):
self.menu1 = menu1
self.menu2 = menu2
def total_order(self):
return (self.menu1 + self.menu2)
@classmethod
def same4each(cls, double):
return cls(double, double)
@staticmethod
def nameofstore():
print("가게 이름")
Order = Store(3,2)
Order.nameofstore()
5
가게 이름
__init__
메서드 안에서 self.속성
에 값
을 할당하여 생성인스턴스.속성 = 값
class ClassName :
def __init__(self) :
self.속성 = 값
__
를 붙이면 됨이미 만들어진 클래스의 변수와 함수를 그대로 이어받고 새로운 내용만 추가하여 클래스를 선언할 수 있다. 필요한 경우에는 super() 함수를 사용하여 부모 클래스의 메소드를 명시적으로 호출할 수도 있다.
class 부모클래스 :
코드 블록 (속성, 메소드 정의)
class 자식클래스(부모클래스) :
코드 블록 (추가적인 속성, 메소드 정의)
클래스 상속은 기존 클래스를 확장하고 재사용하는 방법이다. 상속은 코드의 재사용성을 높이고 유지보수를 용이하게 하는 데 도움을 준다.
자식 클래스에서 부모 클래스의 내용을 사용하고 싶은 경우 :
super().부모클래스내용
으로 호출하여 사용한다.
[예제] 여러 종류의 게임 캐릭터 만들기
class Character :
def __init__(self, name, health) :
self.name = name
self.health = health
def attack(self) :
print(f"{self.name}이(가) 공격합니다.")
# 자식 클래스에서 attact() 메소드를 재정의(Override)할 수 있다.
class Warrior(Character) :
def __init__(self, name, health, strength) :
super().__init__(name, health)
self.strength = strength
def attack(self) :
super().attack()
print(f"{self.name}의 강력한 공격!")
class Mage(Character) :
def __init__(self, name, health, magic_power) :
super().__init__(name, health)
self.magic_power = magic_power
def attack(self) :
super().attack()
print(f"{self.name}의 마법 공격!")
각 클래스를 인스턴스화하여 캐릭터 객체를 생성하고 메소드를 호출할 수 있다.
player1 = Warrior("전사", 100, 10)
player2 = Mage("마법사", 80, 15)
player1.attack()
player2.attack()
전사이(가) 공격합니다.
전사의 강력한 공격!
마법사이(가) 공격합니다.
마법사의 마법 공격!
코드 작성과 관리가 편하기 때문이다. 작은 규모의 프로그램을 만들 때는 괜찮지만, 규모가 커지면 클래스와 객체를 많이 이용한다. 또한 게임의 캐릭터와 같이 유사한 객체가 많은 프로그램을 만들 때도 주로 클래스와 객체를 이용해 코드를 작성한다.
# 예시 상황
로봇의 속성 : 이름, 위치
로봇의 동작 : 한 칸 이동
# 클래스, 객체 사용 X
robot_name = "R1"
robot_posi = 0
def robot_move() :
global robot_posi
robot_posi = robot_posi + 1
print("{0} position : {1}".format(robot_name, robot_posi))
robot_move()
# R1 position : 1
만약 로봇을 한 대 더 추가하려면 위 cell의 내용을 그대로 한 번 더 적어야 한다.
# 클래스, 객체 사용
class Robot() :
def __init__ (self, name, posi) :
self.name = name
self.posi = posi
def move(self) :
self.posi = self.posi + 1
print("{0} position : {1}".format(self.name, self.posi))
robot1 = Robot("R1", 0)
만약 로봇을 한 대 더 추가하려면
robot2 = Robot("R2", 0) 만 추가하면 된다.