[Python] 클래스란

shlim55·2025년 11월 6일

Python

목록 보기
13/25

05장 파이썬 날개 달기

클래스란

클래스 선언시 반드시 대문자로 시작

# calculator.py
result = 0
def add(num):
    global result
    result += num  # 결괏값(result)에 입력값(num) 더하기
    return result  # 결괏값 리턴
print(add(3))
print(add(4))

이렇게 하면 3에 4를 더한 값도 출력이된다.

중복된 여러가지를 찍어내기 힘들 때 클래스 활용

# calculator2.py
result1 = 0
result2 = 0
def add1(num):  # 계산기1
    global result1
    result1 += num
    return result1
def add2(num):  # 계산기2
    global result2
    result2 += num
    return result2
print(add1(3))
print(add1(4))
print(add2(3))
print(add2(7))
# calculator3.py
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))

클래스 사용 할때와 안 할때를 비교해보자.
여기서는 add1과 add2똑같은두개의 함수를 만들 필요가 없다.

하나의 클래스로 묶어서 좀 더 효율적으로 작성해보자는 취지로 작성

클래스 = 과자틀, 설계도, command center
객체 = 과자들, 건물, scv

변수 = 값
함수 = 행동

설계도를 찍어내는 방법
클래스를 불러와서 함수 호출할때 처럼

>>> a = Cookie()
>>> b = Cookie()

객체와 인스턴스의 차이
클래스로 만든 객체를 ‘인스턴스’라고도 한다. 그렇다면 객체와 인스턴스의 차이는 무엇일까? 이렇게 생각해 보자. a = Cookie()로 만든 a는 객체이다. 그리고 a 객체는 Cookie의 인스턴스이다. 즉, 인스턴스라는 말은 특정 객체(a)가 어떤 클래스(Cookie)의 객체인지를 관계 위주로 설명할 때 사용한다. ‘a는 인스턴스’보다 ‘a는 객체’라는 표현이 어울리며 ‘a는 Cookie의 객체’보다 ‘a는 Cookie의 인스턴스’라는 표현이 훨씬 잘 어울린다.

클래스는 변수와 함수에 대한 설계도다 라고 기억

변수 만들때 보통 파스컬 법칙 사용

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

a = FourCal()
a.setdata(4,2)
print(type(a))
print(a.first)
print(a.second)

계산기를 a에 담아서 객체 타입이 class임 포칼이라는 클래스를 담은 그 객체가 요런식으로 담김
포칼이라는 클래스로 만든 인스턴스 객체가 담김

Self는 말그대로 자기 자신을 뜻함 해당 객체 자신을 가리킵니다.
First 4 Second 2에 저장됨

Self는 a를 의미함 그다음 first second 각각 이렇게 괄호의 매개변수들이 들어감
총갯수가 안 맞다고 생각할수 있지만
이렇게 쓰는 이유가
A안에 어떤 값을 저장하기 위해서다.
Self.first, self.second 안에다가 이 값들을 저장하는 구조

셀프안에는 어느객체가 호출한건지 그 객체 자체가 들어가게 됨

변수이름은 다르게 써도되는데

가장 첫번째 인수로 들어가게 되는게 그 객체이다.

셀프 파이썬 에선 필수

클래스 내부 함수는 항상 메서드로 표현 됨

메서드를 호출하는 또 다른 방법

>>> a = FourCal()
>>> FourCal.setdata(a, 4, 2)

셀프를 굳이 안쓰고 싶다면 클래스를 일단 찍어내서 저장한 다음에
그 아예 클래스 자체에서 그 셋 데이터를
호출하고 이 객체를 넣어 주고 이렇게 각각 퍼스트 세컨드의 값을
주는것도 가능하다.
그러면 셀프를 생략할 수 있다.

객체에 생성되는 객체 변수를 ‘인스턴스 변수’ 또는 ‘속성’이라고도 부른다.

셋데이터는 내장 메서드가 아니다, 그래서 만들어줘야 한다

a = FourCal()
b = FourCal()
a.setdata(4,2)
b.setdata(1,3)
print(a.first)
print(b.first)

이렇게 하면 당연히 각각 4와1이 출력된다
a.first
A에저장된 첫번째 값 4
b.first
B에저장된 첫번째 값 1

각각 다른 속성을 가지고 있다 그래서
객체 변수 속성이라 부른다

객체 안에 저장된 각각 가지고 있는 변수를
의미한다

