업데이트:

카테고리:

클래스에 대해서 간단하게 조사하고 기록한 글입니다.

예제를 통해서 알아봅시다.

클래스 이해하기



예제로 알아봅시다!

내가 회사를 차렸다. 그래서 첫 직원이 들어왔네?? 직원의 정보가 다음과 같이 생겼다.

name = "hyuntak"
email = "znlduqwl@naver.com"
address = "seoul"

이 직원의 명함을 만들어서 출력 하려고 다음과 같이간단하게 출력함수를 만들었다.

def card(name_,email_,address_):
  print(name_)
  print(email_)
  print(address_)

이제 card(name,email,address)를 통해 다음과 같은 결과를 출력받는다.

hyuntak
znlduqwl@naver.com
seoul

이제 직원이 2명이라고 하자. 2번째 직원의 정보는 다음과 같다.

name2 = "kimyuna"
email2 = "yunakim@naver.com"
address2 = "seoul"

card(name2,email2,address2) 를 통해 명함을 출력하자.

kimyuna
yunakim@naver.com
seoul

이렇게 직원이 1~2명이면 일일이 코딩할 수 있다. 하지만 만약에 직원이 엄청나게 많아져서 100만명이 되면, 일일이 다 적을 수 있는가??? 이럴 때 쓰는게 Class다!

직원 클래스를 다음과 같이 만들 수 있다.


class BusinessCard:
  def set_info(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("--------------------")

※ 클래스 내에 정의되는 함수를 메서드라고 부른다.

이렇게 클래스를 지정하면 우리는 다음과 같이 객체를 만들 수 있다.

member1=BusinessCard()
member1.set_info("aa","aa@.com","AA")
member1.print_info()

member2=BusinessCard()
member2.set_info("bb","bb@.com","BB")
member2.print_info()

member3=BusinessCard()
member3.set_info("cc","cc@.com","CC")
member3.print_info()

위와 같이 member를 각각 클래스로 지정하고 인스턴스를 만들 수 있다. 그럼 좀더 편하게 만들 수 있지. 결과는 아래와 같다.

--------------------
Name: aa
E-mail: aa@.com
Address: AA
--------------------
--------------------
Name: bb
E-mail: bb@.com
Address: BB
--------------------
--------------------
Name: cc
E-mail: cc@.com
Address: CC
--------------------

그러나 위와 같이 클래스를 짜면 안좋다. 왜냐하면, 클래스 내에서 먼저 인스턴스를 생성하고 생성된 인스턴스에 데이터를 입력하는 순으로 코드가 구성돼 있기 때문이다. 붕어빵에 비유해 보면 붕어빵 틀(클래스)을 이용해 팥소를 넣지 않은 상태로 붕어빵을 구운 후(인스턴스생성) 나중에 다시 붕어빵 안으로 팥소를 넣는 것과 비슷하다.

그렇다면, 어떻게 클래스 인스턴스 생성과 초깃값 입력을 한번에 처리할 수 있을까? 파이썬 클래스에는 인스턴스 생성과 동시에 자동으로 호출되는 메서드인 생성자가 존재한다.

init(self)와 같은 이름의 메서드를 생성자 라고 하며, 파이썬 클래스에서 로 시작하는 함수는 모두 특별한 메서드를 의미한다. 생성자인 __init(self) 메서드를 가진 클래스를 생성해보자.

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("--------------------")

이렇게 클래스를 수정하면, 인스턴스의 생성과 동시에 명함에 필요한 정보를 입력 받을 수 있도록 할 수 있다. 이렇게 수정함으로써 위에 member#.set_info(…)를 따로 설정할 필요가 없이 아래와 같이 코딩하면 된다.

member1=BusinessCard("aa","aa@.com","AA")
member1.print_info()

member2=BusinessCard("bb","bb@.com","BB")
member2.print_info()

member3=BusinessCard("cc","cc@.com","CC")
member3.print_info()

결과는 여전히 같다.

self 이해하기


앞에서 클래스 내에 정의된 함수를 메서드라고 부른다고 했습니다. 그리고 메서드의 첫 번째 인자는 항상 self여야 한다고 했습니다. 하지만 메서드의 첫 번째 인자가 항상 self여야 한다는 것은 사실 틀린 말입니다. 이번에는 파이썬 클래스에서 self의 정체를 확실히 이해해 봅시다.


예제로 봐보자!

먼저 다음과 같이 두 개의 메서드가 정의된 Foo 클래스를 만들어 보자. 여기서 눈여겨봐야 할 점은 func1() 메서드의 첫 번째 인자가 self가 아님에도 클래스를 정의할 때 에러가 발생하지 않는다는 점이다.

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

만약에 클래스의 자체적인 인스턴스를 쓸꺼면 self가 메서드의 처음에 반드시 들어가야한다. 예를 들면 다음과 같다.

f=foo()
f.func2() # --> ()안이 비어있는 이유는 self는 뭘 넣을 필요가 없기때문

여기서 f.func1()을 하면 에러가 난다. 그 이유는 인스턴스를 지정하지 않았기 때문이다. 그래서 클래스에서 저런 함수를 쓰고싶다? 그러면 f.func1()로 객체를 선언하고 쓰는게 아닌 foo.func1()을 써야 한다.

2 분 소요