1.클래스에 대한 이해
다른 언어와 돌일하게 python에서도 클래스를 이용하여 보다 편리하게 함수를 다룰 수 있다. 참고로 클래스는 데이터나 처리의 정의 등을 하나로 정리해둔 모형과 같은 것이다.
클래스를 사용 안하고 함수를 작성한다면 보통 다음과 같이 작성한다.
def something(something):
print(something)
또는 lambda 함수를 이용해서 함수명을 선언하지 않은채로 일회성으로 함수를 작성하는 것도 가능하다.
print_string = lambda s: print(s)
print_string("fucking python")
그러나 클래스를 이용한다면 기본적으로 다음과 같이 작성하게 된다.
class SomeClass:
def __init__(self, something):
self.something = something
def some_function(self):
print(self.something)
클래스를 구성하는 메리트는 다음과 같다고 할 수 있을 것 같다.
-글로벌(global) 변수를 없애고, 모든 변수를 어떠한 스코프에 소속시킨다.
-몇 번이고 재사용할 수 있다.
-코드의 수정을 최소화한다.
-함수 실행중에, 함수 자신을 다시 호출하는 처리 등이 가능하게 하다.
2.클래스와 인스턴스
클래스에 정의된 데이터나 함수를 자유자재로 사용하기 위해서는 "instance"를 생성해야 한다.
인스턴스의 사전적 개념은 '클래스를 실체화한 것'이라고 하는데, 잘 와닿지 않으니, 붕어빵을 예시로 들어 보겠다.
붕어빵이라는 이름의 클래스가 있다. -> 이는 비유하자면 붕어빵 틀이라고 볼 수 있다.
해당 클래스의 생성자를 통해
객체 a와 객체 b를 선언했다.
->이때, 객체 a,b는 붕어빵이라는 클래스의 인스턴스라고 볼 수 있다.
붕어빵틀로부터 붕어빵이 생성되듯이,
해당 클래스로부터 생성된 객체를 인스턴스라 한다.
붕어빵 틀에서는 반복해서 붕어빵을 생산해 낼 수 있기에 하나의 클래스로 부터 a나 b와 같은 여러 개의 인스턴스를 생성하는 것이 가능하다.
다음예제코드를 확인해보면,
#함수를 편리하게 다루고자 할때,
#람다함수를 쓰기도 하고(1)
#클래스 선언후 그 안의 클래스 함수를 쓰기도 한다(2)
#(물론 이 둘에는 용도상의 차이가 확실히 있다)
class SomeClass:
def __init__(self, something):
self.something = something
def some_function(self):
print(self.something)
a = SomeClass("fucking python")
#클래스 안에 something이라는 클래스 멤버가 물려있다.
#클래스가 실체화된 a라는 인스턴스로 부터 해당 멤버를 호출할 수 있다. 호춯한 멤버를 print()로 출력해보자
print(a.something)
#또는 해당 인스턴스가 멤버를 호출하는 메서드를 갖고 있기에 이 메서드를 호출해서 멤버를 출력해보자
a.some_function()
위 예제에서 알 수 있듯이, 인스턴스로부터 클래스의 멤버를 직접적으로 호출하는 것도 가능하고,
클래스의 메서드를 execute하는 것도 가능하므로, 반복적으로 사용해야 하는 함수등에 대해서는
클래스를 선언하고 거기에 중복해서 사용될 데이터나 메서드등을 사전에 기입하여,
필요할때마다 가져다가 쓰는 방식을 추구하는 것이 좋다.
self의 역할
클래스를 쓰면, 항상 접하게 되는 키워드가 있는데, 바로 'self'이다.
'self'는 '인스턴스 자신', '그 시점의 자신', '메소드의 임의의 인수' 등 다양하게 불리어진다.
솔직히 자바를 배운 내 입장에서
굳이 저 'sellf'라는 키워드를 여러번 써줄 필요가 있을까 싶다. 파이썬이 귀찮음을 덜어주는 프로그래밍 언어인데,
이런 부분도 좀 해결이 되면 좋지 않을까싶다.
내 생각에 어노테이션으로 묶는다던가, 아니면 새로운 문법을 공개하던가, 아니면 앞으로 self라는 키워드를 생략해도 코드가 작동되도록 파이썬 버전을 업그레이드 한더가 해서.. (그냥 나의 개인적인 생각이다)
->일단은 클래스의 구성을 취할때 정형화된, 약속된 구문이라 생각하고 기억해두었다가 쓰면 될 것 같다.
__init__()의 이해
우리가 인스터를 생성하기 위해 해당 변수객체에 클래스를 물려야 한다.
그러기 위해서는 a = SomeClass("fucking python")와 같이 생성자를 선언하는 방식으로 구현해줄 필요가 있다.
즉 __init__은 '생성자'자 불리는 초기화를 위한 함수라 보면 되고, 클래스 상에서 더도 말고 덜도 말고 반드시 하나가 존재해야 한다.
__init__()은 반드시 첫번째 인수로 self를 지정해야 한다.(약속이다) self에는 인스턴스 자체가 전달되어 있다. 이로 인해 최초의 (생성자) 메서드 내에 인스턴스 변수를 작성하는 것이 가능해진다. 클래스를 생성할 때에 지정한 인수는 초기화 메서드의 2번째 인수부터 작성해 나가면 된다.
class SomeClass:
def __init__(self, something): #constructor
self.something = something
다음 예제를 통해 클래스와 메서드에 대해 익숙해져보자!
으뜸파이썬(연습문제9.1)
Q.다음 파이썬 연산을 __add__(), __sub__(), __mul__(), __truediv__() 함수를 사용하여 구현하시오.
(1) 123 + 334
(2) 123 - 334
(3) 123 * 334
(4) 123/3
참고 및 출처:
'Grammer' 카테고리의 다른 글
파이썬으로 복소수 표현하기! (0) | 2023.04.22 |
---|---|
파이썬 format 함수에 대해 알아보자!(문자열 포매팅 방법(1)) (4) | 2023.01.29 |
댓글