본문 바로가기
파이썬/[누구나! 완전 기초 파이썬]

#9 클래스(Class)

by J-Build 2020. 10. 5.

이번 시간에는 클래스에 대해서 알아보겠습니다. 클래스는 설명해야할것이 많은 주제입니다. 하지만 이 강좌에선 아주 기본적인 개념에 대해서만 배워보도록 하겠습니다.

 

클래스(Class)란? 

클래스는 객체(Object)를 생성하기 위한 확장 가능한 코드의 집합이라고 볼 수 있습니다. 클래스는 상태를 제공하는 값 또는 변수들과 기능을 제공하는 함수로 이뤄져 있습니다. 조금 어려운 말들이 많이 나온것 같습니다. 비유적으로 표현해보면, 클래스는 어떤 물건을 찍어내기 위한 일종의 틀 이라고 생각할 수 있습니다. 객체는 그 틀을 이용해서 찍어내는 실제 물건이라고 할 수 있구요. 다만 클래스는 간단한 틀과는 다르게 다양한 기능을 가진 복잡한 객체도 생성할 수 있게 합니다. 

 

클래스는 왜 필요할까? 

어떤 기능을 파이썬 코드로 구현하는데 클래스가 반드시 필요한것은 아닙니다. 사실 없어도 됩니다. 하지만 클래스를 사용하면 관리가 쉽고 코드의 확장이 쉬워지기 때문입니다. 우리가 간단한 기능을 하는 프로그램을 만들때는 굳이 클래스가 필요하지 않을 수 있습니다. 하지만 복잡하고 비슷하지만 조금씩 다른 기능들이 많이 필요할때는 클래스를 사용하면 효율적으로 코드를 작성할 수 있습니다. 또한 클래스가 있으면 그 클래스를 확장해서 좀 더 쉽고 빠르게 다른 클래스를 생성할 수 도 있습니다. 우리는 이렇게 클래스를 사용해서 프로그래밍 하는 방법을 객체지향 프로그래밍(Object-Oriented Programming)이라고 부릅니다. 

 

클래스는 어떻게 생겼을까? 

클래스는 class 라는 키워드로 정의할 수 있습니다. class 클래스이름: 으로 시작해서 클래스를 정의할 수 있습니다. 그럼 가장 일반적인 형태의 클래스정의를 한번 살펴볼께요. 

class Animal:
    def __init__(self, name):
        self.name = name
        
    def say(self):
        print('My name is ' + self.name)

 

새로운 것들이 등장했습니다. 먼저 __init__ 이라는 이름의 함수가 보이고, self 라는 키워드도 보이네요. 전체적으로 봤을때 클래스 안에는 여러 함수들의 정의가 들어있음을 알 수 있습니다. 그리고 이제부터 클래스 안에 정의된 함수들은 메소드(method)라는 이름으로 부르도록 하겠습니다. 

 

__init__

일단 __init__ 부터 알아보고 나서 진행할께요. 

__init__ 함수는 클래스가 생성될 때 실행이 되는 메소드입니다. 즉, 클래스가 객체화 될때 자동적으로 실행되는 메소드입니다. 보통 클래스에 필요한 변수들을 초기화하는 용도로 쓰입니다. __init__ 함수는 특수한 메소드이기 때문에 이름을 임의로 변경할 수 없습니다. 

 

self

그 다음으로 self를 알아볼께요. 

self라는 영단어가 의미하는 것처럼, '자신'을 의미하는 키워드입니다. 즉, 클래스가 객체화 되었을 때, 그 객체를 가르키는 의미입니다. 이 말의 의미가 무엇인지 이해가 안돼도 괜찮습니다. 일단 아래 두가지 사항만 기억해 두세요. 

  1. 클래스 안에서 메소드를 정의할 때, 그 첫번째 인자는 self가 되어야 합니다.
  2. 클래스 안에서 self로 시작되는 변수는 클래스의 속성(attribute)이라고 부르며, 클래스 안의 메소드에서 self.변수이름 으로 접근할 수 있습니다. 
  3. 클래스 안에서 메소드를 접근하기 위해서는 self.메소드이름 을 사용해야 합니다. 

클래스의 사용법

이제 위의 Animal 클래스를 한번 사용해 보겠습니다. 즉, 클래스를 객체화 시켜서 변수에 할당해 보겠습니다. 

class Animal:
    def __init__(self, name):
        self.name = name
        
    def say(self):
        print('My name is ' + self.name)
        
my_pet = Animal('J')
my_pet.say()
# My name is J

 

위의 코드를 하나씩 살펴 볼께요. 

클래스를 사용해서 객체화 시키기 위해서 아래처럼 클래스 이름에 인자로 'J'를 주어서 객체를 생성했고, 그 객체를 my_pet이라는 변수에 할당을 했습니다. 

