[파이썬] 프로그래밍의 구조, 클래스 (객체, 생성자, 상속, 오버라이딩)
본문 바로가기
파이썬 시작하기

[파이썬] 프로그래밍의 구조, 클래스 (객체, 생성자, 상속, 오버라이딩)

by 동도리동동 2023. 4. 23.
반응형

 

 

1. 클래스(Class)와 객체(Object)

클래스는 과자 틀과 비슷하다고 설명할 수 있습니다. 과자 틀을 이용해서, 같은 모양의 과자를 여러개 만들 수 있는 것처럼, 클래스를 활용해서, 동일한 속성의 객체를 여러 개 만들 수 있습니다. 이렇게 만들어진 객체에는 고유한 성격을 가지고 있어서, 서로 영향을 미치지 않습니다. 

 

아래는 간단한 클래스를 만드는 코드 입니다. 

# 아무 기능도 하지 않는 Class 선언
class A:
	pass
    
a = A()
type(a)		# <class '__main__.A'> 출력

 

 

 

 

 

 

2. 생성자(Constructor)

객체의 초기값을 설정해야할 필요가 있을 때 사용하는 메서드를 의미합니다. 생성자는 객체가 생성될 때, 자동으로 호출되고, 아래와 같이 만들 수 있습니다. 

 

# 두 수를 더해주는 기능을 가지는 클래스 선언
class A:
	def __init__(self, first, second):		# 두 수를 설정하는 생성자
		self.first = first
		self.second = second

	def add(self):					# 두 수를 더해주는 메서드
		return self.first + self.second
        
        
a = A(2, 4)
print(a.add())		# 6 출력

 

 

 

 

3. 클래스 구현 연습

위 두가지를 활용하여, 사칙연산을 할 수 있는 클래스를 구현해보도록 하겠습니다. 

 

class FourCalc:
	# 생성자
	def __init__(self, first, second):
		self.first = first
		self.second = second

	# 두 수를 설정하는 메서드
	def setdata(self, first, second):
    	self.first = first
		self.second = second

	# 사칙연산
	def add(self):
		return self.first + self.second
	def minus(self):
		return self.first - self.second
	def div(self):
		return self.first / self.second
	def mul(self):
		return self.first * self.second
        
        
        
a = FourCalc(2, 4)	# 객체 a 생성
print(a.add())		# 6 출력

a.setdata(10, 5)	# first=10, second = 5로 변경
print(a.add())		# 15 출력


b = FourCalc(10, 5)	# 객체 b 생성
print(b.mul())		# 50 출력

 

 

 

 

4. 상속(Inheritance)

상속은 '물려받다'라는 뜻으로, 어떤 클래스를 만들 때 다른 클래스의 기능을 물려받을 수 있게 만드는 것입니다. 앞에서 만들었던 FourCalc 클래스를 상속받아서, 제곱을 하는 MoreFourCalc 클래스를 만들어보도록 하겠습니다. 상속 받은 클래스로 선언된 객체는 부모 클래스의 메서드를 그대로 활용할 수 있다는 특징이 있습니다. 아래 예제에서는 MoreFourCalc 클래스로 선언된 객체에서, FourCalc 클래스의 메서드를 활용하는 것을 볼 수 있습니다. 

 

# FourCalc 클래스를 상속받는 MoreFourCalc 클래스 선언
class MoreFourCalc (FourCalc):
	def pow(self):
    	return self.first ** self.second
    
    
    
# 상속의 특징 때문에, FourCalc 클래스의 메서드를 활용할 수 있다. 
a = MoreFourCalc(2, 4)
print(a.add())			# 6 출력

a.setdata(10, 5)
print(a.mul())			# 50 출력

b = MoreFourCalc(2, 5)
print(b.pow())			# 32 출력

 

 

 

5. 오버라이딩(Overriding)

FourCalc 클래스의 div() 메서드에서는 0으로 나누는 경우에 Error가 발생합니다.  MoreFourCalc 클래스에서 이를 처리할 수 있도록 바꿔주고 싶을 때, 메서드 오버라이딩을 활용하면 됩니다. 메서드를 동일한 이름으로 다시 만드는 것을 메서드 오버라이딩(Overriding, 덮어쓰기)이라고 합니다. 이렇게 하면, 부모 클래스의 메서드 대신 오버라이딩한 메서드가 호출됩니다. 

 

# FourCalc 클래스를 상속받는 SafeFourCalc 클래스 선언
# div() 메서드 오버라이딩
class SafeFourCalc (FourCalc):
	def div(self):
    		if second == 0:
        		return 0
		else:
        		return self.first / self.second
            
            
a = FourCalc(5, 0)
print(a.div())			# ZeroDivisionError 발생

b = SafeFourCalc(5, 0)
print(b.div())			# 0 출력

 

 

6. 클래스 변수

객체 변수는 서로 다른 객체들에 영향받지 않고, 독립적으로 값을 유지하지만, 클래스 변수는 성격이 다릅니다. 

클래스 변수는 클래스와 객체 모두 동일한 메모리 주소를 가지고 있어서 서로 공유되는 변수입니다. 아래 예를 통해서 이해할 수 있습니다. 

# 클래스 변수인 lastname을 가지는 Name 클래스 선언
class Name:
	lastname = "김"
    
print(Name.lastname)		# "김" 출력


a = Name()
b = Name()
print(a.lastname)		# "김" 출력
print(b.lastname)		# "김" 출력



# 클래스 변수의 값 변경
Name.lastname = "박"

print(a.lastname)		# "박" 출력
print(b.lastname)		# "박" 출력

 

 

 

 

 

 

반응형

댓글