점프 투 파이썬 DAY11(클래스)

정지범·2026년 9월 20일

점프 투 파이썬

목록 보기
19/37

05-1 클래스

목차

  • 1. 클래스는 왜 필요한가?

    • 1-1. 계산기 프로그램을 만들며 클래스 알아보기
  • 2. 클래스와 객체

  • 3. 사칙 연산 클래스 만들기

    • 3-1. 클래스를 어떻게 만들지 먼저 구상하기
    • 3-2. 클래스 구조 만들기
    • 3-3. 객체에 연산할 숫자 지정하기
    • 3-4. 더하기 기능 만들기
    • 3-5. 곱하기, 빼기, 나누기 기능 만들기
  • 4. 생성자

  • 5. 클래스의 상속

  • 6. 메서드 오버라이딩

  • 7. 클래스변수


1. 클래스는 왜 필요한가?

  • 클래스는 프로그램을 작성하기 위해 반드시 필요한 요소는 아니다.
  • 하지만 같은 기능을 하는 객체가 여러 개 필요할 경우 클래스를 사용하면 코드를 훨씬 효율적으로 작성할 수 있다.
  • 비슷한 기능을 반복해서 구현해야 할 때 클래스를 사용하면 코드의 중복을 줄일 수 있다.

1-1. 계산기 프로그램을 만들며 클래스 알아보기

먼저 함수를 이용해 간단한 계산기를 만들어 보자.

result = 0

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

print(add(3))
print(add(4))

실행 결과

3
7
  • result는 이전 계산 결과를 저장한다.
  • add()가 실행될 때마다 입력받은 값을 기존 result에 더한다.
  • 이전 결과를 계속 기억하기 위해 global result를 사용한다.

하지만 계산기가 2대 필요하다면 각각의 계산 결과를 따로 저장해야 한다.

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

계산기마다

result1 → 계산기 1의 결과
result2 → 계산기 2의 결과

를 따로 가지고 있다.

만약 계산기가 10개, 100개 필요하다면?

  • result3, result4 ...
  • add3(), add4() ...

처럼 계속 변수와 함수를 만들어야 한다.

이러한 문제를 클래스를 이용하면 간단하게 해결할 수 있다.

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는 서로 다른 계산기이다.
  • 각각 자신의 계산 결과를 독립적으로 저장한다.
  • 계산기가 더 필요하다면 새로운 객체만 생성하면 된다.
cal3 = Calculator()
cal4 = Calculator()

클래스를 사용하면 같은 기능을 가진 여러 객체를 쉽게 만들 수 있다.


2. 클래스와 객체

클래스와 객체는 과자 틀과 과자에 비유할 수 있다.

과자 틀 → 클래스
과자 틀로 만든 과자 → 객체

즉 클래스는 객체를 만들기 위한 설계도라고 생각하면 된다.

class Cookie:
    pass

pass는 아무것도 수행하지 않는 문법이다.

현재 Cookie 클래스에는 아무 기능도 없지만 객체를 만들 수 있다.

a = Cookie()
b = Cookie()

여기서

Cookie → 클래스

a → 객체
b → 객체

이다.

하나의 클래스를 이용해서 여러 객체를 만들 수 있다.

객체와 인스턴스

a = Cookie()

이때

  • a는 객체(Object)
  • a는 Cookie 클래스의 인스턴스(Instance)

라고 표현할 수 있다.

객체는 실제 만들어진 대상을 의미하고, 인스턴스는 어떤 클래스에서 만들어진 객체인지를 표현할 때 사용한다.


3. 사칙 연산 클래스 만들기

이번에는 사칙 연산을 수행하는 FourCal 클래스를 만들어 보자.

우리가 만들 기능은 다음과 같다.

더하기
빼기
곱하기
나누기

3-1. 클래스를 어떻게 만들지 먼저 구상하기

먼저 객체를 만든다.

a = FourCal()

두 개의 숫자를 지정한다.

a.setdata(4, 2)

더하기

a.add()
6

곱하기

a.mul()
8

빼기

a.sub()
2

나누기

a.div()
2.0

즉 다음과 같이 동작하는 클래스를 만드는 것이 목표이다.

4 + 2 = 6
4 * 2 = 8
4 - 2 = 2
4 / 2 = 2.0

