abt Python/기초
python 객체와 클래스
cloudin
2023. 8. 10. 20:13
객체와 클래스
- 객체란 속성(상태, 특징)과 행위(행동, 동작, 기능)로 구성
- 클래스는 객체를 만들기 위해 활용되며, 객체의 공통된 속성과 행위를 변수와 함수로 정의한 것
- 클래스 선언
class Car():
def moves(self, speed):
print("자동차: 시속{}킬로 미터로 전진".format(speed))
def turn(self, direction):
print("자동차: {}로 회전".format(direction))
def stop(self):
print("자동차({0},{1}): 정지".format(self.wheel_size, self.color))
my_car=Car()
my_car.wheel_size=18
my_car.color="yellow"
my_car.moves(40)
my_car.turn("left")
my_car.stop()
# 자동차: 시속40킬로 미터로 전진
# 자동차: left로 회전
# 자동차(18,yellow): 정지
- 초기화 함수 __init()__을 통해 객체를 생성하고 속성값을 지정할 수 있음
- __init()__함수를 통해 객체의 불변성을 확립하여 활용하는 것이 좋음
# 객체 초기화
class Car():
def __init__(self, wheel, color): # 객체를 처음 지정할 때 받는 인자
self.wheel=wheel
self.color=color # 초기값 지정
def moves(self, speed):
print("자동차: 시속{}킬로 미터로 전진".format(speed))
def turn(self, direction):
print("자동차: {}방향으로 회전".format(direction))
def stop(self):
print("자동차({0},{1}): 정지".format(self.wheel, self.color))
my_car=Car(19,"Black")
my_car.moves(70)
my_car.turn("left")
my_car.stop()
# 자동차: 시속70킬로 미터로 전진
# 자동차: left방향으로 회전
# 자동차(19,Black): 정지
- 객체 생성 및 활용
# 객체명 = 클래스명() : 선언된 클래스로부터 클래스의 인스턴스의 객체를 생성
# 객체명.변수명 = 속성값 : 객체에 속성을 설정
# 객체명.변수명 : 객체의 변수에 접근하여 객체의 속성을 가져옴
# 객체명.매서드명[(인자1, 인자2, ...., 인자n)] : 객체의 매서드를 호출하는 방법
# 클래스를 구성하는 변수와 함수
# 1. 클래스 변수 : 클래스 내에 있지만 함수 밖에서 "변수명=데이터" 형식으로 정의
# 클래스에서 생성한 모든 객체가 공동으로 사용
# "클래스명.변수명" 형식으로 사용
# 2. 인스턴스 변수 : 클래스 내의 함수 안에서 "self.변수명=데이터" 형식으로 정의
# 클래스 내의 모든 함수에서 "self.변수명"로 접근하고 "객체명.변수명" 형식으로 사용
class Car1():
instance_count = 0
def __init__(self, wheel, color):
self.wheel = wheel # 첫번째 instance의 size : 인스턴스 변수
self.color = color # 첫번째 instance의 color : 인스턴스 변수
Car1.instance_count = Car1.instance_count + 1 # 클래스 변수
print("자동차 개체 수:{}".format(Car1.instance_count))
def moves(self, speed):
print("자동차: 시속{}킬로 미터로 전진".format(speed))
def turn(self, direction):
print("자동차: {}방향으로 회전".format(direction))
def stop(self):
print("자동차({0},{1}): 정지".format(self.wheel, self.color))
car1 = Car1(16, "green")
car2 = Car1(18, "pink")
# 자동차 개체 수:1
# 자동차 개체 수:2
car1.moves(30)
# 자동차: 시속30킬로 미터로 전진
car2.moves(50)
# 자동차: 시속50킬로 미터로 전진
class Car2():
count = 0 # 클래스 변수
def __init__(self, wheel, color, num):
self.wheel = wheel # 인스턴스 변수
self.color = color # 인스턴스 변수
self.count = num # 인스턴스 변수
Car2.count = Car2.count + 1 # 클래스 변수
print("({0},{1})자동차 개체 수 Car2.count={2}".format(self.wheel, self.color, Car2.count))
print("({0},{1})자동차의 인원의 수:self.count={2}".format(self.wheel, self.color, self.count))
car1 = Car2(18, "red", 2)
car2 = Car2(20, "Olive", 8)
# (18,red)자동차 개체 수 Car2.count=1
# (18,red)자동차의 인원의 수:self.count=2
# (20,Olive)자동차 개체 수 Car2.count=2
# (20,Olive)자동차의 인원의 수:self.count=8
- 클래스에서 정의하는 함수(매서드)는 그 기능과 사용법에 따라 인스턴스 매서드, 정적 매서드, 클래스 매서드 3가지로 분류
- 인스턴스 매서드 : 각 객체에서 개별적으로 동작하는 함수를 만들고자 할 때 사용하는 함수로 함수를 정의할 때 첫 인자로 self가 필요함
- 정적 매서드 : 날짜 및 시간 정보 제공, 단위 변환 등과 같이 객체와 관계없이 독립적으로 동작하는 함수를 만들 때 주로 이용, 객체를 생성한 후에 정적 매서드를 호출할 수 있지만 아래와 같이 보통 객체를 생성하지 않고 클래스명을 이용하여 호출
- 클래스 매서드 : 클래스 변수를 사용하기 위한 함수로 첫번째 인자로 cls를 삽입 해야함. 또한 클래스 매서드를 사용하기 위해서는 @classmathod를 데코레이터로 활용해야 함, 객체를 생성하지 않고 바로 호출 가능
# 1. 인스턴스 매서드(instance method) : 각 객체에서 개별적으로 동작하는 함수를 만들고자 할 때 사용
# "self [인자1], [인자2],...." 로 정의 self는 인스턴스(객체)를 의미
# "self.함수명()" 형식으로 호출
class Car2():
count = 0 # 클래스 변수
def __init__(self, wheel, color, num): # 각각의 객체를 정의하는 함수이므로 인스턴스 함수
self.wheel = wheel # 인스턴스 변수
self.color = color # 인스턴스 변수
self.count = num # 인스턴스 변수
Car2.count = Car2.count + 1 # 클래스 변수
print("({0},{1})자동차 개체 수 Car2.count={2}".format(self.wheel, self.color, Car2.count))
print("({0},{1})자동차의 인원의 수:self.count={2}".format(self.wheel, self.color, self.count))
def move(self, speed):
self.speed = speed
print("자동차 ({0},{1})가 시속 {2}킬로로 주행".format(self.wheel, self.color, self.speed))
def auto_curise(self): # 인자가 없는 인스턴스 함수
print("자율 주행 모드 입니다.")
self.move(self.speed)
car1 = Car2(16, "yellow", 2)
car2 = Car2(20, "Olive", 8)
# (16,yellow)자동차 개체 수 Car2.count=1
# (16,yellow)자동차의 인원의 수:self.count=2
# (20,Olive)자동차 개체 수 Car2.count=2
# (20,Olive)자동차의 인원의 수:self.count=8
car1.move(80)
# 자동차 (16,yellow)가 시속 80킬로로 주행
car1.auto_curise()
# 자율 주행 모드 입니다.
# 자동차 (16,yellow)가 시속 80 킬로로 주행
# 2. 정적 매서드(static method) : 클래스와 관련이 있어 클래스 안에서 정의하지만 클래스나 인스턴스와는 무관하게 독립적으로 동작하는 함수
# @staticmethod 로 선언한 후 함수를 정의
# "클래스.정적매서드()"으로 호출
class Car2():
@staticmethod
def check_type(model_code):
if(model_code >= 20):
print("전기차 입니다.")
elif(10<=model_code<20):
print("가솔린차 입니다.")
else:
print("디젤차 입니다.")
Car2.check_type(25)
# 전기차 입니다.
Car2.check_type(9)
# 디젤차 입니다.
# 3. 클래스 매서드(class method) : 클래스 변수를 사용하기 위한 함수
# @classmethod 로 선언한 후 "함수명(cls)" 로 정의
# "클래스.클래스매서드명()"으로 호출
class Car2():
count = 0 # 클래스 변수
def __init__(self, wheel, color, num): # 각각의 객체를 정의하는 함수이므로 인스턴스 함수
self.wheel = wheel # 인스턴스 변수
self.color = color # 인스턴스 변수
self.count = num # 인스턴스 변수
Car2.count = Car2.count + 1 # 클래스 변수
print("({0},{1})자동차 개체 수 Car2.count={2}".format(self.wheel, self.color, Car2.count))
print("({0},{1})자동차의 인원의 수:self.count={2}".format(self.wheel, self.color, self.count))
def move(self, speed):
self.speed = speed
print("자동차 ({0},{1})가 시속 {2}킬로로 주행".format(self.wheel, self.color, self.speed))
def auto_curise(self): # 인자가 없는 인스턴스 함수
print("자율 주행 모드 입니다.")
self.move(self.speed)
@staticmethod
def check_type(model_code):
if(model_code >= 20):
print("전기차 입니다.")
elif(10<=model_code<20):
print("가솔린차 입니다.")
else:
print("디젤차 입니다.")
@classmethod
def instance_count(cls):
print("자동차의 개체수는 :{}".format(cls.count))
Car2.instance_count()
# 자동차 개체수는 :0
car1 = Car2(19,"white",2)
# (19,white)자동차 개체 수 Car2.count=1
# (19,white)자동차의 인원의 수:self.count=2
Car2.instance_count()
# 자동차의 개체수는 :1
- 객체와 클래스는 코드 작성의 관리와 편함을 위해 사용함
- 작은 규모일 경우 사용하지 않아도 무관하나 클 경우에는 꼭 필요
- 자식클래스는 부모클래스의 속성(변수)과 행위(함수)를 그대로 활용할 수 있음
# 자식클래스는 부모클래스의 속성(변수)과 행위(함수)를 그대로 활용할 수 있음
class RoboticCar(Car2): # RoboticCar : 자식클래스, Car2 : 부모클래스
def __init__(self, wheel, color, num, state):
Car2.__init__(self, wheel, color, num)
# super().__init__(wheel, color, num) 으로 써도 된다.
self.state = state
def robotic(self):
self.state = "Robotic"
print("자동차:무인.state={0}".format(self.state))
def human(self):
self.state = "Human"
print("자동차:유인.state={0}".format(self.state))
Robotic_car=RoboticCar(17,"white",4,"Robotic")
#(17,white)자동차 개체 수 Car2.count=3
# (17,white)자동차의 인원의 수:self.count=4
Robotic_car.robotic()
# 자동차:무인.state=Robotic
- 클래스 상속 : 이미 만들어진 클래스의 변수, 함수를 이어받아 사용하는 것