class FourCal:
    def setdata(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
a = FourCal()
a.setdata(4,2)
print(a.add())

셋데이터에 4 2를 각각 퍼스트 세컨드에 저장
아까 말했듯이 a라는게 셀프로 들어가서
a.first+a.second 이렇게 됨
셀프 객체에 저장된 값들 호출 한후에 더한후 result변수에 저장
그 다음에 리턴 result

곱하기, 빼기, 나누기 기능 만들기

>>> class FourCal:
...     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

>>> a = FourCal()
>>> b = FourCal()
>>> a.setdata(4, 2)
>>> b.setdata(3, 8)
>>> a.add()
6
>>> a.mul()
8
>>> a.sub()
2
>>> a.div()
2
>>> b.add()
11
>>> b.mul()
24
>>> b.sub()
-5
>>> b.div()
0.375

보듯이 a는 a대로 b는 b대로 나옴 이런식으로 각각 처리
인스턴스를 다 따로따로 뽑아서 처리

생성자

 a = FourCal()
 a.add()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 6, in add
AttributeError: 'FourCal' object has no attribute 'first'

이렇게 할경우 이런 에러가 뜬다
A안의 퍼스트와 세컨드를 저장하는 과정이없어서

처음에 어떤 클래스로 인스턴스를 만들어 낼 때
필수적인것들은 미리 처음 시작하자마자 입력하는 무언가 있으면
좋겠다라는 생각을 해서 나온게 생성자라는 개념

인스턴스를 찍어낼 때 무조건 강제로 실행 안하면 인스턴스 자체가 안생기게 만들수가 있다

생성자는 이닛 메서드의 앞뒤 _를붙인다 _init이렇게

클래스로부터 인스턴스를 찍어낼 때 무조건 처음에 실행되는 그런 함수

Intit이라 하면 생성자임 무조건 클래스로 인스턴스를 찍어내는
그 시점에 처음으로 일빠로 실행됨
클래스로부터 인스턴스를 찍어낼때 초기값 설정이 가능
이조건을 만족안시키면 아예 찍어내지 못한다
찍어내는걸 강제로 함

생성자가 처음 실행이 되면서
퍼스트는 4 세컨드는 2가 되서 초기값 설정이된다.

이닛도 마찬가지로 셀프가 다른 그냥 메서드처럼 들어간다 이해하면 됨

>>> a = FourCal(4, 2)
>>> 

포칼처음 생성할 때 받는그 값이 생성자가 받는 값

클래스의 상속

상속이란 이런것
계산기가 이미 있는데 공학용 계산기르 만든다 생각해보면
처음부터 또 만드려니 힘듦
기본적인 4칙연산을 사용하고, 추가적인것만 개발하면 좋으니까 이렇게 만들수 있다

class MoreFourCal(FourCal):
    pass

이렇게 부모클래스를 넣어주면 된다
부모가 들어가면 이 자식은 부모가가진 클래스의 속성을 그대로 이어받는다

class MoreFourCal(FourCal):
    pass
a = MoreFourCal(4,2)
print(a.add())

이렇게 아무것도 안해도 6이 출력되는 모습이다

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

상속 기능은 왜 쓰는 걸까?

쉽게 말하면 만들어놓은게 있으니까 아까우니까 가져다 씀

마찬가지로 다른 부모를 넣으면 그 부모거를 상속받게 됨

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
class MoreFourCal(FourCal):
def pow(self):
result = self.first ** self.second
return result
a = MoreFourCal(4,2)
print(a.add())
print(a.pow())



부모에서 온 애드기능, 본인의
 pow기능도 쓸수 있다
선천적인 능력인 애드 후처적인 개발한 능력 pow


메서드 오버라이딩
부모님이 물려줬는데 그걸 뒤엎는 느낌?
라이딩이 올라탄다는 뜻
부모님이 뭔가 줬는데 올라타서 바꿈

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

print(a.div())


나누기 0하면 에러뜸 그래서 자식클래스의 메서드를 바꾼다


부모클래스의 메서드와 자식클래스의 메서드가 다르다 그럼 누가 이기느냐 자식이 이긴다

부모랑 자식이 싸우면 자식이 이긴다 이렇게 이해하면 좋을거 같다

클래스변수

객체변수는 다른 객체들의 영향을 받지 않고 독립적으로 그 값을 유지한다는 점을 이미 알아보았다. 이번에는 객체변수와는 성격이 다른 클래스변수에 대해 알아보자.

클래스 변수라고 해서 모든 애들이 공통적으로 갖고 있는 값을 정해 줄 수가 있다

class Family:
... lastname = "김"

이렇게 넣으면 클래스 공통으로지는 변수

셀프 이렇게 쓰는거는 각각의 객체가 가진거고

클래스 공통으로 쓰고 싶으면 클래스 변수 사용, 개명도 가능

profile
A Normal Programmer

0개의 댓글