이번에는 객체지향의 핵심인 클래스에 대한 내용을 정리해보려고 합니다.

클래스

클래스에 대한 개념들 설명할때, 처음에는 붕아빵틀과 붕어빵 같은걸 많이 말해주는데, 저는 언어적 관점에서 한번 설명을 해보려고 합니다.

클래스 = 관련 멤버 변수 + 관련 메소드

예를 들어 아래와 같이 스쿠버 다이빙 이란 클래스가 있으면 여기에 있어야 하는, 정보들과, 기술들이 있습니다.

이름, 성별, 나이, 신장과 스쿠버 다이빙을 하기 위해서 필요한 기술들 수영, 잠수, 발차기, 호흡 등등

이것들을 하나의 클래스란 형태로 정의해 두고 필요할때마다 참고해서 이용하는걸 말합니다.

위와 같이 목적에 맞춰서 다양한 클래스를 만들어 놓으면 필요할때 언제든 가져다 이용할 수 있습니다

클래스를 참고해서, 우리가 사용할 수 있는 변수 형태로 이용하는걸 인스턴스라고 합니다.

인스턴스는 새로 인스턴스를 만들때마다 독립적인 저장공간을 가지기 때문에, A 인스턴스에서 데이터를 바꾼다고 B 인스턴스의 데이터가 바뀌지 않는 다는 의미입니다.

그래서 결론적으로 클래스를 사용하는 이유는 재사용을 위함 입니다.


클래스 만드는 법

class 클래스명:
    멤버 변수1
    멤버 변수2
    
    # 생성자 : 인스턴스가 만들어질때 자동으로 실행되는 함수
    def __init__(self): 
        self.변수1 = 값1
        self.변수2 = 값2
    
    def 함수1(self):
        함수1 명령어
        return 값1
        
    def 함수2(self):
        함수2 명령어
        return 값1
    

위의 함수를 보면 self란 것이 맨 앞에 들어가게 되어 있는데, 이 부분은 호출한 인스턴스에 대한 정보를 가져와서 호출한 인스턴스에서 호출할 수 있게끔 해줍니다.


클래스 호출하는 법

인스턴스 이름 = 클래스명() # 인스턴스 생성

인스턴스 이름.함수1() # 함수1 실행
인스턴스 이름.함수2() # 함수2 실행

예제(스쿠버 다이빙)

소스

class ScubaDiving:

    def __init__(self, name, sex, age, height):
        self.name = name
        self.sex = sex
        self.age = age
        self.height = height

    def showMyProfile(self):
        print "Name : %s" % self.name
        print "Sex : %s" % self.sex
        print "Age : %s" % self.age
        print "Height : %s" % self.height
        print "--------------------"

    def swimming(self):
        print self.name + " swimming"


    def diving(self):
        print self.name + " diving"

    def kick(self):
        print self.name + " kick"

    def breathing(self):
        print self.name + " breathing"

호출하기

# coding=utf-8
from ScubaDiving import ScubaDiving

jungwoon = ScubaDiving("Jungwoon", "M", 30, 175)

jungwoon.showMyProfile()
jungwoon.diving()
jungwoon.swimming()
jungwoon.kick()
jungwoon.breathing()


print "\n**********************\n"

bokyung = ScubaDiving("Bokyung", "F", 28, 165)

bokyung.showMyProfile()
bokyung.diving()
bokyung.swimming()
bokyung.kick()
bokyung.breathing()

결과

Name : Jungwoon
Sex : M
Age : 30
Height : 175
--------------------
Jungwoon diving
Jungwoon swimming
Jungwoon kick
Jungwoon breathing

**********************

Name : Bokyung
Sex : F
Age : 28
Height : 165
--------------------
Bokyung diving
Bokyung swimming
Bokyung kick
Bokyung breathing

생성자 (Constructor)

이미 위의 소스에서 했지만, 여기서는 간단하게 설명을 하려고 합니다.

생성자는 객체가 생성될때 자동으로 실행되는 부분 입니다.

생성자를 만들기 위해서는 아래와 같이 메서드를 만드는거 같이 만드는데, 메서드 명 대신에 __init__이 들어가게 됩니다.

def __init__(self):
    실행해야 하는 구분

위의 ScubaDiving 클래스에서는 데이터 초기화를 위해서 사용했습니다.

def __init__(self, name, sex, age, height):
        self.name = name
        self.sex = sex
        self.age = age
        self.height = height

위의 예제와 같이 생성자에 멤버변수를 추가하면, 인스턴스 생성때 반드시 해당하는 만큼, 매개변수를 전달해주어야 합니다.

생성자는 보통 데이터 초기화를 해주거나, 선행되어야 하는 로직이 있을때 사용합니다.


상속

맨 위에서 개념 설명을 할때, 클래스를 사용하는 이유는 재사용 때문이라고 했는데, 해당 기능을 대표하는 기능중 하나가 상속 입니다.

상속은 간단히 말해서 기존에 가지고 있는 특성을 그대로 받아서 뭔가를 추가해 새로운 클래스를 만드는 것입니다.

위의 그림은 맨 처음에 있던 스쿠버 다이빙를 상속받아 구조라는 메소드를 추가하여 레스큐 스쿠버 다이빙이란 클래스를 만든 그림입니다.

위왁 같이 동일한 기능은 유지하면서 새로운 기능을 추가할때는 상속을 받아서 새로운 클래스를 만듭니다.

사용법

class 상속받아 만드는 새로운 클래스명(상속받는 클래스명):
    추가 기능

예시

class RescueScubaDiving(ScubaDiving):
    def rescue(self):
        print self.name + " rescue"

실행

# coding=utf-8
from ScubaDiving import ScubaDiving, RescueScubaDiving

rescue = RescueScubaDiving("Jungwoon", "M", 30, 175)
rescue.diving()
rescue.swimming()
rescue.kick()
rescue.breathing()
rescue.rescue()

결과

Jungwoon diving
Jungwoon swimming
Jungwoon kick
Jungwoon breathing
Jungwoon rescue


오버라이딩(=덮어쓰기)

오버라이딩은 상속을 받았을때 기존의 메서드 이름을 그대로 쓰지만, 기능은 바꾸고 싶을때 사용하는 방법입니다.

사용방법

def 기존의 메서드 이름(self):
    변경할 내용

예제

# coding=utf-8
class RescueScubaDiving(ScubaDiving):
    def rescue(self):
        print self.name + " rescue"
    
    # 오버라이딩 : ScubaDiving의 diving 메서드를 오버라이딩 함
    def diving(self):
        print self.name + " rescue diving"

실행

# coding=utf-8
from ScubaDiving import ScubaDiving, RescueScubaDiving

rescue = RescueScubaDiving("Jungwoon", "M", 30, 175)
rescue.diving() # 이 부분이 바뀜
rescue.swimming()
rescue.kick()
rescue.breathing()
rescue.rescue()

결과

Jungwoon rescue diving
Jungwoon swimming
Jungwoon kick
Jungwoon breathing
Jungwoon rescue

Quiz) 4칙 연산 기능을 가진 Calculator 클래스를 만들기 (input()함수를 이용하여 두 개의 숫자를 받아서 처리할 수 있는 )