본문 바로가기
Python

파이썬 클래스

by 승환파크 2023. 5. 8.

프로그램을 만들 때는 우선 "어떤 데이터를 활용하는가?"를 생각해야한다.

예) 병원 업무 프로그램을 만든다면 의사, 간호사, 환자, 예약 기록, 진료 기록, 입퇴원 기록 과 같은 데이터를 고려해야 한다.

 

  • 객체 : 여러가지 속성을 가질 수 있는 대상을 객체(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를 추가한다.
# 예시 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

'Python' 카테고리의 다른 글

파이썬 예외처리  (0) 2023.05.09
파이썬 모듈  (1) 2023.05.08
파이썬 내장함수  (1) 2023.05.08
파이썬 데이터 입출력  (0) 2023.05.08
파이썬 함수  (1) 2023.05.08