C#과 문법적인 표현방식이 많이 달라서 헷갈렸어요.

인터프리터 방식과 컴파일 방식의 차이점인지 공부를 좀더 하고 확인해봐야 겠어요.

객체를 쓰니까 객체지향프로그래밍(OOP)를 사용할 것이라는 것을 알 수 있죠.

 

클래스와 객체

  • 클래스 정의 : 객체의 뼈대라고 생각해요. 개체 전체를 통칭해요. 객체의 공통된 속성과 행위를 변수와 함수로 정의한 것. 객체를 만들기 위한 기본 틀
    예를 들면, 사람이라는 개체 전체를 다른 개체 전체(노트북)와 구분할 수 있는 특징들을 포함한 조립서(?) 같은 느낌이에요.
  • 객체 정의 : 모델명을 갖는 개체라고 생각해요. 개체 전체에서 자신을 구별할 수 있어요. 개성을 갖았다고 생각해요.
  • 클래스와 객체를 사용하는 이유 :
    1. 중복되는 코드가 하나의 개체를 표현할 경우 하나의 의미단위로 묶어서 코드수를 줄일 수도 있고
    2. 수정할 경우 중복되는 코드를 각각 찾아서 수정해야하는 노가다 및 놓치는 경우를 줄이기 위해서 공통된 부분은 클래스에서 수정하고 개별적으로 수정해야하는 부분은 객체에서 수정하면 되기 때문
    3. 또한, 코드의 가시성도 확보할 수 있어요.

 

클래스 기본 구조

import time

#클래스 생성
class ClassName():
	class_variable = 0 #클래스변수 생성
    
    #인스턴스메서드 생성/ self를 사용해서 구별
    #초기화함수도 인스턴스함수에 들어감
    def __init__(self, param1, param2, param3): #param1, param2, param3는 단지 매개변수
    	self.param1 = param1 #self.param1 인스턴수 변수 생성 / 인스턴스변수는 주로 __init__에서 생성
        self.param2 = param2
        self.param3 = param3
        ClassName.class_variable = ClassName.class_variable + 1
    
    def instance_method(self, param_1):
    	print(param_1)
        print(self.param1)
        
    
    #정적메서드 생성 / @staticmethod를 입력해서 구별 & self는 사용하지 않음
    @staticmethod
    def static_method1():
    	pass
        
    @staticmethod
    def static_method(param1, param2, param3):
    	weather = time.localtime(time.time())
        
    
    #클래스메서드 생성 / @classmethod를 입력해서 구별 & 인자에 cls로 시작
    @classmethod
    def class_method(cls, param1, param2):
    	print(class_variable)
        


#객체 생성
my_class = ClassName('param1', 'param2', 'param3') #객체초기화(__init__으로 초기화)
my_class.param1 = 10 		#인스턴스변수사용
my_class.instance_method('param_1') #인스턴스메서드 사용
ClassName.statice_method1()	#정적메서드 사용
ClassName.class_variable	#클래스메서드 사용

 

  • 인스턴스 메서드 : 각 객체에서 개별적으로 동작하는 함수를 만들고자 할 때 사용하는 함수
    self는 클래스의 인스턴스(객체) 자신을 가리킴 
    인스턴스 메서드 안에서는 'self.함수명()'형식으로 클래스 내의 다른 함수를 호출할 수 있음
  • 정적 메서드 : 클래스와 관련은 있지만 클래스의 인스턴스와 무관하게 독립적으로 동작하는 함수를 만들 때 사용
    예를 들면, 보통 날짜 및 시간 정보 제공, 환율 정보 제공, 단위 변환과 같이 객체와 관계없이 독립적으로 동작하는 함수를 만들 때 주로 이용 
    정적 메서드 안에서는 인스턴스 메서드나 인스턴스 변수에 접근할 수 없음
  • 클래스 메서드 : 클래스 변수를 사용하기 위한 함수

 

클래스 상속

클래스들도 서로 관계가 있을 수 있어요. 이때 클래스 관계에서 하나의 클래스가 다른 클래스보다 추상적일 경우에 중복되는 부분을 또 줄이기 위해 사용할 수 있어요. 객체지향 프로그래밍에서는 이와 같은 이어받기를 상속이라고 해요.

#부모클래스(슈퍼클래스)
class ParentClass():
	
    def __init__(self, param):
    	self.parentVariable = param
        
    def parent_instance_function(self):
    	self.parent_instance_variable = 0
        

#자식클래스(서브클래스) / 괄호 안에 ParentClass를 써서 상속
class ChildClass(ParentClass):

	def __init__(self, param, param2):
    	super().__init__(param)	#super()를 쓸 때는 self를 빼야 함
        #ParentClass.__init__(self, param)으로도 초기화 재사용
        self.param2 = param2
    
    def child_instance_function(self):
    	self.child_instance_variable = 0
        
        
#객체 생성
child_class = ChildClass('param', 'param2')
child_class.parent_instance_function()
child_class.child_instance_function()
  • 클래스에서 상속을 이용하면 이미 만들어진 클래스의 변수와 함수를 그대로 이용할 수 있으므로 코드의 재사용성이 좋아짐
  • 유사한 클래스를 여러 개 만들어야 할 경우 공통 부분은 부모 클래스로 구현하고 부모 클래스를 상속하는 자식 클래스를 각각 구현한다면 좀더 간편하게 코드를 작성할 수 있음

 

 

클래스의 구성을 알고 싶으면

dir(클래스명) 출력 ex>dir(child_class)

help(클래스명) 출력 ex>help(child_class)

+ Recent posts