❰클래스❱
-파이썬의 클래스에 대해 배워 봅시다.
▶클래스란?
클래스(class)는 객체 지향 프로그래밍(OOP)에서 객체를 만들기 위한 설계도 또는 틀이 입니다.
클래스를 통해 실제 생활의 사물이나 개념을 코드로 모델링 할 수 있으며 간단한 예를 들어보자면, 자동차라는 클래스를 만들면, 이클래스는 모든 자동차가 공통적으로 가지는 속성(색상, 제조사, 모델)과 행동(출발, 정지)을 정의할 수 있습니다.
객체 지향 프로그래밍(OOP, Object Oriented Programming)란?
"현실 세계의 사물(객체)을 프로그래밍으로 표현"하는 방법론 입니다.
프로그램을 "객체"라는 단위로 나누어 개발하는 방식입니다.
조금 더 쉽게 풀면 소프트웨어를 객체라는 작은 단위로 쪼개고, 이 객체들이 서로 메시지를 주고 받으며 프로그램이 동작하도록 설계하는 방식을 의미합니다. 즉, 개발에서 OOP는복잡한 문제를 작은 단위로 나누고, 서로 연결해 푸는 방법론입니다
해당 이론에 대해서는 cs용어를 정리 할 때 조금 더 명확하게 설명하겠습니다.
이러한, 설계도(클래스)를 바탕으로 만들어진 개별적인 결과물을 객체(object)또는 인스턴스(instance)라고 합니다.
'내 자동차'와 '친구의 자동차'는 '자동차' 클래스라는 같은 설계도를 따르지만, 각자의 고유한 속성 값을 가질 수 있습니다.
해당 설명을 요약하면, 클래스는 객체의 속성과 행동을 정의하는 추상적인 개념이며, 객체는 클래스의 정의에 따라 생성된 실제 데이터입니다.
#객체를 만들기 위한 청사진(설계도)
#설계도 이기 때문에 객체, 메서드, 인스턴스, 속성 등을 작성하기 전까지는 빈 공간
class 클래스명
실행할 코드
...
...
▶메서드, 인스턴스, 메서드, 속성 그리고 생성자
생성자(Constructor)는 객체가 만들어 질 때 자동으로 호출 되는 특별한 메서드를 의미합니다.
클래스에서 객체를 생성하면 가장 먼저 실행 되며 주로 객체의 속성을 초기화 하는데 사용 합니다.
__init__메서드가 생성자 역할을 합니다.
class 클래스명:
#객체가 만들어질 때 자동으로 실행되는 특별한 메서드, __init__로 정의
def __init__(self, 매개변수): # 생성자
self.매개변수 = 매개변수 # 속성 초기화
주의 할 점은 클래스명()을 실행해야” 호출됩니다. 즉, 객체 생성 요청이 있어야 자동 실행됩니다. (완전한 자동 생성은 아님)
속성(attributes)은 객체가 가지는 데이터를 의미 합니다. 이는 객체를 특징 짓는 그 객체만의 고유한 값이나 상태를 나타냅니다.
클래스를 정의할 때 변수로 선언 됩니다.'파란색 자동차'라는 객체가 있습니다. 이 객체의 인스턴스에 속성값은 color : "파란색" 이다라고 말 할 수 있습니다. 간단히 정리하면, 클래스라는 설계도에 따라 객체(또는 인스턴스)를 만들고, 이 객체는 속성이라는 데이터를 가집니다.
class 클래스명:
공통속성 = ... # 클래스 변수(모든 인스턴스가 공유)
def __init__(self, 매개):
self.개별속성 = 매개 # 인스턴스 변수(각자 다름)
공통 속성은 클래스 변수로 모든 인스턴스(객체)가 공유하는 공통속성을 말합니다.
즉, 클래스 내에서 사용 할 수 있는 변수 입니다.
개별속성은 인스턴스 변수로 각자 다른 값을 가지고 있습니다. 해당 객체(인스턴스)에서만 사용가능합니다.
메서드(methods)는 객체가 할 수 있는 행동을 의미 합니다. 예를 들어 자동차를 가속 시키거나 정지시키거나 조작하는 행동, 동작에 관련된 행동을 관여합니다.
즉, 메서드는 객체의 속성(데이터)를 조작하거나, 객체가 특정 작업을 수행하도록 지시하는 역할을 합니다
항상 자기 자신을 참조하기 위해 첫 번째 매개변수로 self를 가집니다.
아래는 메서드의 기본구조입니다.
class 클래스명 :
#객체가 할 수 있는 동작(함수), 클래스 안에 정듸된 함수
def 메서드명(self, 매개변수) #자기 자신을 참조하기 위해 self 매개변수는 필수
...
함수라고 되어 있지만, 함수는 클래스에 속하지 않고 독립적으로 존재하며, 메서드는 특정 클래스에 종속되어 있으며 종속된 클래스의 객체를 통해서만 호출 할 수 있습니다.
✔참고
@staticmethod(정적 메서드)
정적 메서드는클래스나 인스턴스의 상태에 전혀 의존하지 않는 메서드입니다.
@classmethod(클래스메서드)
클래스 메서드는 클래스 자체를 매개변수로 받는 메서드입니다.
이런 메서드가 있다는 걸 기억하시고 참고해주시면 되겠습니다.
추후 자세히 정리하겠습니다.
객체 (Object)는 객체는 설계도(클래스)를 기반으로 만들어진 실제 사물이나 개념입니다. 이는 클래스에 정의된 속성(데이터)과 메서드(행동)를 모투 포함하는, 프로그램의 가장 기본적인 구성 요소 입니다. 예를 들면, 자동차의 설계도가 있는데 거기에 파란색 자동차는 설계도(클래스)를 기반으로 만들어진 하나의 객체입니다.
인스턴스 (Instance)는 특정 클래스에 속한 객체 를 지칭할 때 사용되는 용어입니다. 즉, 객체와 인스턴스는 동일한 대상을 가리키지만,관점의 차이가 있습니다. 객체는 '독립된 하나의 존재'라는 존재론적인 관점의 용어입니다. 인스턴스는 '특정 클래스에서 만들어진 결과물'이라는 관계론적인 관점의 용어입니다.
조금 보기 편하고 이해하기 쉽게 표로 설명하겠습니다.
구분 | 객체(Object) | 인스턴스(Instance) |
정의 | 클래스에서 생성된 실체 (데이터 + 메서드 포함된 "존재") |
특정 클래스에서 생성되었다는 "관계"를 강조하는 용어 |
관점 | 이건 하나의 존재다 | 이건 어떤 클래스의 결과물이다 |
포괄성 | 더 넓은 개념(단순히 존재 자체) | 객체의 하위개념(클래스와의 관계를 명시할 때만) |
예시 문장 | "car는 하나의 객체이다" | "car는 car클래스의 인스턴스다" |
비유 | 실제 자동차 한대(존재 자체) | "이 자동차는 car 설계도로 만들어진 것"이라는 설명 (결과물이 어떤 클래스(출신 설계도)에 속하는지 알려주는 꼬리표 (브랜드처럼 평생 따라옴)) |
obj = 클래스명(인자) # 생성자 호출 → 속성 준비됨
obj.메서드명() # 동작 실행
객체와 인스턴스는 같은 대상을 가리키지만, 인스턴스는 클래스와의 관계를 강조할 때 쓰는 표현입니다. 따라서, 기본구조는 동일합니다.
▶클래스의 기본구조와 클래스 만들기
클래스는 결국 객체, 인스턴스, 속성, 메서드를 모두 포함하는 총체적인 개념을 말합니다.
그럼 위에서 배웠던 클래스의 기본구조에 대해 배워 보겠습니다
class Dog: # 클래스, 클래스명은 Dog입니다.
def __init__(self, name): # 메서드 (생성자)
self.name = name # 속성
def bark(self): # 메서드
print(f"{self.name}가 멍멍 짖습니다!")
dog1 = Dog("초코") # Dog 클래스의 객체(=인스턴스)
dog1.bark() # 메서드 호출
그럼 클래스를 좀 더 이해하기 위해 직접 생성 해보도록 하겠습니다.
클래스를 만들기 전 우선 무엇을 만들지 큰 틀을 정해 봅시다.
"사칙연산이 가능한 프로그램을 만들지"
무엇을 만들고 싶은지 정해 졌으면 그 안에 어떤 기능이 들어 갈지 생각을 해야합니다
"더하기, 빼기, 나누기, 곱하기, 나머지 값이라는 기능"
이렇게 생각하였으면 이 생각들을 하나로 정리 하면 되겠습니다.
위 그림처럼 어떤 기능은 어떤 메서드이고 이 메서드들이 결국 하나의 클래스로 모여서 사칙연산 클래스라는 프로그램에 대한 도면을 완성시킨다 생각하면 되겠습니다.
먼저, 클래스를 만듭니다.
그 후에 클래스에 들어갈 메서드(생성자) 및 객체(인스턴스), 속성을 생성 해줍니다.
마지막으로, 값을 입력 할 input 과 클래스를 호출 하고 인자값을 전달 할 객체(인스턴스)만들어 줍니다.
최종적으로 print를 사용하여 콘솔에 출력하게 하면 사칙연산을 하는 프로그램이 완성됩니다.
▶클래스의 상속
상속은 기존 클래스(부모, 상위 클래스)의 기능을 물려 받아 새로운 클래스(자식, 하위 클래스)를 만드는 것입니다.
코드를 재사용 가능, 중복을 제거하며 확장성을 확보한다는 장점이 있습니다.
즉, 쉽게 설명하면, 재산을 상속 받다와 같은 개념이고, 자녀의 수에 상관 없이 상속받을 수 있습니다.
상속 받은 자녀(하위) 클래스는 부모(상위) 클래스안에 있는 기능을 호출하여 사용 할 수 있습니다.
class 부모클래스:
def 메서드1(self):
실행할 코드
def 메서드2(self):
실행할 코드
class 자식클래스(부모클래스):
# 부모 메서드와 속성을 그대로 사용 가능
# 필요하다면 새로운 메서드 추가 가능
def 새로운메서드(self):
실행할 코드
상속의 예제
class Calculator: # 부모 클래스
def __init__(self, first, second):
self.first = first
self.second = second
def add(self):
return self.first + self.second
def sub(self):
return self.first - self.second
class MoreCalculator(Calculator): # 자식 클래스 (상속)
def mul(self): # 새로운 기능 추가
return self.first * self.second
def div(self): # 새로운 기능 추가
return self.first / self.second
자식 클래스 MoreCalculator는 부모 클래스 Calculator의 기능(생성자,add, sub)을 그대로 물려받고 부모 클래스 안의 기능을 그대로 사용 할 수 있습니다.
상속은 (부모 1 → 자식 여러), 자녀의 수에 상관없이 상속받는다 = 여러 자식이 한 부모를 공유할 수 있다.
▶다중 상속
그럼 부모 클래스가 아버지, 어머니로 나눠져 있을 때 둘 다 적용하지 못할까?라는 생각도 하셨을 텐데 이런 걸 다중상속이라고 합니다 아버지 클래스, 어머니 클래스로 나눠서 상속을 받는데 자식 클래스 하나가 부모(어머니,아버지)클래스를 모두 상속 받는걸 의미합니다.
class Mother:
def cook(self):
print("엄마: 요리하기")
class Father:
def drive(self):
print("아빠: 운전하기")
class Child(Mother, Father): # 다중 상속
pass
c = Child()
c.cook() # 엄마 기능
c.drive() # 아빠 기능
▶메서드 오버라이딩
오버라이딩은 부모 클래스에서 정의한 메서드를 자식 클래스에서 똑같은 이름으로 다시 정의하는 것 입니다.
자식 클래스의 메서드가 부모클래스의 메서드를 덮어쓰며 부모 기능을 그대로 쓰지 않고, 상황에 맞게 재정의할 수 있습니다.
결국 해당 자식 클래스에 부모클래스의 메서드를 업데이트 시키는거고 부모 클래스는 그래도 내용을 유지 하고 있는겁니다.
오버라이딩 (override)을 한 자식 클래스에서만 적용되고 다른 자식 클래스에서는 적용 되지 않습니다.
class 부모:
def 메서드(self):
print("부모 메서드 실행")
class 자식(부모):
def 메서드(self): # 오버라이딩
print("자식 메서드 실행")
obj = 자식()
obj.메서드() # "자식 메서드 실행"
하지만, 두 기능 다 사용 하고 싶을 때
즉, 오버라이딩 한 메서드, 부모클래스의 메서드를 두개다 적용시키고 싶을 때
super()로 부모 메서드 호출 가능 합니다.
class LoggerCalculator(Calculator):
def div(self):
print("나눗셈 실행 중...")
return super().div() # 부모의 div도 실행
이로써, 클래스에 대한 설명을 마치겠습니다.
오늘도 고생하셨습니다.😌
📘 참고:
《Do it! 점프 투 파이썬 (전면 개정 2판)》, 박응용 저, 이지스퍼블리싱, 2023
※ 본 글은 위 교재의 내용을 학습 및 정리 목적으로 요약/재구성한 글입니다.
'Python(파이썬)_점프 투 파이썬 > 파이썬 날개달기' 카테고리의 다른 글
파이썬의 표준 라이브러리 (0) | 2025.09.12 |
---|---|
파이썬의 내장 함수 (2) | 2025.09.07 |
파이썬의 예외 처리 (0) | 2025.09.07 |
파이썬 패키지 (0) | 2025.09.06 |
파이썬의 모듈 (0) | 2025.09.03 |