C#과 문법적인 표현방식이 많이 달라서 헷갈렸어요.
인터프리터 방식과 컴파일 방식의 차이점인지 공부를 좀더 하고 확인해봐야 겠어요.
객체를 쓰니까 객체지향프로그래밍(OOP)를 사용할 것이라는 것을 알 수 있죠.
클래스와 객체
- 클래스 정의 : 객체의 뼈대라고 생각해요. 개체 전체를 통칭해요. 객체의 공통된 속성과 행위를 변수와 함수로 정의한 것. 객체를 만들기 위한 기본 틀
예를 들면, 사람이라는 개체 전체를 다른 개체 전체(노트북)와 구분할 수 있는 특징들을 포함한 조립서(?) 같은 느낌이에요. - 객체 정의 : 모델명을 갖는 개체라고 생각해요. 개체 전체에서 자신을 구별할 수 있어요. 개성을 갖았다고 생각해요.
- 클래스와 객체를 사용하는 이유 :
- 중복되는 코드가 하나의 개체를 표현할 경우 하나의 의미단위로 묶어서 코드수를 줄일 수도 있고
- 수정할 경우 중복되는 코드를 각각 찾아서 수정해야하는 노가다 및 놓치는 경우를 줄이기 위해서 공통된 부분은 클래스에서 수정하고 개별적으로 수정해야하는 부분은 객체에서 수정하면 되기 때문
- 또한, 코드의 가시성도 확보할 수 있어요.
클래스 기본 구조
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)
'KDT융복합프로젝트 AI과정 > Python' 카테고리의 다른 글
기본입출력(input(), print()) (0) | 2022.01.19 |
---|---|
함수 정의와 호출(함수, 람다함수, 유용한 내장 함수) (1) | 2022.01.19 |
문자열(String) 처리 (함수: 분리, 삭제, 연결, 찾기, 바꾸기) (0) | 2022.01.18 |
데이터 처리 (0) | 2022.01.18 |
Python 내장함수 (0) | 2022.01.18 |