3-2. 클래스 구조 만들기

먼저 아무 기능이 없는 클래스를 만든다.

class FourCal:
    pass

객체를 생성해 보자.

a = FourCal()

객체의 타입을 확인한다.

type(a)

실행 결과

<class '__main__.FourCal'>

따라서 a는 FourCal 클래스로 만든 객체이다.

type()은 객체의 자료형을 확인할 수 있는 파이썬 내장 함수이다.


3-3. 객체에 연산할 숫자 지정하기

객체에 두 개의 숫자를 저장할 수 있도록 setdata() 메서드를 만들어 보자.

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

클래스 안에 정의된 함수를 메서드(Method) 라고 한다.

일반 함수

def 함수이름(매개변수):
    수행할 문장

클래스의 메서드

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

self란?

다음 코드를 실행해 보자.

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

setdata()에는 매개변수가 3개 있다.

self
first
second

그런데 호출할 때는

a.setdata(4, 2)

처럼 4, 2 두 개만 전달한다.

그 이유는 객체 a가 자동으로 self에 전달되기 때문이다.

self   → a
first  → 4
second → 2

따라서

self.first = first
self.second = second

는 실제로 다음과 같이 동작한다.

a.first = 4
a.second = 2

즉,

self는 현재 메서드를 호출한 객체 자신을 의미한다.


객체변수

a.setdata(4, 2)

를 실행하면 객체 a에 다음 변수가 생성된다.

a.first = 4
a.second = 2

확인해 보면

print(a.first)
print(a.second)

실행 결과

4
2

이처럼 객체에 생성되는 변수를 객체변수라고 한다.

객체변수는

  • 인스턴스 변수
  • 속성(Attribute)

이라고도 부른다.


객체변수는 객체마다 독립적이다.

a = FourCal()
b = FourCal()

a.setdata(4, 2)
b.setdata(3, 7)

현재 상태는

a.first = 4
a.second = 2

b.first = 3
b.second = 7

이다.

print(a.first)
print(b.first)

실행 결과

4
3

b.first의 값을 3으로 저장했다고 해서 a.first까지 변경되지 않는다.

각각의 객체가 가지고 있는 객체변수는 서로 독립적이다.


3-4. 더하기 기능 만들기

두 숫자를 더하는 add() 메서드를 추가해 보자.

class FourCal:
    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())

실행 결과

6

동작 과정을 살펴보면

a.add()

를 실행했으므로

self → a

이다.

따라서

result = self.first + self.second

는

result = a.first + a.second

와 같다.

현재

a.first = 4
a.second = 2

이므로

result = 4 + 2

결과는 6이 된다.


3-5. 곱하기, 빼기, 나누기 기능 만들기

나머지 사칙 연산 메서드도 추가해 보자.

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 객체의 연산

a.add()
6
a.mul()
8
a.sub()
2
a.div()
2.0

b 객체의 연산

b.add()
11
b.mul()
24
b.sub()
-5
b.div()
0.375

4. 생성자

현재 FourCal 클래스는 다음과 같이 사용하면 오류가 발생한다.

a = FourCal()
a.add()

a.first, a.second가 아직 생성되지 않았기 때문이다.

즉 먼저

a.setdata(4, 2)

를 실행해야 한다.

객체를 만들 때부터 초깃값을 설정하고 싶다면 생성자(Constructor) 를 사용하면 된다.

파이썬에서는

__init__()

메서드를 생성자로 사용한다.

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

__init__()는 객체가 생성될 때 자동으로 실행되는 메서드이다.

따라서 이제 객체를 만들 때 값을 함께 전달해야 한다.

a = FourCal(4, 2)

전달되는 값은

self   → 생성되는 객체 a
first  → 4
second → 2

이다.

결과적으로

a.first = 4
a.second = 2

가 생성된다.


생성자를 적용한 전체 클래스는 다음과 같다.

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

사용

a = FourCal(4, 2)

print(a.add())
print(a.div())

실행 결과

6
2.0

__init__() : 객체를 생성할 때 자동으로 실행되는 생성자 메서드


5. 클래스의 상속

상속(Inheritance) 은 다른 클래스가 가지고 있는 기능을 물려받는 것이다.

기본 구조는 다음과 같다.

class 자식클래스(부모클래스):
    ...

