Programming 기초/Python

[Python 기초 #7] 클래스, 객체와 인스턴스 차이, 생성자, 상속, 오버라이딩

코딩상륙작전 2023. 4. 21. 18:27

* 클래스(class)

  • 클래스는 거푸집과 같다. 같은 기능을 하는 함수를 필요할 때마다 찍어내는 '함수 틀'이다. 클래스로 생성된 함수들을 객체(object)라고 부른다.
  • c언어에는 클래스가 없다. c언어에서는 같은 기능을 하는 함수라도 매번 이름을 약간씩 바꿔가면서 새롭게 정의해야한다.
  • 클래스 이름을 지을 때, 관례적으로 첫 글자를 대문자를 사용한다.
  • 클래스 안에 구현된 함수는 메서드(Method)라고 부른다.
  • 파이썬 메서드의 첫 번째 매개변수 이름은 관례적으로 self를 사용한다. 객체를 호출할 때 호출한 객체 자신이 전달되기 때문에 self를 사용한 것이다.
객체와 인스턴스(instance)의 차이
클래스로 만든 객체를 인스턴스라고도 한다. 
a =Cookie() 이렇게 만든 a는 객체이다. 그리고 a 객체는 Cookie의 인스턴스이다. 즉 인스턴스라는 말은 특정 객체(a)가 어떤 클래스(Cookie)의 객체인지를 관계 위주로 설명할 때 사용한다. 'a는 인스턴스'보다는 'a는 객체'라는 표현이 어울리고, 'a'는 Cookie의 인스턴스'라는 표현이 훨씬 잘 어울린다.

 

* 생성자(constructor)

객체에 초깃값을 설정할 때, setdata 메서드를 호출하여 초깃값을 설정하기보다는 생성자를 구현하는 것이 안전하다.

class FourCal:
    def __init__(self, first, second):	# 생성자 메서드의 이름에 '_'는 각 양쪽에 두 개씩 붙는다.
        self.first = first
        self.second = second

    def setdata(self, first, second):
        self.first = first
        self.second = second

    def add(self):
        result = self.first + self.second
        return result

    def sub(self):
        result = self.first - self.second
        return result

    def mul(self):
        result = self.first * self.second
        return result

    def div(self):
        result = self.first / self.second
        return result


a = FourCal(4, 2)
b = FourCal(3, 8)

print(a.add())
print(b.add())

print(a.div())
print(b.div())
-------------------------------------------------
6
11   
2.0  
0.375

 

* 클래스의 상속(Inheritance)

어떤 클래스를 만들 때 다른 클래스의 기능을 물려받는 것. 기존 클래스를 변경하지 않고 기능을 추가하거나 기존 기능을 변경하려고 할 때 사용한다.

class 클래스 이름(상속할 클래스 이름)
class MoreFourCal(FourCal):	#기존 사칙연산 클래스에 지수계산 메서드를 추가했다.
    def pow(self):
        result = self.first ** self.second
        return result

c = MoreFourCal(4, 3)
print(c.pow())
--------------------------------------
64

 

* 메서드 오버라이딩(Overriding, 덮어쓰기)

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

class FailFourCal(FourCal):	# 곱하는 값이 0일 경우 'Fail' 문자열을 출력하는 클래스
    def mul(self):
        if self.second == 0:
            return 'Fail'
        else:
            return self.first * self.second


d = FailFourCal(5, 0)
print(d.mul())
-------------------------------------
Fail

 

* 클래스 변수

  • 객체변수는 다른 객체들에 영향받지 않고 독립적으로 그 값을 유지한다.
  • 클래스 변수는 클래스로 만든 모든 객체에 공유된다(클래스 변수 값을 변경하면 클래스로 만든 모든 객체의 해당 변수값이 모두 변경된다).
class Family:
    lastname = "김"	# 클래스 변수 lastname을 "김" 문자열로 초기화시킴

print(Family.lastname)

a = Family()
b = Family()
print(a.lastname)
print(b.lastname)

Family.lastname = "박"
print(a.lastname)
print(b.lastname)
-------------------------------------
김
김
김
박
박

id값을 확인하면 Fanily.lastname, a.lastname, b.lastname은 모두 같은 메모리를 가리키고 있다.

print(id(Family.lastname))
print(id(a.lastname))
print(id(b.lastname))
-------------------------------
2002133181472
2002133181472
2002133181472