벌써 챕터9까지 왔다. 저번 장에서는 function을 배웠으니 이번 챕터는 function이 기능이라고 한다면 classes는 공장?같은 느낌으로 function들을 비슷한 녀석들은 묶어주고 조금 더 세분화하게 역할분담과 기능정리 등을 할 수 있다. 저번 챕터보다 내용이 더 어렵고 많기 때문에 집중해서 해보도록 하자~

 

  • Creating and using a Class

 먼저 클래스란 무엇일까?? 클래스는 어떠한 기능들의 집합체를 이야기한다. 그 안에 요소, 즉 instance가 들어가기도 하고 기능을 수행하는 function이 들어가기도 한다. 예를 들어서 대학교 클래스가 있다고 가정하자. 그러면 instance로 대학생, 교수님, 과목 등이 들어갈 수 있고 기능으로는 성적 계산 기능, 학교 등록 기능 등등이 들어갈 수 있다. 이처럼 기능과 비슷한 부류에 맞게 체계화시키는 것을 클래스화시킨다고 한다. 그러면 아래 예제를 살펴보고 클래스의 기본 구성에 대해서 알아보자.

 

class Dog:							# class 이름: 내용
    def __init__(self, name, age):				# __init__ : 초기 instance 초기화 함수
        self.name = name
        self.age = age

    def introduce(self):
        print("My dog's name is {0}".format(self.name))
        print("My dog is {0} years old".format(self.age))

    def sit(self):
        print("{0} is now sitting".format(self.name))

    def roll_over(self):
        print("{0} rolled over!!".format(self.name))

my_dog = Dog('Willie', 6)					# class Dog의 Object 선언
my_dog.introduce()						# Dog의 def 사용

결과
My dog's name is Willie
My dog is 6 years old

 

 위의 예제를 보면 알 수 있듯이 Class의 시작은 function과 비슷하다고 할 수 있다. 그리고 첫 def로 생소한 녀석이 나오는데 __init__()이라는 function이다. Class 안에서 나오는 모든 function을 method라고 하는데 지금부터는 method라고 부르도록 하겠다.
 파이썬의 특징 중 하나가 무엇인가?? 바로 많은 기능들이 포함되어 있다는 것이다!! 우리가 Class를 만들 때 내장된 method가 많이 존재한다.  그 중 하나가 __init()__ method이다. 이 method는 우리가 Class를 처음 만들 때 첫 실행되는 method이다. 쉽게 말하자면 초기화 method이다. 굳이 부르지 않아도 Class를 생성하자마자 실행되는 method이기 때문에 주로 초기 instance를 초기화하거나 꼭 먼저 실행되어야 하는 기능들이 들어간다.
 다음으로 알아야 되는 것이 method 생성과 사용 방법이다. method 생성은 위의 예제를 보면 알 수 있듯이 def 이름(self): 로 시작하며 주로 이름이 그 method의 기능을 의미하고 원하는 내용을 들여쓰기에 맞게 작성하면 된다. 여기서 매개변수에 'self'라는 낯선 단어가 보이는데 이 뜻은 자기 자신, 즉 Object 자신을 가지고 가는 이유이다. 이해가 되지 않는다면 아래의 그림을 보고 이해하도록 하자. 마지막으로 밖에서 호출할 때 사용하는 방법은 온점(.)을 사용하여 사용할 수 있다.

 

Class Object 선언 방법<참조 : https://wikidocs.net/28>


 그 다음은 Object 생성 방법이다. 위에 그림을 보면 알 수 있듯이 자신이 선언한 매개변수에 맞게 생성을 해야 한다. 보통은 위에서 배운 __init__ method에 맞게 선언해주면 맞다고 볼 수 있다. Class를 처음 접해서 조금 어려울 수도 있지만 천천히 하나씩 하다보면 익숙해지기 때문에 걱정하지 말고 진행해보자~

 

  • Inheritance

 Class의 기본적인 방법들을 배웠으니 그 다음은 Inheritance에 대해서 알아보자. 이 단어가 나도 처음에는 생소했는데 찾아보니 상속과 같은 의미인 것을 알았다. 상속???? 많이 들어본 단어이다. 자바에서도 들어봤던 단어인데 바로 Class와 Class를 이어주는 역할을 하는 것이다.
 예를 들어보면 앞서 대학교 Class 얘기를 하지 않았는가?? 하지만 대학교 Class를 만들었지만 그 안의 내용이 너무나도 많다. 학과도 수없이 많고 학생, 교수님들, 학생식당 등등... 그렇기 때문에 조금 더 분할해서 관리할 필요가 있는 것이다. 대학교를 제일 위의 상위 Class로 놔두고 아래로는 공과대학 Class, 생명대 Class 등등 가지치기처럼 뻗어나간다면 관리하는데 더 효율적이지 않겠는가??
 그렇기 때문에 그러한 관리를 효율적으로 하기 위해서는 Inheritance를 사용하여 부모와 자식 Class를 만들어주고 서로서로 이어가면서 필요한 기능은 서로 공유하고 개인적인 내용은 private도 지켜나가면서 만드는 것이다. 그러면 아래 예제를 살펴보고 사용법에 대해 알아보자.

 

class Car:
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0

    def get_descriptive_name(self):
        long_name = "{0} {1} {2}".format(self.year, self.make, self.model)
        return long_name.title()

class ElectricCar(Car):						# Class Car 상속
    def __init__(self, make, model, year):
        super().__init__(make, model, year)			# Car에서 __init__ 가져옴

