본문 바로가기

Programming Language/Python

Python Class

* Class 필요한 이유

C 언어에는 클래스가 없다. 즉, 클래스가 없어도 함수만으로 프로그램을 충분히 만들 수 있다.

하지만 클래스를 사용해서 얻을 수 있는 이익이 상당하다.

계산기를 만드는 예시를 상상해보자.

 

- 함수로 구현

result = 0

def add(num):
    global result
    result += num
    return result

print(add(3))
print(add(4)
더보기

결과

3

7

 

두 개의 계산기를 사용하고 싶은 경우, 각 계산기는 각각의 결과값을 유지해야 하기 때문에 위와 같이 add 함수 하나만으로는 결과값을 따로 유지할 수 없다.

이 상황을 해결하려면 함수를 각각 따로 만들어야 한다.

 

result1 = 0
result2 = 0

def add1(num):
    global result1
    result1 += num
    return result1

def add2(num):
    global result2
    result2 += num
    return result2

print(add1(3))
print(add1(4))
print(add2(3))
print(add2(7))
더보기

결과

3

7

3

10

 

- 클래스로 구현

class Calculator:
    def __init__(self):
        self.result = 0

    def add(self, num):
        self.result += num
        return self.result

cal1 = Calculator()
cal2 = Calculator()

print(cal1.add(3))
print(cal1.add(4))
print(cal2.add(3))
print(cal2.add(7))
더보기

결과

3

7

3

10

Calculator 클래스를 만들고, 별개의 계산기 cal1, cal2를 만든다. 이 cal1, cal2는 Calculator 클래스의 객체이다.

클래스를 한 번 만들고, 객체들을 생성해주면 각 결과값들이 독립적인 값을 유지한다.

즉, 객체들 간 값들이 독립적으로 유지된다.

만약 계산기가 100대가 된다면, 함수를 사용할 시 함수를 100번 선언해야 되겠지만, class를 사용하면 객체만 계속 생성해주면 되기 때문에 함수를 사용하는 경우에 비해 매우 간단하다.

 

 

* 클래스와 객체

과자 틀 -> 클래스(class)

과자 틀에 의해 만들어진 과자 -> 객체(object)

 

클래스는 똑같은 무엇인가 계속해서 만들어 낼 수 있는 틀이고,

객체는 클래스로 만든 과자들이라고 할 수 있다.

 

그리고 여기서 클래스로 만든 객체는 객체마다 고유한 성격을 가진다. 과자 한개만 조금 베어 먹더라도 다른 과자에는 영향을 주지 않고, 베어먹은 과자는 그 자체로 성격을 띤다.

 

 

 

* method(메서드)

 class 안에 선언된 함수들을 Method라고 부른다.

 

* 생성자(Constructor)

 객체에 초기값을 설정해야 할 필요가 있을때 생성자를 구현하면 좋다. 생성자란 객체가 생성될 때 자동으로 호출되는 메서드를 말한다.

__init__를 사용하면 메서드는 생성자가 된다.


class Cal:
     def __init__(self, first, second):
         self.first = first
         self.second = second
         
     def add(self):
     	result = self.first + self.second
        return result

 

* self

위의 Cal class 코드를 이어서 생각해보자.

a = Cal(4, 2) # Class 객체 생성
a.add()

 

 

self는 객체를 호출할 때 호출한 객체 자신이 전달되기 때문에 self를 사용한다. self 말고 다른 이름을 사용해도 상관 없지만, self를 관례적으로 사용한다.

 

 

 

* 클래스 상속(inheritance)

상속이란, 물려받다라는 듯으로 다른 클래스의 기능을 물려받을 수 있게 만드는 것이다.

새로 만든 클래스에서 상속 받은 클래스의 모든 기능을 사용할 수 있다. (현재는)

상속받을 때는 클래스 옆의 괄호 안에 상속받고자 하는 클래스를 넣어준다.

더보기

class MoreCal(Cal):

    # code

 

* 메서드 오버라이딩

새로 만든 자식클래스에서 부모 클래스(상속한 클래스)에 있는 메서드를 동일한 이름으로 다시 만드는 것을 메서드 오버라이딩(overriding)이라고 한다.

 

* 클래스 변수

클래스 안에서 선언한 변수를 클래스변수라고 한다.

더보기

class Family:

    lastname = "Kim"

Family 클래스에 선언한 lastname이 바로 클래스 변수이다. 클래스 변수는 클래스 안에 함수를 선언하는 것과 마찬가지로 클래스 안에 변수를 선언하여 생성한다.

더보기

>>> pirnt(Family.lastname)

위와 같이 클래스이름.클래스변수로 사용할 수 있다.

 

 

 

출처: https://wikidocs.net/28