.box_article .article_cont p code

상세 컨텐츠

본문 제목

[알쓸쿠잡] class 클래스

알쓸쿠잡/파이썬

by 현지인포스 2021. 11. 24. 14:01

본문

작성자: 13기 김현지

파이썬 class 개념 정리!

 

Contents

  1. 클래스 사용하기
  2. 클래스 상속 사용하기

1. 클래스 사용하기

클래스와 메서드 만들기

클래스는 class에 클래스 이름을 지정하고 : (콜론)을 붙인 뒤 다음 줄부터 def로 메서드를 작성하면 된다. 여기서 메서드는 클래스 안에 들어있는 함수를 뜻한다.

  • 클래스 이름은 보통 대문자로 시작한다.
  • 메서드 작성 방법은 함수와 같으며 코드는 반드시 들여쓰기를 해야 한다.
  • 메서드의 첫 번째 매개변수는 반드시 self를 지정해야 한다.
class 클래스이름:
   def 메서드(self):
       코드

예제

class Person: 
    def greeting(self):
        print('Hello')

클래스를 사용하기 위해서는 다음과 같이 클래스에 () (괄호)를 붙인 뒤 변수에 할당한다.

  • 인스턴스 = 클래스()
james = Person()

Person으로 변수 james를 만들었고, 이 james가 Person의 인스턴스이다. 클래스는 특정 개념을 표현만 할뿐 사용을 하려면 인스턴스를 생성해야 한다.

 

메서드 호출하기

메서드는 클래스가 아니라 인스턴스를 통해 호출한다. 다음과 같이 인스턴스 뒤에 .(점)을 붙이고 메서드를 호출하면 된다.

  • 인스턴스.메서드()
james.greeting()
>> Hello

james.greeting을 호출하니 'Hello'가 출력되었다.

 

메서드 안에서 메서드 호출하기

메서드 안에서 메서드를 호출할 때는 다음과 같이 self.메서드( ) 형식으로 호출해야 한다. self 없이 메서드 이름만 사용하면 클래스 바깥쪽에 있는 함수를 호출한다는 뜻이 되므로 주의해야 한다.

class Person:
    def greeting(self):
        print('Hello')
        
    def hello(self):
        self.greeting()  # self.메서드() 형식으로 클래스 안의 메서드 호출

 

속성 사용하기

속성(attribute)을 만들 때는 __init__ 메서드 안에서 self.속성 에 값을 할당한다.

class 클래스이름:
    def __init__(self):
        self.속성 = 값

예제

class Person:
    def __init__(self):
        self.hello = '안녕하세요.'

 __init__ 메서드 

__init__ 메서드는 james = Person()처럼 클래스에 ( ) 붙여서 인스턴스를 만들 때 호출되는 특별한 메서드이다. 즉, 이름(initialize)이라는 이름 그대로 인스턴스(객체)를 초기화한다.

class Person:
    def __init__(self):
        self.hello = '안녕하세요.'
 
    def greeting(self):
        print(self.hello)
 
james = Person()
james.greeting()    # 안녕하세요.

greeting 메서드에서는 print로 self.hello를 출력하도록 만들었다.

 

속성은 __init__ 메서드에서 만든다는 점과 self에 .(점)을 붙인 뒤 값을 할당한다는 점이 중요하다. 클래스 안에서 속성을 사용할 때도 self.hello처럼 self에 점을 붙여서 사용하면 된다.

 

self의 의미

self는 인스턴스 자기 자신을 의미한다. 인스턴스가 생성될 때 self.hello = '안녕하세요'처럼 자기 자신에 속성을 추가했다. 여기서 __init__의 매개변수 self에 들어가는 값은 Person()이라 할 수 있다. 그리고 self가 완성된 뒤 james에 할당된다. 이후 메서드를 호출하면 현재 인스턴스가 자동으로 매개변수 self에 들어온다. 그래서 greeting 메서드에서 print(self.hello)처럼 속성을 출력할 수 있었던 것이다.

인스턴스와 self

 

인스턴스를 만들 때 값 받기

다음과 같이 __init__ 메서드에서 self 다음에 값을 받을 매개변수를 지정한다. 그리고 매개변수를 self.속성에 넣어준다.

class 클래스이름:
    def __init__(self, 매개변수1, 매개변수2):
        self.속성1 = 매개변수1
        self.속성2 = 매개변수2

예제

class Person:
    def __init__(self, name, age, address):
        self.hello = '안녕하세요.'
        self.name = name
        self.age = age
        self.address = address
 
    def greeting(self):
        print('{0} 저는 {1}입니다.'.format(self.hello, self.name))
 
