프로그램을 만들 때는 우선 "어떤 데이터를 활용하는가?"를 생각해야한다.
예) 병원 업무 프로그램을 만든다면 의사, 간호사, 환자, 예약 기록, 진료 기록, 입퇴원 기록 과 같은 데이터를 고려해야 한다.
- 객체 : 여러가지 속성을 가질 수 있는 대상을 객체(object)라고 한다.
- 클래스 : 객체를 만드는 도구로서 클래스를 통해 여러 개의 객체를 만들 수 있다. 동일한 클래스에서도 서로 다른 값을 가진 객체가 만들어질 수 있다.
# 계산기 예시 코드
# 메서드만 사용했을 때
result = 0
result2 = 0
def cal_add(num):
global result
result += num
return result
def cal_add2(num):
global result2
result2 += num
return result2
print(cal_add(3))
print(cal_add(4))
print(cal_add2(3))
print(cal_add2(7))
# 결과값
# 3
# 7
# 3
# 10
# 클래스를 사용헀을 때
class Calculator:
def __init__(self):
self.result = 0
def add(self, num):
self.result += num
return self.result
cal1 = Calculator()
cal2 = Calculator()
print(cal1.add(3))
print(cal1.add(4))
print(cal2.add(3))
print(cal2.add(7))
# 결과값
# 3
# 7
# 3
# 10
위의 코드를 보면 함수만 사용했을 때에는 똑같은 코드를 여러번 쳐야하는 상황이 오게된다.
하지만 아래의 코드를 보면 클래스로 활용했을 때 같은 코드를 여러번 치지않고 코드를 재사용해서 사용하기 때문에 클래스를 사용한다.
# 클래스 생성
class WaffleMachine:
pass
# 객체 = 클래스()
waffle = WaffleMachine()
# 메모리의 0x7fecb80c0c10에 저장된 WaffleMachine 객체
waffle
# 결과값
# <__main__.WaffleMachine at 0x7fecb80c0c10>
클래스의 구성
클래스는 객체가 가져야 할 구성요소를 모두 가지고 있어야 한다.
객체가 가져야 할 값과 기능
- 값 : 이름, 나이, 연락처, 주소 등 (변수)
- 기능 : 잔다, 먹는다, 공부한다, 달린다 등 (함수)
인스턴스 변수와 인스턴스 메서드
- 인스턴스 변수 : 클래스를 기반으로 만들어지는 모든 객체들이 각가 따로 저장하는 변수이다.
- 모든 인스턴스 변수는 self라는 키워드가 붙는다.
- self는 자기 자신을 나타내는 의미로 사용한다.
- 자신이 가지고 있는 속성과 기능에 접근할 때에는 self.식별자 형태로 접근한다.
- 모든 인스턴스 변수는 self라는 키워드가 붙는다.
- 인스턴스 메서드 : 각 객체가 사용할 수 있는 기능이다.
- 인스턴스 변수값에 따라서 각 객체마다 다르게 동작 한다.
- 첫 번째 매개변수로 self를 추가한다.
- 인스턴스 변수값에 따라서 각 객체마다 다르게 동작 한다.
# 예시 1. Person 클래스를 정의
class Person:
# 인스턴스 메소드 who_am_i
# 모든 person클래스의 객체는 who_am_i() 메소드를 호출할 수 있다
# self를 제외한 나머지 매개변수에 실제로 사용될 데이터가 전달된다
def who_am_i(self, name, age, tel, address):
# 인스턴스 변수 name
# = 오른쪽에 있는 name은 매개변수의 name
# who_am_i() 메소드를 전달할 때 전달된 name이 객체의 name이 된다
self.name = name
self.age = age
self.tel = tel
self.address = address
# 객체 bay가 생성한다.
boy = Person()
# 객체안에 변수들을 할당 한다.
boy.who_am_i("john", 15, "010-1234-1234", "seoul")
# 저장된 변수 꺼내기
boy.name
# 결과값
# 'johe'
boy.age
# 결과값
# 15
boy.tel
# 결과값
# '010-1234-1234'
boy.address
# 결과값
# 'seoul'
# 예시 2
class Computer:
def set_spec(self, cpu, ram, vga, ssd):
self.cpu = cpu
self.ram = ram
self.vga = vga
self.ssd = ssd
def hardware_info(self):
print(f"CPU = {self.cpu}")
print(f"RAM = {self.ram}")
print(f"VGA = {self.vga}")
print(f"SSD = {self.ssd}")
desktop = Computer()
desktop.set_spec("i7", "16GB", "GTX3060", "512GB")
desktop.hardware_info()
# 결과값
# CPU = i7
# RAM = 16GB
# VGA = GTX3060
# SSD = 512GB
notebook = Computer()
notebook.set_spec("i5", "8GB", "MX300", "256GB")
notebook.hardware_info()
# 결과값
# CPU = i5
# RAM = 8GB
# VGA = MX300
# SSD = 256GB
# 객체에서 사용할 인스턴스 변수 생성
class FourCal:
def set_data(self, first, second): # 메소드의 매개변수
# 메소드의 수행문
self.first = first
self.second = second
def add(self):
result = self.first + self.second
return result
def mul(self):
result = self.first - self.second
return result
def sub(self):
result = self.first * self.second
return result
def div(self):
result = self.first / self.second
return result
cal = FourCal()
cal.set_data(4, 2)
print(cal.first)
print(cal.second)
print(cal.add())
print(cal.mul())
print(cal.sub())
print(cal.div())
# 결과값
# 4
# 2
# 6
# 2
# 8
# 2.0
test_cal = FourCal()
test_cal.set_data(3, 7)
print(test_cal.first)
print(test_cal.second)
print(test_cal.add())
print(test_cal.mul())
print(test_cal.sub())
print(test_cal.div())
# 결과값
# 3
# 7
# 10
# -4
# 21
# 0.42857142857142855
# 다른 객체의 영향을 받지 않고 원래읙 밧을 유지함
print(cal.first)
# 결과값
# 4
cal1 = FourCal()
cal2 = FourCal()
cal1.set_data(4, 2)
cal2.set_data(3, 8)
print(cal1.add())
print(cal1.mul())
print(cal1.sub())
print(cal1.div())
# 결과값
# 6
# 2
# 8
# 2.0
print(cal2.add())
print(cal2.mul())
print(cal2.sub())
print(cal2.div())
# 결과값
# 11
# -5
# 24
# 0.375
생성자
객체가 생성될 때 자동으로 호출되는 메서드이다.
# set_data() 메소드를 실행해야만 fisrt 와 second가 생성됨
test_const = FourCal()
test_const.add()
# 결과값
# AttributeError: 'FourCal' object has no attribute 'first'
이 코드는 위의 계산기 코드를 실행한 것인데 오류가 난다.
그 이유는 set_data()라는 메서드로 first 값과 second 값을 집어넣은 뒤에 실행을 시켜야 메서드의 수행문이 실행하는데 그 값이 없기 때문에 어떤 값을 계산할지 몰라서 오류가 발생하게 된다.
저런 오류를 줄이기 위해서 생성자를 사용해서 객체를 생성할 때부터 값을 넣어두고 실행을 해야한다.
class FourCal:
def __init__(self, first, second): # 생성자
self.first = first
self.second = second
def set_data(self, first, second):
self.first = first
self.second = second
def add(self):
result = self.first + self.second
return result
def mul(self):
result = self.first - self.second
return result
def sub(self):
result = self.first * self.second
return result
def div(self):
result = self.first / self.second
return result
# 생성자의 매개변수를 전달해야 객체를 생성할 수 있음
test_const = FourCal()
# 결과값
# TypeError: FourCal.__init__() missing 2 required positional arguments: 'first' and 'second'
# 생성자의 매개변수에 값 전달하기
test_const = FourCal(4, 2)
# 값 출력하기
print(test_const.first)
print(test_const.second)
print(test_const.add())
print(test_const.mul())
print(test_const.sub())
print(test_const.div())
# 결과값
# 4
# 2
# 6
# 2
# 8
# 2.0