my_pet = Animal('J')

 

위에서 보면 객체를 생성할때 괄호 안에 인자를 넣어주는데, 이것은 클래스의 __init__ 함수에 들어가는 인자를 의미합니다. 즉, __init__ 함수에서 self 뒤에 선언된 인자들을 의미합니다. 이 경우엔 name 이라는 인자에 'J' 라는 값이 할당되는 것이죠. 그리고 __init__ 함수 안에서 'J'는 self.name 이라는 클래스 속성(attribute)에 저장이 되게 됩니다. 

 

이제, my_pet은 Animal 클래스의 객체가 되었습니다. 이 객체는 name 이라는 속성(attribute)이 있고, say() 라는 메소드를 사용할 수 있습니다. 우리는 위의 코드에서 name 이라는 속성을 'J'라는 값으로 초기화시켰기 때문에 say() 메소드는 'J'라는 값을 아래처럼 출력할 수 있게 됩니다. 

my_pet.say()
# My name is J

 

클래스의 상속(Inheritance)

우리는 이번 강좌에서 상속(Inheritance)를 통해서 어떻게 클래스를 확장하는지 살펴보겠습니다. 

상속은 말 그대로 어떤것을 물려받는다는 뜻입니다. 즉, 어떤 클래스를 상속한다는 의미는 그 클래스를 기반으로 새로운 기능을 추가하거나 기존 기능을 상황에 맞게 변경한다는 의미입니다. 우리는 위의 Animal이라는 클래스를 상속하는 Dog 이라는 클래스를 만들어 보겠습니다. 

class Animal:
    def __init__(self, name):
        self.name = name
        
    def say(self):
        print('My name is ' + self.name)

class Dog(Animal):
    def __init__(self, name, num_of_bark):
        super().__init__(name)
        self.num_of_bark = num_of_bark
    
    def bark(self):
        for i in range(self.num_of_bark):
            self.say()

my_dog = Dog('Sunny', 2)
my_dog.bark()
# My name is Sunny
# My name is Sunny

 

위의 코드에서 Dog 이라는 클래스를 주목해 주세요. 이 클래스가 Animal 클래스와 다른점은 아래와 같습니다. 

  1. 클래스 선언시, 클래스 이름 뒤에 (부모클래스이름) 이 추가 되었습니다. 이 경우엔 (Animal) 이 추가 되었네요. 
  2. __init__ 메소드 안에 super().__init__() 이 호출되었습니다. 

그럼 위의 다른점들을 하나씩 살펴 볼께요. 

  1. 상속받는 클래스를 자식(Child) 클래스라고 부릅니다. 그리고 상속해주는 클래스를 부모(Parent) 클래스라고 합니다. 자식 클래스는 위의 코드에서 처럼 class 자식클래스이름(부모클래스이름): 으로 선언될 수 있습니다. 즉, class Dog(Animal): 에서 Dog은 자식 클래스, Animal은 부모 클래스가 됩니다. 
  2. 자식 클래스의 __init__ 메소드는 그 안에 부모의 __init__ 메소드를 호출하는 부분이 들어가야 합니다. 자식 클래스에서 부모 클래스는 super() 호출을 통해서 가능합니다. 즉, 이 예제에서 super().__init__() 은 부모클래스(Animal)의 초기화 메소드인 __init__ 을 호출하게 됩니다. 

이제 자식 클래스인 Dog 클래스를 객체화 시켜 볼께요. 방법은 부모 클래스를 객체화 시키는것과 동일합니다.

my_dog = Dog('Sunny', 2)

 

그리고 자식클래스에 새로 추가된 bark() 라는 메소드를 호출해 볼께요. 

my_dog.bark()
# My name is Sunny
# My name is Sunny

 

bark() 메소드는 내부적으로 부모 클래스의 메소드인 say() 를 호출합니다. 주의할 점은 객체화된 메소드를 호출해야 하기 때문에 그냥 say()가 아닌 self.say()를 호출해야 한다는 점이죠. 즉, 클래스 안에 선언된 메소드나 속성들을 클래스 안에서 접근할려면 반드시 self. 을 앞에 추가해 주어야 합니다. 

 

이번 강좌에선 클래스의 개념과 객체지향 프로그래밍의 상속에 대해서 간략하게 알아보았습니다. 

'파이썬 > [누구나! 완전 기초 파이썬]' 카테고리의 다른 글

#8 함수(Functions)  (0) 2020.09.26
#7 while, for 반복문  (0) 2020.09.24
#6 조건문 (if ~ else ~)  (0) 2020.09.23
#5 리스트(Lists)  (0) 2020.09.21
#4 문자열(Strings)  (0) 2020.09.19

댓글