my_tesla = ElectricCar('tesla', 'model s', 2019)
print(my_tesla.get_descriptive_name())

결과
2019 Tesla Model S

 

 위의 예제를 보면 Class ElectricCar에서 Class Car를 상속받았다. 괄호 안에 적는 것으로 상속이 되므로 사용하는 법은 간단한 편이다. 그리고 상속을 받은 EC(줄여서 씀)는 Car의 __init__ method 뿐만 아니라 다른 method들도 모두 사용할 수 있다는 것을 알 수 있다. 이처럼 상속을 하게 되면 method를 공유하기 때문에 더 효율적인 코딩이 가능하고 좀 더 간결하게 만들 수 있는 장점이 있다.

 

  • Overriding

 Overring이란 위의 예제처럼 상속을 받아서 method를 공유했다고 했을 때 Child class에서 똑같은 이름의 method를 생성하는 것을 의미한다. 그렇게 된다면 parents class의 method가 무시가 되고 Child class의 method만 실행되게 되는데 이러한 경우를 Overriding이라고 한다. 아래 예제를 살펴보고 정확한 의미과 상용법을 알아보자.

 

class stu:
    def __init__(self, *args):
        self.name = args[0]
        self.age = args[1]

    def print(self):
        print("Hello my name is {0}\n"
              "my age is {1}".format(self.name, self.age))

class ex_stu(stu):
    def __init__(self, *args):
        super().__init__(args[0], args[1])

    def print(self):
        # super().print()					: class stu의 print() method
        print("Nice to meet you")				# class ex_stu()의 print() method

student = ex_stu('Sara', 21)
student.print()							# class ex_stu()의 print() method 실행

결과
Nice to meet you

 

 결과를 보면 알 수 있듯이 child class의 method만 실행되고 parents class의 method는 실행되지 않았다. 만약 이름과 나이를 소개하고 인사를 하기 위해서는 super().print()의 주석을 해제하고 실행하게 되면 3줄 모두 출력된다.

 

  • Importing Classes

 다음으로는 지난 장에서 배웠던 import 이녀석에 대해서 사용하는 방법에 대해 알아보자. 우리가 이때까지는 .py 파일 하나에 모든 코드를 입력하고 실행했다. 하지만 나중에 코드가 길어지면 길어질수록 하나의 파일로 관리하기에는 너무 복잡하고 코드를 직관적으로 보는 게 힘들어진다.
 그렇기 때문에 각 기능을 가지고 있는 class마다 파일을 나누어서 관리하면 어떤 기능에 문제가 생기면 해당 파일만 검사하면 되기 때문에 훨씬 빠르고 효율적인 코드 관리가 가능해진다. 물론 내장함수나 기능들도 많이 있지만 우리가 직접 파일을 만들어서 import 할 수 있기 때문에 아래 예제를 살펴보고 사용법을 알아보자.

 

# car.py 파일

class Car:
    def __init__(self, *args):
        self.make = args[0]
        self.model = args[1]
        self.year = args[2]
        self.odometer_reading = 0

    def get_descriptive_name(self):
        long_name = "{0} {1} {2}".format(self.year, self.make, self.model)
        print(long_name.title())

    def read_odometer(self):
        print("This car has {0} miles on it.".format(self.odometer_reading))
# my_car.py 파일

from car import Car			# car.py의 class Car 포함

my_new_car = Car('audi', 'a4', 2019)
my_new_car.get_descriptive_name()

my_new_car.odometer_reading = 23
my_new_car.read_odometer()

결과
2019 Audi A4
This car has 23 miles on it.

 

 위의 파일이 class Car만 포함함 파일이고 아래 파일은 class Car를 포함시켜 실행한 파일이다. 해당 기능처럼 파일 전체 중의 특정 class만 가져올 수 있게 작성되었다. 그 외에도 여러 기능들을 앞서 배웠기 때문에 어렵지 않게 파일들을 분할하고 포함시킬 수 있을 것이다. 다른 기능들에 대한 예제들도 많이 있지만 지난 장에서 배우고 설명했기 때문에 더 다루지는 않겠다.

 계속 글을 읽다 보면 내장형 함수인 random에 대해서 짧게 나오기 때문에 한 번 읽어보고 넘어가보면 좋을 것 같다.(매우 재밌는 Library이다.^^)

 마지막으로 클래스를 어떻게 하면 더 자신의 것으로 만드는지에 대한 팁이 나오는데 docstring을 작성해야 한다는 것에 대해서는 찬성한다. 왜냐하면 우리의 기억력의 문제도 있지만 상대방이 코드를 보았을 때 그 class나 method가 어떤 기능을 하는지 한 눈에 알아보기란 매우 힘든 일이다. 그렇기 때문에 각각의 기능들을 간단히 서술하고 정리해 놓으면 매우 가독성이 뛰어난 코드가 될 수 있다. 자!! 다음 장은 배우는 것의 마지막 장인 File에 관련된 내용이 나온다. 마지막을 기대하고 이번 장은 마치도록 하겠다.

'Python > No Starch Press_Python' 카테고리의 다른 글

Chapter10. Files and Exceptions  (0) 2020.05.20
Chapter8-2. Function++  (0) 2020.05.13
Chapter8. Functions  (0) 2020.04.28
Chapter7. USER INPUT AND WHILE LOOPS  (0) 2020.04.20
Chapter6. DICTIONARIES  (0) 2020.04.17
블로그 이미지

Mr.HB

프로그래밍 이야기

,