maria = Person('마리아', 20, '서울시 서초구 반포동')
maria.greeting()    # 안녕하세요. 저는 마리아입니다.
 
print('이름:', maria.name)       # 마리아
print('나이:', maria.age)        # 20
print('주소:', maria.address)    # 서울시 서초구 반포동

실행결과

안녕하세요. 저는 마리아입니다.
이름: 마리아
나이: 20
주소: 서울시 서초구 반포동

 


 

2. 클래스 상속 사용하기

상속(inheritance)은 무언가를 물려받는다는 뜻이다. 그래서 클래스 상속은 물려받는 기능을 유지한채로 다른 기능을 추가할 때 사용하는 기능이다. 

  • 기반 클래스(base class): 기능을 물려주는 클래스. 부모 클래스(parent class) 혹은 슈퍼 클래스(superclass)라고도 부른다.
  • 파생 클래스(derived class): 상속을 받아 새롭게 만드는 클래스. 자식 클래스(child class) 혹은 서브 클래스(subclass)라고도 부른다.

만약 새로운 기능이 필요할 때마다 계속 클래스를 만든다면 중복되는 부분을 반복해서 만들어야 한다. 이럴 때 상속을 이용하면 중복되는 기능을 만들지 않아도 된다. 따라서 상속은 기존 기능을 재사용할 수 있어서 효율적이다.

 

사람 클래스로 학생 클래스 만들기

클래스 상속은 다음과 같이 클래스를 만들 때 ( )(괄호)를 붙이고 안에 기반 클래스 이름을 넣는다.

class 기반클래스이름:
    코드
    
class 파생클래스이름(기반클래스이름):
    코드

예제: 사람 클래스를 만들고 사람 클래스를 상속받아 학생 클래스 만들기

class Person:
    def greeting(self):
        print('안녕하세요.')
        
class Student(Person):
    def study(self):
        print('공부하기')

james = Student()
james.greeting()    # 안녕하세요.: 기반 클래스 Person의 메서드 호출
james.study()       # 공부하기: 파생 클래스 Student에 추가한 study 메서드

Student 클래스에는 greeting 메서드가 없지만 Person 클래스를 상속받았으므로 greeting 메서드를 호출할 수 있다.

 

상속 관계

상속은 명확하게 같은 종류이며 동등한 관계일 때 사용한다. 

포함 관계

위 예제에서의 학생 클래스가 아니라 사람 목록을 관리하는 클래스를 만든다면 어떻게 해야 할까? 다음과 같이 리스트 속성에 Person 인스턴스를 넣어서 관리하면 된다.

class Person:
    def greeting(self):
        print('안녕하세요.')
 
class PersonList:
    def __init__(self):
        self.person_list = []    # 리스트 속성에 Person 인스턴스를 넣어서 관리
 
    def append_person(self, person):    # 리스트 속성에 Person 인스턴스를 추가하는 함수
        self.person_list.append(person)

여기서는 상속을 사용하지 않고 속성에 인스턴스를 넣어서 관리하므로 PersonList가 Person을 포함하고 있다. 이러면 사람 목록 PersonList와 사람 Person은 동등한 관계가 아니라 포함관계이다.

 

기반 클래스의 속성 사용하기

기반 클래스에 있는 인스턴스 속성을 사용해보자. 다음과 같이 Person 클래스에 hello 속성이 있고, Person 클래스를 상속받아 Student 클래스를 만든다. 그 다음에 Student로 인스턴스를 만들고 hello 속성에 접근해본다.

class Person:
    def __init__(self):
        print('Person __init__')
        self.hello = '안녕하세요.'
        
class Student(Person):
    def __init__(self):
        print('Student __init__')
        self.school = '파이썬 코딩 도장'
        
james = Student()
print(james.school)
print(james.hello)    # 기반 클래스의 속성을 출력하려고 하면 에러가 발생함

실행을 해보면 에러가 발생한다. 왜냐하면 기반 클래스 Person의 ___init__ 메서드가 호출되지 않았기 때문이다. 즉, Pesron의 __init__ 메서드가 호출되지 않으면 self.hello = '안녕하세요.'도 실행되지 않아서 속성이 만들어지지 않는다.

 

super()로 기반 클래스 초기화하기

이때는 super()를 사용해서 기반 클래스의 __init__ 메서드를 호출해준다. 다음과 같이 super() 뒤에 . (점)을 붙여서 메서드를 호출하는 방식이다.

  • super( ).메서드( )
