파이썬 클래스 정의와 활용

 클래스를 이전에 설명했다.


이전 글 참고


이번에는 클래스를 만드는 방법을 설명한다.

실습을 위해 Google Colab을 사용하기 바란다.

클래스 이름 Student를 만들어보자.


class Student:
  pass


클래스가 다 만들어졌다. 실로 간단하다. 키워드 class에 클래스의 이름을 붙이고 코드블록을 만들기 위해 콜론을 썼다. 그리고 아무일도 안할 것이라서 pass를 썼다.

이제 클래스로 오브젝트를 생성하자. 


kim01=Student()
lee01=Student()
kim02=Student()


학생 세 명을 만들었다. 오브젝트 kim01, lee01, kim02이다. 주의할 점. 파이썬 프로그램에서 여러분이 다루는 것은 '클래스'가 아닌 '오브젝트'다. 일을 시키거나 데이터를 저장하거나 다 오브젝트를 통한다. 클래스는 오브젝트를 만들기 위한 도구에 불과하다.

한편, 클래스를 오브젝트처럼 사용할 수도 있다. 이 부분은 나중에 따로 설명한다. 원칙은 오브젝트(객체)를 사용한다는 것이다.

속성(혹은 멤버) 사용하기

이제 클래스를 확장해보자. 이미 Student라는 클래스가 있다고 가정하고 이를 확장하여 KWUStudent라고 하는 클래스를 만든다. 그리고 학교 이름으로 '광운대'라고 하자. 멤버에 이름과 학번, 그리고 전화번호를 할당한다.


class KWUStudent(Student):
  def __init__(self):
    self.school='광운대학교'
    self.name=""
    self.student_id=""
    self.phone=""


KWUStudent의 괄호 안에 Student가 있다. 즉, Student를 입력 받아 KWUStudent를 만들었다. 이렇게 입력받는 행위를 '상속'이라고 부른다. KWUStudent는 Student를 상속한다. 그리고 __init__(self)는 매쏘드다. 클래스의 매쏘드는 일반적으로 '매쏘드이름(self)'로 구성된다. 키워드 self 오브젝트 자신을 가리킨다. 즉, self.school은 자신이 가진 school이라는 변수, 즉 속성 혹은 멤버다. 이때 멤버의 이름이 school이다. name이나 student_id, phone 모두 멤버에 해당한다. 특히 __init__(self)를 constructor라고 한다. 객체를 생성할 때 자동으로 실행되는 매쏘드다. 우리는 클래스가 객체를 만들 때 __init__(self) 즉 초기화(initialization)하여 4개의 속성을 만든다.

이제 오브젝트를 찍어보자.


kim03=KWUStudent()
lee03=KWUStudent()


다음 그림은 Colab의 결과다.


클래스에서 어떤 오브젝트가 나올 지 몰라서 self.school이라고 했는데 구체적인 오브젝트가 만들어졌으니 이제 kim03.school 등으로 부를 수 있다. kim03.name="Gildong"이라고 하자. 그러면 kim03의 이름이 바뀌지만 lee03.name은 아무런 영향을 받지 않는다. 서로 다른 오브젝트라서 데이터가 독립적이다.





이름으로 Gildong만 출력되고 lee03.name은 "" 즉 공백으로 출력된다. 위에서 KWUStudent를 만들었던 방식을 생각해보자.

데이터 클래스로 멤버 결정하기

새로운 파이썬은 타입 힌트 기능을 사용한다. 그리고 데이터 클래스를 정의하여 멤버를 정해줄 수도 있다. 다음 코드를 보자.


from dataclasses import dataclass

@dataclass
class Business(KWUStudent):
  subject:str="Data Science"
  grade:float=4.3
  year:int=3


모듈 dataclasses에서 dataclass 클래스를 가져왔다. 이 클래스는 @기호를 써서 사용한다. 이렇게 다른 클래스 앞에 기능을 덧붙여주는 특수한 클래스를 장식자(decorator)라고 부른다. 우리는 Business 클래스를 KWUStudent를 상속하여 만들고 장식자로 dataclass를 붙였다.

이제 클래스를 선언하자마자 멤버를 지정할 수 있다. 타입 힌트로 subject에 str을, grade에 float을 year에 int를 주었다. 타입 힌트를 주는 방법은 이름:타입 형태를 취하면 된다.

이제 오브젝트를 찍어보자.



결과를 보면 AttributeError가 떴다. 뭐가 잘못되었나? 메시지를 읽어보면 school이 없다고 한다. 상속을 했는데도 왜 school이 없을까? 원래 school은 KWUStudent에 포함되어 있고 상속을 했으므로 Business 클래스로 찍은 park01에서도 보여야 한다.

장식자를 Business에 썼는데 KWUStudent에는 사용하지 않아서 생기는 문제다. 이를 고치려면 다음과 같이 KWUStudent를 수정하여 다시 실행한다.


@dataclass
class KWUStudent(Student):
  school:str='광운대학교'
  name:str=""
  student_id:str=""
  phone:str=""


이제 실행결과를 다시 보자.



오브젝트를 만들 때 디폴트 값을 수정했다. dataclass 장식자와 타입 힌트를 사용하지 않는 경우를 아래에 적어두었다. 


class KWUStudent(Student):
  def __init__(self,school='광운대학교',name='',student_id='',phone=''):
    self.school=school
    self.name=name
    self.student_id=student_id
    self.phone=phone
class Business(KWUStudent):
  def __init__(self,subject='Data Science',grade=4.3,year=3):
    super().__init__()
    self.subject=subject
    self.grade=grade
    self.year=year
park01=Business()
print(park01.school)
print(park01.subject)
print(park01.year)
park01.name="Yooshin"
print(park01.name)


새롭게 super().__init__()가 보인다. KWUStudent의 속성을 생성하기 위해서 사용한다. park01=Business()는 Business에서만 생성하기 때문에 일일이 Business 생성 시에 KWUStudent도 생성하라고 알려줘야 한다. super()를 사용하지 않는 또 다른 방법은 다음과 같다.


class KWUStudent(Student):
  def __init__(self,school='광운대학교',name='',student_id='',phone=''):
    self.school=school
    self.name=name
    self.student_id=student_id
    self.phone=phone
class Business(KWUStudent):
  def __init__(self,subject='Data Science',grade=4.3,year=3):
    KWUStudent.__init__(self)
    self.subject=subject
    self.grade=grade
    self.year=year
park01=Business()
print(park01.school)
print(park01.subject)
print(park01.year)
park01.name="Yooshin"
print(park01.name)


결과를 보자.



이번 시간에는 클래스의 기초적인 사용법, 멤버에 대해 살펴봤다. 다음 시간에는 매쏘드와 다른 주제들을 알아보자.

댓글 없음:

댓글 쓰기

PyR Intro - 신입생OT학기제