1. 클래스란?

오랜만에 보시죠?
이미지의 캐릭터 ‘T퍼랩법사T’를 드디어 만들어 봅시다!
< 캐릭터 요구사항 >
1. 이름, 체력, 최대 체력 값을 각각 저장해 주세요.
2. 1번을 입력하면 포션1을 사용합니다. 포션1은 한번에 150 회복 가능합니다.
3. 2번을 입력하면 포션2을 사용합니다. 포션2은 한번에 100 회복 가능합니다.
4. 포션은 최대 최력 이상으로 회복 시킬 수 없습니다.
5. 사용자가 "stop"을 입력하기 전까지 포션을 먹을 수 있게 해주세요.(사용자는 "stop", "1", "2" 셋중 하나만 입력합니다.)
6. 포션에 관련된 실행들은 함수로 구현해주세요(파라미터로 포션의 종류를 받습니다)
< 정답 코드 >
name = "T퍼랩법사T"
hp = 691
max_hp = 795
def use_potion(potion_type):
global hp
if potion_type == 1:
hp += 150
elif potion_type == 2:
hp += 100
if hp > max_hp:
hp = max_hp
while True:
user_input = input()
if user_input ="stop":
break
use_potion(int(user_input))
어려웠죠?
그래도 이를 잘 활용해서 “P퍼랩법사P”라는 새로운 캐릭터를 만들어 봅시다.
P퍼랩법사P는 최대 최력이 690 이고 현재 체력은 540이 있습니다.
< 캐릭터 요구사항 >
1. 이름, 체력, 최대 체력 값을 각각 저장해 주세요.
2. 1번을 입력하면 포션1을 사용합니다. 포션1은 한번에 150 회복 가능합니다.
3. 2번을 입력하면 포션2을 사용합니다. 포션2은 한번에 100 회복 가능합니다.
4. 포션은 최대 최력 이상으로 회복 시킬 수 없습니다.
5. 사용자가 "stop"을 입력하기 전까지 포션을 먹을 수 있게 해주세요.(사용자는 "stop", "1", "2" 셋중 하나만 입력합니다.)
6. 포션에 관련된 실행들은 함수로 구현해주세요(파라미터로 포션의 종류를 받습니다)
< 정답 코드 >
name = "P퍼랩법사P"
hp = 540
max_hp = 690
def use_potion(potion_type):
global hp
if potion_type == 1:
hp += 150
elif potion_type == 2:
hp += 100
if hp > max_hp:
hp = max_hp
while True:
user_input = input()
if user_input ="stop":
break
use_potion(int(user_input))
잘 하셨을 거라고 믿습니다…
그런데 이런 식으로 코딩하면 치명적인 문제점이 있습니다.
- T퍼랩법사T 데이터는 잘 있죠?
- 게임 계정이 적어도 100개는 될 텐데… 그 때마다 이거 코드 쳐야해요?
이런 문제를 해결하기 위해서 클래스가 존재합니다.