class Person:
    def __init__(self):
        print('Person __init__')
        self.hello = '안녕하세요.'
 
class Student(Person):
    def __init__(self):
        print('Student __init__')
        super().__init__()                # super()로 기반 클래스의 __init__ 메서드 호출
        self.school = '파이썬 코딩 도장'
 
james = Student()
print(james.school)
print(james.hello)

super( ).__init__( )와 같이 기반 클래스 Person의 __init__ 메서드를 호출해주면 기반 클래스가 초기화되어서 속성이 만들어진다. 

 

메서드 오버라이딩 사용하기

  • 메서드 오버라이딩: 파생 클래스에서 기반 클래스의 메서드를 새로 정의하는 것

다음과 같이 Person의 greeting 메서드가 있는 상태에서 Student에도 greeting 메서드를 만든다.

class Person:
    def greeting(self):
        print('안녕하세요.')
 
class Student(Person):
    def greeting(self):
        print('안녕하세요. 저는 고려대학교 학생입니다.')
 
james = Student()
james.greeting()

실행 결과

안녕하세요. 저는 고려대학교 학생입니다.

오버라이딩(overriding)은 무시하다. 우선하다라는 뜻을 가지는데 말 그대로 기반 클래스의 메서드는 무시하고 새로운 메서드를 만든다는 뜻이다. 여기서는 Person 클래스의 greeting 메서드를 무시하고 Student 클래스에서 새로운 greeting 메서드를 만들었다.

 

오버라이딩은 왜 사용할까? 보통 프로그램에서 어떤 기능이 같은 메서들 이름으로 계속 사용되어야 할 때 메서드 오버라이딩을 활용한다. 만약 Student 클래스에서 인사하는 메서드를 greeting2로 만들어야 한다면 모든 소스 코드에서 메서드 호출 부분을 greeting2로 수정해야 할 것이다. 

 

다시 위에 예제에서 Person 클래스의 greeting 메서드와 Student 클래스의 greeting 메서드를 보면 '안녕하세요.'라는 문구가 중복된다. 이럴 때는 기반 클래스의 메서드를 재활용하면 중복을 줄일 수 있다. 다음과 같이 오버라이딩된 메서드에서 super()로 기반 클래스의 메서드를 호출해보자.

class Person:
    def greeting(self):
        print('안녕하세요.')
        
class Student(Person):
    def greeting(self):
        super().greeting() # 기반 클래스의 메서드를 호출하여 중복을 줄임
        print('저는 고려대학교 학생입니다.')
        
james = Student()
james.greeting()

실행 결과

안녕하세요.
저는 고려대학교 학생입니다.

이처럼 메서드 오버라이딩은 원래 기능을 유지하면서 새로운 기능을 덧붙일 때 사용한다.

 

다중 상속 사용하기

다중 상속은 여러 기반 클래스로부터 상속을 받아서 파생 클래스를 만드는 방법이다. 다음과 같이 클래스를 만들 때 ( )(괄호) 안에 클래스 이름을 , (콤마)로 구분해서 넣는다.

class 기반클래스이름1:
    코드
    
class 기반클래스2:
    코드
    
class 파생클래스이름(기반클래스이름1, 기반클래스이름2):
    코드

예제) 사람 클래스와 대학교 클래스를 만든 뒤 다중 상속으로 대학생 클래스 만들기

class Person:
    def greeting(self):
        print('안녕하세요')

class University:
    def manage_credit(self):
        print('학점 관리')
        
class Undergraduate(Person, University):
    def study(self):
        print('공부하기')
        
james = Undergraduate()
james.greeting()         # 안녕하세요.: 기반 클래스 Person의 메서드 호출
james.manage_credit()    # 학점 관리: 기반 클래스 University의 메서드 호출
james.study()            # 공부하기: 파생 클래스 Undergraduate에 추가한 study 메서드

먼저 기반 클래스 Person과 University를 만들었다. 그 다음 파생 클래스 Undergraduate를 만들 때 괄호 안에 Person과 University를 콤마로 구분해서 넣었따. 이렇게 하면 두 기반 클래스의 기능을 모두 상속 받는다.

즉, 다음과 같이 Undergraduate 클래스의 인스턴스로 Person의 greeting과 University의 manage_credit을 호출할 수 있다.

'알쓸쿠잡 > 파이썬' 카테고리의 다른 글

[알쓸쿠잡] Kaggle과 Colab 연결하기  (1) 2021.09.10

관련글 더보기

댓글 영역