기존 FourCal 클래스를 상속해 보자.

class MoreFourCal(FourCal):
    pass

MoreFourCal에는 아무 기능도 작성하지 않았지만 FourCal의 기능을 모두 사용할 수 있다.

a = MoreFourCal(4, 2)

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

실행 결과

6
8
2
2.0

상속받은 클래스에 새로운 기능도 추가할 수 있다.

거듭제곱을 수행하는 pow() 메서드를 추가해 보자.

class MoreFourCal(FourCal):
    def pow(self):
        result = self.first ** self.second
        return result

사용

a = MoreFourCal(4, 2)

print(a.pow())

실행 결과

16

기존 부모 클래스의 기능도 사용할 수 있다.

print(a.add())
6

즉,

FourCal
   ↓ 상속
MoreFourCal

MoreFourCal은

add()
mul()
sub()
div()

기능을 물려받고

pow()

라는 새로운 기능을 추가한 것이다.

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


6. 메서드 오버라이딩

다음 코드를 실행해 보자.

a = FourCal(4, 0)
a.div()

4 / 0을 계산하려고 하기 때문에 오류가 발생한다.

ZeroDivisionError

0으로 나누었을 때 오류 대신 0을 반환하도록 만들고 싶다면 새로운 클래스를 만들 수 있다.

class SafeFourCal(FourCal):
    def div(self):
        if self.second == 0:
            return 0
        else:
            return self.first / self.second

사용

a = SafeFourCal(4, 0)

print(a.div())

실행 결과

0

부모 클래스인 FourCal에도 이미 div() 메서드가 있다.

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

하지만 자식 클래스에서 같은 이름의 div()를 다시 만들었다.

이처럼 부모 클래스의 메서드를 자식 클래스에서 같은 이름으로 다시 정의하는 것을

메서드 오버라이딩(Method Overriding)

이라고 한다.

FourCal.div()
     ↓
SafeFourCal.div()로 재정의

자식 클래스에서 오버라이딩하면 부모 클래스의 메서드 대신 새로 정의한 메서드가 실행된다.


7. 클래스변수

지금까지 사용했던

self.first
self.second

는 객체마다 따로 존재하는 객체변수이다.

이번에는 객체들이 함께 사용하는 클래스변수를 알아보자.

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)

실행 결과

박
박

클래스변수는 해당 클래스로 만들어진 객체들이 공유하는 변수이기 때문이다.


객체변수와 클래스변수

구분객체변수클래스변수
선언self.firstlastname = "김"
값객체마다 독립적객체들이 공유
사용 예a.firstFamily.lastname

클래스변수와 같은 이름의 객체변수를 만들면?

현재

class Family:
    lastname = "박"

이라고 해보자.

a = Family()
b = Family()

여기서

a.lastname = "최"

라고 작성하면 Family.lastname이 변경되는 것이 아니다.

객체 a에 새로운 객체변수 lastname이 생성된다.

print(a.lastname)
최

하지만

print(Family.lastname)
print(b.lastname)

결과는

박
박

이다.

즉,

Family.lastname → "박"

a.lastname → "최"
b.lastname → "박"

가 된다.


💡 핵심 정리

개념설명
클래스(Class)객체를 만들기 위한 설계도
객체(Object)클래스를 이용해 실제로 만들어진 대상
인스턴스(Instance)특정 클래스로 만들어진 객체를 관계적으로 표현
메서드(Method)클래스 내부에 정의된 함수
self현재 메서드를 호출한 객체 자신
객체변수객체마다 독립적으로 가지고 있는 변수
__init__()객체가 생성될 때 자동으로 호출되는 생성자
상속다른 클래스의 기능을 물려받는 것
오버라이딩부모 클래스의 메서드를 자식 클래스에서 다시 정의
클래스변수해당 클래스로 만들어진 객체들이 공유하는 변수

클래스에서 가장 중요하게 이해해야 할 부분은 self와 객체변수이다.

a = FourCal(4, 2)

라고 했을 때

self   → a
first  → 4
second → 2

가 되고,

a.first = 4
a.second = 2

가 만들어진다.

즉 self는 현재 작업하고 있는 객체 자신이라고 기억하면 이해하기 쉽다.

profile
성실하자:)

0개의 댓글