클래스는 보통 붕어빵 틀 이라고 비유를 많이 합니다.
코드를 만들어 놓고 필요할 때마다 해당 코드를 찍어낸다는 것이죠.
이때 만들어 놓은 코드(붕어빵 틀)를 클래스를 통해 만들 수 있습니다.
클래스를 통해 복제되어 나온 붕어빵을 인스턴스 라고 합니다.
2. 클래스 정의하는 방법
이제 실제 클래스를 활용하여 붕어빵 틀을 만들어 봅시다.
class 클래스명:
# 초기화 함수
def __init__(self, ):
코드...
# 필요한 기능 구현
def 필요 함수(self, ):
코드 ...
# 인스턴스 생성
인스턴스1 = 클래스명()
인스턴스2 = 클래스명()
...
이런 형태로 클래스가 정의되고 인스턴스가 생성됩니다.
클래스에서 중요한 기능이 __init__()함수와 self 입니다.
차례로 알아봅시다.
3. init() 함수
__init__() 함수는 클래스가 생성 되자마자 실행 명령을 따로 안해줘도 바로 실행되는 함수 입니다.
특히, __init__() 함수의 파라미터는 인스턴스가 생성될 때 필요한 데이터들을 전달 받을 수 있습니다.
따라서 init() 함수는 변수 정의(= 필요 데이터 저장)가 일어나는 함수라고 할 수 있습니다.
”T퍼랩법사T” 와 “P퍼랩법사P”의 이름, 체력, 최대체력 변수를 클래스를 활용하여 저장하는 코드를 살펴 봅시다.
class Character:
def __init__(self, name, hp, max_hp):
name = name
hp = hp
max_hp = max_hp
print(name, hp, max_hp)
character_1 = Character("T퍼랩법사T", 691, 795)
character_2 = Character("P퍼랩법사P", 540, 690)
위 코드를 실행 해보면 init()함수를 실행하지 않았는데도 실행되어 출력되는 것을 확인 할 수 있습니다.
4. 클래스 내 모든 함수 첫 파라미터 self
클래스 내 함수를 실행하는 방법은 아래와 같습니다.
# 클래스 정의
class test_class:
def __init__(self):
pass
def sum_two_number(self, a, b):
return a + b
# 인스턴스 생성
test_class_1 = test_class()
# 인스턴스 내 함수 사용
result = test_class_1.sum_two_number(10, 11)
print(result)
이를 참고하여 Character 클래스 내부에 포션 사용 함수를 구현하고 실행해 봅시다.
이때 포션 사용 함수 마지막에 hp를 출력해 주세요.
< 정답 코드 >
class Character:
def __init__(self, name, hp, max_hp):
name = name
hp = hp
max_hp = max_hp
print(name, hp, max_hp)
def use_potion(self, potion_type):
if potion_type == 1:
hp += 150
elif potion_type == 2:
hp += 100
if hp > max_hp:
hp = max_hp
print(hp)
character_1 = Character("T퍼랩법사T", 691, 795)
character_2 = Character("P퍼랩법사P", 540, 690)
이렇게 구현하면 안된다는 것을 느끼셨나요?
맞습니다 바로 전역 변수 문제가 발생하는 것입니다.
init() 함수 실행이 종료 되면 저장 했던 name, hp, max_hp는 지역 변수기 때문에 램에서 삭제 됩니다.
그렇다면 함수 밖에 변수를 저장하면 안되냐구요?클래스는 함수 밖이라는 개념이 없습니다… 함수로만 이루어져 있어요…
이런 문제를 해결하는 것이 바로 self 입니다!
self를 활용하면 전역 변수를 만들 수 있습니다.
아래 예시 코드를 보시죠.
# 함수 정의
class global_var_class:
def __init__(self, a, b):
self.a = a
self.b = b
self.sum_ab()
def sum_ab(self):
result = self.a + self.b
print(result)
# 인스턴스 생성
temp = global_var_class(10, 12)
# sum_ab 함수 실행
temp.sum_ab()
위 코드와 같이 전역 변수를 사용할 때 변수명 앞에 self. 을 붙이면 됩니다.
자연스럽게 self. 이 붙은 것은 전역 변수가 되고 안 붙은 것은 지역 변수가 됩니다.
이제 배운 것을 활용하여 다시 Character 클래스 만들기 문제를 풀어봅시다.
”T퍼랩법사T” 와 “P퍼랩법사P”를 클래스를 활용하여 생성하고 포션 2를 사용했을 때 각 캐릭터의 체력을 출력해 주세요.
< 캐릭터 정보 >
"T퍼랩법사T" : 691(현재 체력), 795(최대 체력)
"P퍼랩법사P" : 540(현재 체력), 690(최대 체력)
< 캐릭터 요구사항 >
1. 이름, 체력, 최대 체력 값을 각각 저장해 주세요.
2. 1번을 입력하면 포션1을 사용합니다. 포션1은 한번에 150 회복 가능합니다.
3. 2번을 입력하면 포션2을 사용합니다. 포션2은 한번에 100 회복 가능합니다.
4. 포션은 최대 최력 이상으로 회복 시킬 수 없습니다.
5. 사용자가 "stop"을 입력하기 전까지 포션을 먹을 수 있게 해주세요.(사용자는 "stop", "1", "2" 셋중 하나만 입력합니다.)
6. 포션에 관련된 실행들은 함수로 구현해주세요(파라미터로 포션의 종류를 받습니다)
< 정답 코드 >
# 클래스 선언
class Character:
def __init__(self, name, hp, max_hp):
self.name = name
self.hp = hp
self.max_hp = max_hp
def use_potion(self, potion_type):
if potion_type == 1:
self.hp += 150
elif potion_type == 2:
self.hp += 100
if self.hp > self.max_hp:
self.hp = self.max_hp
# 인스턴스 생성
character_1 = Character("T퍼랩법사T", 691, 795)
character_2 = Character("P퍼랩법사P", 540, 690)
# 포션2 사용
character_1.use_postion(2)
character_2.use_postion(2)
# 체력 출력
print(character_1.hp)
print(character_2.hp)
5. 연습문제
문제 1
다음 코드의 실행 결과로 올바른 것을 고르세요.
class Character:
def __init__(self, name, hp):
self.name = name
self.hp = hp
def heal(self, amount):
self.hp += amount
char = Character("Hero", 100)
char.heal(50)
print(char.hp)
A) 100
B) 150
C) 오류가 발생한다.
D) None
문제 2
다음 코드에서 self의 역할로 가장 적합한 설명은 무엇인가요?
class Test:
def __init__(self, value):
self.value = value
def print_value(self):
print(self.value)
A) 함수의 지역 변수를 정의한다.
B) 클래스의 인스턴스별로 데이터를 저장한다.
C) 전역 변수를 함수 밖으로 전달한다.
D) 클래스 내에서만 사용 가능한 상수를 생성한다.
문제 3
다음 코드에서 오류가 발생하는 이유는 무엇인가요?
class Player:
def __init__(self, hp):
hp = hp
def get_hp(self):
return hp
player = Player(200)
print(player.get_hp())
A) self를 사용하지 않아 변수가 인스턴스에 저장되지 않았다.
B) get_hp 메서드에 self 파라미터가 없다.
C) hp가 전역 변수로 선언되지 않았다.
D) __init__ 함수가 잘못된 파라미터를 받았다.
문제 4
다음 코드의 실행 결과로 올바른 것을 고르세요.
class Monster:
def __init__(self, name, hp, max_hp):
self.name = name
self.hp = hp
self.max_hp = max_hp
def use_potion(self, amount):
self.hp += amount
if self.hp > self.max_hp:
self.hp = self.max_hp
monster = Monster("Dragon", 300, 500)
monster.use_potion(250)
print(monster.hp)
A) 300
B) 500
C) 550
D) 오류가 발생한다.'파이썬 기초' 카테고리의 다른 글
| [ 파이썬 기초 ] 18. 변수의 생명 주기 (0) | 2025.03.21 |
|---|---|
| [ 파이썬 기초 ] 17. 함수 (0) | 2025.03.21 |
| [ 파이썬 기초 ]16. while 문 (0) | 2025.03.14 |
| [ 파이썬 기초] 15. for문 핵심 문제 (0) | 2025.03.14 |
| [ 파이썬 기초 ] 14. for문 (0) | 2025.03.06 |