함수가 끝나도 어떤 변수가 사라지지 않고 유지되게 하려면 클래스(class)를 써야한다.
객체지향프로그래밍(OOP : Object Oriented Programmin)언어에서 클래스는 데이터와 그 데이터를 처리하는 메소드(함수)를 합쳐 객체(instance)를 만든다. 클래스는 형식이고 객체는 구현이다.
클래스는 프로그래밍에서 다루는 데이터를 객체화(instantiate) 시키고 비슷한 데이터와 함수의 조합을 다양하게 재사용할 수 있도록 돕는다. 일반적으로 객체지향적인 방식으로 클래스를 사용하면 코드의 가독성이 좋아지고 수정이 쉬워진다. 여기서는 파이썬 클래스 문법만 다루겠다.
- 클래스 문법
파이썬에서 클래스느 class라는 키워드로 시작하며 함수와 마찬가지로 들여쓰기로 정의 범위를 지정한다.
간단한 구현을 예로 들겠다.
class Dog:
def __init__(self, name): # 생성자 함수
self.name = name
self.position = 0
def bark(self):
print(f"{self.name} : Wal! Wal!")
def move(self, distance):
self.position += distance
print(f"{self.name} is at {self.position}")
puppy = Dog("dangdang")
puppy.bark()
puppy.move(10)
print("current position:", puppy.position)
출력 :
dangdang : Wal! Wal!
dangdang is at 10
current position: 10
1. 생성자 함수 __init__
파이썬은 특정 기능을 특정 이름에 지정하는 경우가 많다. 클래스 안에서 __init__은 생성자 역할을 하며 객체가 생성될 때 자동으로 실행된다. 입력인자를 받을 수 있으나 리턴할 순 없다. 주로 멤버 변수를 선언하고 초기화 하는데 사용한다. 다른 함수에서도 멤버 변수를 추가할 순 있으나 가급적 __init__에서 모든 멤버 변수를 선언하는 것이 좋다.
2. self란?
클래스의 모든 함수에 공통 입력 인자가 있는데 self 라는 변수다. static 함수를 제외한 모든 클래스 멤버 함수에 첫 번째 인자로 self를 넣어야한다. 이것은 C++에서 this와 비슷한 기능을 한다. 즉, 객체 자신을 의미하는 것이며 객체의 함수나 변수는 self를 통해 접근 가능하다. move 라는 함수에서 position 멤버 변수에 접근하기 위해 self.position 이라 쓴다. 다른 함수를 호출할 때도 마찬가지다.
self라는 입력 인자는 함수를 호출할 때 직접 객체를 입력하는 것이 아니고 호출한 객체가 자동으로 들어간다.
예를 들어 puppy.bark()를 호출하면 self에 puppy가 들어간다.
3. 클래스 사용법
self가 첫 번째 인자로 들어갈 뿐 함수를 쓰는 방법은 일반적인 함수를 정의하는 것과 크게 다르지 않다. 클래스를 사용하는 방법은 다른 언어와 비슷하다. 객체를 생성할 때는()를 써야하먀 생성자의 입력인자가 있다면 값을 넣는다.
생성된 객체 뒤에 .을 통해 내부 함수를 실행하거나 내부 변수에 접근 가능하다.
- 상속과 다형성
객체지향 프로그래밍을 하는데 있어 핵심적인 문법이 상속(inheritance)과 다형성(polymorphism)이다.
상속이란 클래스 사이에 부모와 자식 혹은 하위 관계가 있어 자식 클래스는 부모 클래스의 함수와 변수를 물려받는다. 다형성이란 형태는 같은데 다른 일을 하는 함수가 여러개 있을 수 있다는 것이다. 상속을 통해 부모 클래스에서 받은 메소드(함수)들을 오버라이딩(overriding)을 통해 바꿔 쓸 수 있는 것이다. 객체지향 프로그래밍은 상속과 다형성을 통해 코드를 절약하고 기능을 한 곳으로 응집시켜 버그를 줄이고 변화에 강한 코드를 만든다.
간단한 예제를 통해 보자.
class Appliances:
def __init__(self, name, power = 120):
self.name = name
self.power = power
def introduce(self):
print("my name is",self.name)
def sound(self):
pass
def use_power(self):
if self.power > 150:
print("파워 소모량 많음 / 소모량 :",self.power)
else:
print("파워 소모량 적음 / 소모량 :",self.power)
class VacuumCleaner(Appliances):
def __init__(self, name, power):
super().__init__(name, power)
def sound(self):
print("위잉")
class Refrigerator(Appliances):
def __init__(self, name,power ):
super().__init__(name, power)
def sound(self):
print("위이잉")
class AirConditional(Appliances):
def __init__(self, name, power):
super().__init__(name, power)
def sound(self):
print("위이이잉")
vacuum = VacuumCleaner("vc",190)
vacuum.introduce()
vacuum.sound()
vacuum.use_power()
appliances = [Refrigerator("Ref", 180),AirConditional("AC",220),VacuumCleaner("vc0",130)]
for app in appliances:
app.introduce()
app.sound()
app.use_power()
출력 :
my name is vc
위잉
파워 소모량 많음 / 소모량 : 190
my name is Ref
위이잉
파워 소모량 많음 / 소모량 : 180
my name is AC
위이이잉
파워 소모량 많음 / 소모량 : 220
my name is vc0
위잉
파워 소모량 적음 / 소모량 : 130
Appliances는 부모 클래스고 VacuumCleaner, AirConditional, Refrigerator는 자식 클래스다. 상속 받을 때 class 자식클래스(부모클래스) 형식으로 선언한다.
자식의 생성자에서 super().__init__(name)는 부모클래스의 생성자를 호출한다는 것이다. 이를통해 굳이 자식에서 self.name=name 라는 똑같은 코드를 쓰지 않아도 부모클래스의 생성자를 통해 같은 기능을 수행할 수 있다.
sound()라는 메소드를 물려받아이를 오버라이딩(overriding)하여 함수의 기능을 수정하였다. 셋 다 sound()라는 똑같은 함수를 실행해도 다른 기능을 한다.
for loop을 돌때 함수의 형식이 같기 때문에 어떤 클래스의 객체든 상관없이 introduce(), sound(), use_power()가 실행된다.
'학부 생활 + 랩실 > Python' 카테고리의 다른 글
| 파이썬(10) - numpy (0) | 2026.04.05 |
|---|---|
| 파이썬(9) - 유틸리티 (0) | 2026.04.05 |
| 파이썬(7) - 패키지 (0) | 2026.04.04 |
| 파이썬(6) - 함수 (0) | 2026.04.04 |
| 파이썬(5) - 제어문 (0) | 2026.04.03 |