파이썬 클래스(class)를 알아보자!

호연지기·2023년 6월 13일
0
post-thumbnail

클래스는 왜 필요한가?

파이썬은 객체지향 언어이므로 클래스를 잘만 활용하면 여기저기 조립하듯이 편리하게 활용할 수 있다.

✔ 입력 값을 이전에 계산한 결과에 더한 후 돌려주는 add 함수

result = 0

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

print(add(3)) #출력 : 3
print(add(4)) #출력 : 7

이러한 add함수를 이용해서 각각 여러 개의 값을 출력하고 싶을 때 클래스를 활용할 수 있다.

✔ 클래스 활용

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

cal1과 cal2가 각각 Calculator의 클래스를 참조하여 add함수를 독립적으로 사용하고 있다.

클래스와 객체

클래스와 객체의 관계를 나타내주는 그림

쿠키를 만드는 과자 틀과 쿠키들

  • 쿠키 틀 → 클래스(class)
  • 쿠키 틀로 만든 쿠키 → 객체(object)

클래스는 무엇인가를 계속해서 만들어낼 수 있은 설계 도면이고, 객체는 클래스로 만든 결과물로 볼 수 있다.

✔ 클래스의 중요한 특징

  • 객체마다 고유한 성격을 가지므로 객체를 변형하더라도 다른 객체에는 영향을 주지 않는다.

  • 메소드(Method) : 클래스 안에 구현된 함수

  • 파이썬 메서드의 첫 번째 매개변수 이름은 관례적으로 self를 사용한다. (객체를 호출할 때 호출한 객체 자신이 전달되기 때문에)

💥 객체와 인스턴스의 차이

인스턴스 : 클래스로 만든 객체

인스턴스라는 말은 특정 객체가 어떤 클래스의 객체인지를 관계 위주로 설명할 때 사용한다.
보통 a 자체만을 설명할 때는 "a는 객체이다."
a와 클래스와의 관계를 설명할 때는 "a는 Cookie의 인스턴스이다."라고 표현한다.

생성자(Constructor)

생성자(Constructor)란 객체가 생성될 때 자동으로 호출되는 메서드를 의미한다.

파이썬 메소드 이름으로 __init__를 사용하면 이 메서드는 생성자가 된다.(초기화 메소드)

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

__init__ 메소드는 이름을 __init__으로 했기 때문에 생성자로 인식되어 객체가 생성되는 시점에 자동으로 호출이 된다.

계산기 클래스에서의 활용(FourCal)

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 mul(self):
        result = self.first * self.second
        return result
    def sub(self):
        result = self.first - self.second
        return result
    def div(self):
        result = self.first / self.second
        return result

__init__ 메소드로 생성자를 구현함으로써 초깃값을 사용할 수 있게 된다.

초깃값 사용 예

# 초깃값 설정
a = FourCal(4, 2)
a.first # 4
a.second # 2

# 더하기, 빼기
a.add() # 6
a.sub() # 2

클래스의 상속

드라마 상속자들이 생각나는 클래스의 상속...

상속(Inheritance)이란 "물려받다"라는 뜻으로, "재산을 상속받다"라고 할 때의 상속과 같은 의미로 클래스에도 이 개념을 적용할 수 있다.

클래스를 상속하기 위해서는 다음처럼 클래스 이름 뒤 괄호 안에 상속할 클래스 이름을 넣어주면 된다.

class 클래스 이름(상속할 클래스 이름)

✔ 클래스 상속 예시

class MoreFourCal(FourCal):
	pass

pass : 함수, 클래스에 내용을 작성하지 않는 빈 함수, 빈 클래스를 만들 때 사용하는 키워드

MoreFourCal 클래스는 FourCal 클래스를 상속했으므로 FourCal 클래스의 모든 기능을 사용할 수 있다.

✔ 상속받은 클래스 사용하기

a = MoreFourCal(4, 2)

a.add()
a.mul()
a.sub()
a.div()

상속을 사용하는 이유

보통 상속은 기존 클래스를 변경하지 않고 기능을 추가하거나 기존 기능을 변경하려고 할 때 사용한다.

기존 클래스가 라이브러리 형태로 제공되거나 수정이 허용되지 않는 상황이라면 상속을 사용해야 한다.

메소드 오버라이딩

부모 클래스(상속한 클래스)에 있는 메서드를 동일한 이름으로 다시 만드는 것 = 덮어쓰기

메소드 오버라이딩을 하면 부모 클래스의 메소드 대신 오버라이딩한 메소드가 호출된다.

특정 메소드만 가져와서 코드를 다르게 요리해서 활용하고 싶을 때 유용할 듯!

✔ 메소드 오버라이딩 예시

class SafeFourCal(FourCal):
 def div(self):
     if self.second == 0:  # 나누는 값이 0인 경우 0을 리턴하도록 수정
         return 0
     else:
         return self.first / self.second

클래스 변수

객체 변수는 다른 객체들의 영향을 받지 않고 독립적으로 그 값을 유지한다.

반면 클래스 변수는 클래스로 만든 모든 객체에 값이 공유된다는 특징이 있다.

  • 사용 예 : 클래스이름.클래스변수

✔ 클래스 변수

# 클래스 변수선언
class Family:
	lastname = "박"

#클래스 변수 사용
Family.lastname
# 실행결과 : 박

참고
https://wikidocs.net/28

📅 DATE

2023.06.13 작성

profile
사람의 마음에 차 있는 너르고 크고 올바른 기운

0개의 댓글