Programming

Class 기초(객체, 인스턴스 , 생성자, self 등)

아나엘 2022. 2. 7. 18:43

1. Class

클래스를 몰라도 기본적인 프로그래밍은 가능. 최근에는 클래스 이용한 객체지향 프로그래밍이 컴퓨터 프로그래밍 분야에서 기본적인 개발 패러다임으로 자리잡음 

 

1) 클래스란?

API 사용하려면 잘 알아야 한다. 또한 데이터와 데이터를 조작하는 함수를 하나의 묶음으로 관리 가능.

name = "anaelle"
email = "aaaa@gmail.com"
addr = "seoul"

이 데이터를 이용해 실제로 명함을 출력하는 함수 만들기. 인자로 받아 포맷에 맞춰 출력.

def print_bc(name, email, addr):
    print("Name: %s" % name)
    print("Email: %s" % email)
    print("Office Address: %s" % addr)

회원 수가 아주 많아진다면 개인정보를 어떻게 저장하면 좋을까? 

 

1-1) 클래스 기초

기본적으로 name, email, addr 각 데이터에 대해 리스트 자료구조 사용. 데이터와 데이터를 처리하는 함수가 분리돼 있고 함수를 순차적으로 호출하며 데이터를 조작하는 프로그래밍 방식을 절차지향 프로그래밍이라고 함.

이와 달리 객체지향 프로그래밍은 객체를 정의하는 것에서 시작.

객체를 만들어 두면 정수, 문자열처럼 하나의 타입으로 인식됨. 정보관리가 쉽다. 

 

1-2) 클래스 정의

함수를 사용하기 전 먼저 함수를 정의하는 것처럼 클래스도 정의가 필요하다. 클래스 사용 목적은 변수와 함수를 묶어 하나의 새로운 객체로 만드는 것이므로, 클래스 내에 변수/함수를 포함시킬 수 있음. 아래 경우처럼 pass만 사용해도 됨

class BusinessCard:
	pass

클래스는 틀

인스턴스는  붕어빵

클래스를 이용해 인스턴스를 생성하려면 클래스 이름 뒤에 () 넣기. 인스턴스 생성 과정은 함수 호출과도 비슷. 'BusinessCard'라는 클래스의 인스턴스가 메모리의 ~~~위치에 생성되고 card1이라는 변수가 이를 바인딩하게 됨.

card1 = BusinessCard()
card
<__main__.BusinessCard object at ~~~>

 

1-3) 클래스에 메서드 추가하기

클래스 내부에 정의된 함수를 특별히 메서드(method)라고 함. 다음 코드는 BusinessCard Class에 set_info method 추가한 것.

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

이때 뒤의 세 인자는 입력받은 데이터를 메서드로 전달하는 것을 알겠는데, self는 뭔지 모르겠다! (뒤에서 설명) 항상 그런 건 아니지만 일단은 메서드의 첫 번째 인자는 무조건 self여야 한다고 생각하자. 파이썬 IDLE에서 괄호를 입력하면 메서드 인자가 3개로 표시됨. 전달도 3개만 한다.

self.name, self.email처럼 'self.변수명' 형태의 변수를 인스턴스 변수(=클래스 인스턴스 내부의 변수)라고 함. 인스턴스 생성 후 메서드를 호출하면 메서드의 인자로 전달된 값을 인스턴스 내부변수인 self.name, self.email 등이 바인딩하는 것. 클래스 정의 순간에는 인스턴스 이름이 뭔지 모르기 때문에 당시에는 self라는 이름을 대신 사용하는 것.

 

 

2) 클래스 생성자

__init__(self) 같은 이름의 메서드를 생성자라고 함. (initialize) 파이썬 클래스에서 __ 로 시작하는 함수는 모두 특별한 메서드.

생성자 메서드를 가진 MyClass 클래스를 정의하고,

class MyClass:
	def __init__(self):
    	print("객체가 생성되었습니다.")

이 클래스의 인스턴스 생성해보자. 바로 글자가 나오는 이유는 인스턴스 생성 시점에 자동으로 생성자 메서드가 호출되기 때문이다.

>>> inst1 = MyClass()
객체가 생성되었습니다

 

그러면 인스턴스 생성과 동시에 명함에 필요한 정보를 입력받도록 클래스를 새롭게 정의하자.

>>> class BusinessCard:
        def __init__(self, name, email, addr):
                self.name = name
                self.email = email
                self.addr = addr
        def print_info(self):
                print("--------------------")
                print("Name: ", self.name)
                print("E-mail: ", self.email)
                print("Address: ", self.addr)
                print("--------------------")

인스턴스 생성 시 바로 인자를 3개 넘겨줘야 한다.

>>> member1 = BusinessCard("Kangsan Lee", "kangsan.lee", "USA")
>>> member1.print_info()
--------------------
Name:  Kangsan Lee
E-mail:  kangsan.lee
Address:  USA
--------------------
>>>

 

 

3) self

두 개의 메서드가 정의된 Foo class 만들어보자. func1() 메서드의 첫 번째 인자가 self 아니어도 클래스 정의 시 에러 발생하지는 않는다.

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

self에 대한 값은 파이썬이 자동으로 넘겨주므로 func2는 인자 전달할 필요 없음. func1은 인스턴스를 통해 func1 호출 시 오류 발생

>>> f.func1()
Traceback (most recent call last):
  File "<pyshell#25>", line 1, in <module>
    f.func1()
TypeError: func1() takes 0 positional arguments but 1 was given
>>>

...중략...

 

인스턴스를 통해 func2를 호출하는 것과 클래스 이름을 통해 func2를 호출하는 것은 어떤 차이가 있을까? 결론부터 말하자면 둘 사이에는 아무런 차이가 없음. 다만 ‘인스턴스.메서드()’냐 ‘클래스.메서드(인스턴스)’냐라는 차이가 있을 뿐이고, 보통은 ‘인스턴스.메서드()’와 같은 방식을 주로 사용

f3.func2()

 

 

 

참고 

https://wikidocs.net/book/110 파이썬으로 배우는 알고리즘 트레이딩 (개정판-2쇄)

반응형