[Python] 클래스란?

정은·2023년 7월 18일

PYTHON

목록 보기
2/6
post-thumbnail

기본적으로 Python이라는 언어는 객체지향(Object Oriented) 프로그래밍 언어이다.

꼭 해당 종류의 언어만 속하는 건 아니지만, 여기서는 OOP 언어인 것만 알고가자.

객체지향(Object Oriented) 프로그래밍 언어의 특징은 프로그램을 여러 개의 독립된 객체들의 모임으로 구성된 것으로 인식한다는 점이다. 그로 인해 각각의 객체는 메시지를 주고 받으며 데이터를 처리하는 방식으로 이뤄진다.

'클래스' 란? 💡

클래스(Class)는 특정 객체를 생성하기 위해 속성(변수)과 기능(메소드)을 정의하는 틀의 역할을 하는 것을 말한다. ex) 붕어빵 틀
객체(Object)는 클래스를 기반으로 만들어진 실제 사물을 말한다. ex) 붕어빵

공통된 속성과 기능에 모아서 클래스를 정의한 뒤 필요에 따라 객체를 생성해서 사용하면 공통적으로 필요한 프로그램 코드를 중복 작성할 필요가 없음!

그럼, 파이썬에서는 클래스를 어떻게 사용할까?

Python의 클래스

파이썬에서는 클래스를 사용하려면 아래의 구조를 가지고 있다.

클래스의 정의

class 클래스 이름:

	멤버 변수
    
	def __int__(self, 매개변수들): 초기화
 		… (Initializer)
	
    def __del__(self, 매개변수들): 소멸자
		 …
	def 메소드이름(self, 매개변수들): 메소드

용어 설명 ✅

  • 멤버 변수 : 객체의 속성, 데이터
  • 초기화 (생성자) : 객체가 생성될 때 실행되는 special method로 주로 멤버 변수의 초기화의 역할로 사용된다.
  • 소멸자 : 객체가 소멸될 때 실행되는 speical method이다.
  • 메소드 : 객체의 기능, 행동, 함수를 말한다.

    기본적으로 다른 OOP 언어와 동일하게 의미를 두고 있으므로 잘 모르겠다면 찾아보도록 OOP 언어를 깊게 찾아 보자! (현재는 다른 OOP 언어를 배웠다고 가정하고 글을 쓰고 있다.)

클래스 인스턴스

인스턴스(Instance)는 클래스를 기반으로 실제 생성된 객체를 말한다.

이를 사용하는 방법은 아래와 같다.

class Car1:
	model = "SM3"
    price = 2000
	
	def sale(self, price):
    	self.price = self.price - price

new_car1 = Car1() # 인스턴스 생성
new_car1.price = 1500 # 인스턴스의 멤버 변수 참조

new_car1.sale(200) # 인스턴스의 메소드 실행
  • 참고
    • 하나의 클래스를 이용하여 여러 개의 객체가 생성될 수 있기 때문에 객체 자신을 가리키도록 self 인자를 사용함.
    • 클래스 메소드에서 첫 번째 매개변수는 self가 되어야 함.
    • 인스턴스를 위한 데이터를 저장할 목적이라면 멤버 변수를 생성할 때 멤버 변수 앞에 self.라는 인자를 적어야 함.

정보 은닉

멤버 변수의 직접적인 접근을 차단하는 기능을 한다. 메소드에서 허용하는 방법으로만 멤버 변수의 접근을 허용하여 논리적인 오류를 방지하고 객체의 안정성을 높인다.

아까의 예제에서 설명하자면,

class Car1:
	model = "SM3"
    price = 2000
	
	def sale(self, price):
    	self.price = self.price - price

new_car1 = Car1() # 인스턴스 생성
new_car1.price = 1500 # 인스턴스의 멤버 변수 참조

new_car1.sale(200) # 인스턴스의 메소드 실행

여기서 멤버 변수인 price값을 접근하여 가져오고 싶다면 어떻게 해야될까?

price = new_car1.price

이렇게 직접적으로 가져오면 될까? NO!!

멤버 변수의 값을 참조할 때는 멤버 변수를 직접 참조하는 것이 아니라 메소드를 이용하여 참조하게 하여야 함 => 정보 은닉 기능

class Car1:
	model = "SM3"
    price = 2000
	
	def sale(self, price):
    	self.price = self.price - price
    
    # 메소드 추가
    def get_price(self):
    	return self.price

new_car1 = Car1() 
new_car1.price = 1500 

new_car1.sale(200) 
print(new_car1.get_price()) # 메소드를 사용하여 멤버 변수의 값을 가져온다.

상속(Inheritance)

이미 만들어진 클래스의 멤버 변수와 메소드를 그대로 이어 받아서 필요한 부분만 재정의하거나 새로운 클래스를 만드는 것을 말한다.

상속을 해주는 클래스 : 부모 클래스, 슈퍼 클래스, 상위 클래스라는 용어로 불림.
상속을 받는 클래스 : 자식 클래스, 서브 클래스, 하위 클래스라는 용어로 불림.

단일 상속

# 단일 상속
class Dad():
	def sing(self):
    	print("노래를 잘한다.")
        
class Child(Dad): #Dad 클래스를 상속 받는다.
	def dance(self):
    	print("춤을 잘 춘다")

c = Child()
c.sing()
c.dance()

해당 코드를 이해하기 쉽게 그림으로 표현해보았다.

  • Child 클래스는 Dad 클래스를 상속 받았기 때문에 sing 와 dance 메소드 모두 실행 가능하다.

다중 상속 : 부모 클래스가 두 개 이상

# 단일 상속
class Dad():
	def sing(self):
    	print("노래를 잘한다.")

class Mom:
	def math(self):
    	print("수학을 잘 한다.")
        
class Child(Dad): #Dad 클래스를 상속 받는다.
	def dance(self):
    	print("춤을 잘 춘다")

c = Child()
c.sing()
c.math()
c.dance()

해당 코드를 이해하기 쉽게 그림으로 표현해보았다.

  • Child 클래스는 Dad 클래스와 Mom 클래스를 상속 받았기 때문에 sing, math, dance 메소드 모두 실행 가능하다.

메소드 오버라이딩(Overriding)

OOP 언어에서 가장 중요한 개념일지도 모른다.

Overriding은 자식 클래스에서 부모 클래스에 있는 메소드를 다시 정의하여 부모 클래스에 있는 메소드와 다른 기능을 하도록 하는 것이다. 일종의 기능을 upgrade 시킨다고 말할 수 있다.

  • 만약 자식 클래스에서 메소드 오버라이딩을 했을 때 오버라이드를 한 부모의 메소드를 사용하고 싶다면 자식 클래스에서 super().메소드()를 호출해야 한다.
class Dad():
	def sing(self):
    	print("노래를 잘 한다.")
        
class Child(Dad): #Dad 클래스를 상속 받는다.
	def sing(self):
    	super().sing() # 부모 클래스의 sing을 호출
    	print("랩을 잘 한다.")

c = Child()
c.sing()

>>> 
노래를 잘 한다.
랩을 잘 한다.

해당 코드를 이해하기 쉽게 그림으로 표현해보았다.

  • Child 클래스에서 sing() 메소드를 오버라이딩 함으로써 Dad 클래스의 sing() 메소드를 가리고 Child 클래스에서 재정의한 sing() 메소드의 내용으로 명령이 실행된다.
profile
정니의 이런거 저런거 기록 일지 😛

1개의 댓글

comment-user-thumbnail
2023년 7월 18일

뛰어난 글이네요, 감사합니다.

답글 달기