soominkim Study
article thumbnail
Published 2023. 3. 8. 09:00
[Python] Class Python
728x90

 

클래스는 객체지향 프로그래밍에 있어서 매우 중요합니다. 클래스를 이용해 프로그래밍하면 데이터와 데이터를 조작하는 함수를 하나의 묶음으로 관리할 수 있으므로 복잡한 프로그램도 더욱 쉽게 작성할 수 있습니다.

파이썬에서 함수를 사용하기 전에 함수를 정의하는 것처럼 클래스 역시 사용하기 전에 먼저 정의를 해야합니다. 

다음은 클래스를 정의하는 아주 단순한 예제입니다.

class BusinessCard:
	pass

클래스를 정의하려면 class 라는 키워드를 사용합니다. 클래스를 사용하는 목적이 변수와 함수를 묶어서 하나의 새로운 객체로 만드는 것이기 때문에 당연히 클래스는 변수나 함수를 포함시켜 정의할 수 있습니다. 다만 위 코드에서는 가장 간단한 형태의 클래스 정의를 보여주기 때문에 변수나 함수를 넣지 않고 pass라는 키워드만 사용했습니다. pass 키워드를 사용하면 클래스 내부에 아무것도 넣지 않은 상태로 클래스를 정의할 수 있습니다. 파이썬에서 클래스를 정의한다는 것은 새로운 데이터 타입을 정의한 것이기 때문에 이를 실제로 사용하려면 인스턴스를 생성해야 합니다. 다음은 인스턴스를 생성하는 예제입니다.

card1 = BusinessCard()

그러나 BusinessCard 클래스는 내부에 정의되어 있는 함수나 변수가 없기때문에 별다른 기능을 하지 못 했습니다. 

다음 예제처럼 클래스에 기능을 추가할 수 있습니다. 

class BusinessCard:
	def set_info(self, name, email, addr):
    	self.name=name
        self.email=email
        self.addr=addr

여기서 중요한 것은 클래스 내에 정의된 함수를 메서드라고 부르는 것이며, 메서드의 첫 번째 인자는 항상 self여야 합니다.

함수 set_info는 다음과 같이 변경할 수 있습니다.

class BusinessCard:
    	def __init__(self, name, email, addr):
            self.name = name
            self.email = email
            self.addr = addr

init는initialize의 약어로 초기화라는 뜻을 담고있습니다. 위와 같은 클래스를 만들 때 첫 번째 인자는 항상 self여야 한다고 말했습니다. 하지만 메서드의 첫 번째 인자가 항상 self여야 한다는 것은 틀린 말입니다. 

다음 예제는 이 self에 대해 이해를 도와줄 것입니다.

 class Foo:
        def func1():
                print("function 1")
        def func2(self):
                print("function 2")

Foo 클래스가 있습니다. 여기서 알아채야할 것은 func1 메서드는 첫 번째 인자가 self가 아님에도 클래스를 정의할 때 에러가 발생하지 않는다는 점에 있습니다.  그렇다면 인스턴스를 생성하고 이를 호출해보겠습니다.

f = Foo()
f.func2()

위 코드를 실행하면 화면에 정상적으로 출력되는 것을 확인할 수 있습니다. func2 메서드의 첫 번째 인자는 self지만 호출할 때는 아무것도 전달하지 않아도 되는 것은 파이썬이 자동으로 넘겨주기 때문입니다. 그러나 func1을 실행할 경우 오류가 발생합니다. 아마도 오류메시지는 다음과 같이 나타날 것입니다.

TypeError: func1() takes 0 positional arguments but 1 was given

이는 앞에서 설명한 것처럼 파이썬 메서드의 첫 번째 인자로 항상 인스턴스가 전달되기 때문에 발생하는 문제입니다.

객체지향프로그래밍의 대표적인 특징 중 하나인 상속은 클래스에 이미 구현된 메서드를 다른 클래스에서 사용할 수 있게 해줍니다. 이는 상속받는다고 표현합니다.

class Parent:
        def can_sing(self):
                print("Sing a song")

위와 같은 부모 클래스가 있습니다. 그리고 다음과 같은 자식 클래스가 있습니다.

class LuckyChild(Parent):
        pass

자식 클래스에 부모 클래스를 매개변수로 주면서 자식 클래스는 부모 클래스를 상속받게 됩니다.

child1 = LuckyChild()
child1.can_sing()
>>> Sing a song

 

728x90
profile

soominkim Study

@soominkim

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그