Python Programming
  • Home
  • Intro
    • History & Background
    • Python Setup
  • Exercises
    • Chapter 5: Lists, Tuples, Sets
    • Chapter 6: Strings
    • Chapter 7: Dictionaries
    • Chapter 8: Control flow
    • Chapter 9: Functions
    • Chapter 14: Exceptions
    • Chapter 15: Classes
  • Exploring Data
    • NumPy & pandas
    • Inspecting data
    • Visualization
    • Plotting
  • Library System
  • Netflix Movie Analysis
  • References
    • QPB Part 1
    • QPB Part 2
    • QPB Part 3
    • QPB Part 4

On this page

  • 객체의 의미와 객체지향 프로그래밍 개념
import math

math.ceil(3.49)
4

위 맥락에서 math.ceil()함수는 무엇인가를 살펴보는데, math 모듈은 파이썬이 아니라 C로 작성되어 있어(성능을 위해 C 표준 수학 라이브러리를 사용) 소스 코드를 직접 열어볼 수 없기 때문에, 대신 파이썬으로 작성된 statistics 모듈을 살펴보면,

import statistics  # statistics 모듈을 import

# ?: 객체에 대한 설명을 간단히 볼 수 있는 jupyter notebook 특수 명령어
?statistics
  • statistics.py 파일을 열어보면, 실제 코드가 있음
  • 함수와 클래스들의 모음일 뿐
  • 이렇게 모아둔 함수를 쓰는 방식이 모듈이름에 .을 붙이는 모듈이름.함수이름() 방식

참고로 search bar에서 @: 현재 문서에서 특정 키워드를 종류별로 검색할 수 있음

import statistics

# statistics 모듈에 정의된 함수들 중 하나인 mean 함수를 호출
statistics.mean([1, 2, 3, 4, 5])

# 모듈 이름을 별칭으로 줄여서 쓰고 싶다면 as로
import statistics as stats
stats.mean([1, 2, 3, 4, 5])

# 특정 함수만 가져오고 싶다면, from 모듈이름 import 함수이름
from statistics import mean
mean([1, 2, 3, 4, 5])

객체의 의미와 객체지향 프로그래밍 개념

클래스(class)를 하나 살펴보기 위해 다시 statistics.py 파일을 열어,

search bar에서 @: 로 NormalDist 클래스를 검색해서 살펴보면,
클래스 내부에 여러 함수들이 정의되어 있고(이를 메서드라고 함), 이 함수들을 .을 이용해 호출할 수 있음

class NormalDist:
    "Normal distribution of a random variable"

    # ...

    def samples(self, n, *, seed=None):
        "Generate *n* samples for a given mean and standard deviation."
        rnd = random.random if seed is None else random.Random(seed).random
        inv_cdf = _normal_dist_inv_cdf
        mu = self._mu
        sigma = self._sigma
        return [inv_cdf(rnd(), mu, sigma) for _ in repeat(None, n)]

    # ...
from statistics import NormalDist  # 특정 클래스만 import

normal_dist = NormalDist(0, 1) # NormalDist 클래스의 인스턴스를 생성, 이를 객체라고 함

위에서 normal_dist는 NormalDist 클래스의 인스턴스(instance)라고 하고, 객체라고 부름

클래스는 설계도(빵틀)이고 이로부터 여러 객체(빵)를 만들 수 있음

normal_dist2 = NormalDist(100, 20)
normal_dist3 = NormalDist(100, 20)

특정 객체들은 설계도(클래스)에서 정의된 함수들을 그대로 품고 있고, .을 이용해 호출할 수 있음

가령, 위에서 samples라는 함수(메서드)를 다음과 같이 호출할 수 있음

normal_dist.samples(3)
[2.171878111699515, 0.6778761269942629, -1.3647675298991888]
normal_dist2.samples(3)
[87.4179456755521, 107.53891979998367, 80.06222317979662]

이제 파이썬의 내장 데이터 타입(모두 클래스로 정의됨)에 적용해보면

x = [1, 2, 3, 4, 5, 6, 7, 8, 9] # 리스트라는 클래스의 한 인스턴스(객체)
print(type(x))
<class 'list'>

이 리스트라는 클래스에 정의된 함수(메서드)들 중 하나인 reverse 메서드를 호출해보면,

x.reverse() # 리스트 객체의 메서드
print(x)
[9, 8, 7, 6, 5, 4, 3, 2, 1]

x.까지 치면 리스트 객체에 정의된 메서드들이 나옴

이는 다음과 같이 리스트 클래스로부터 직접 호출할 수도 있음

list.reverse(x)
print(x)
[1, 2, 3, 4, 5, 6, 7, 8, 9]

내장 함수인 len()도 이 원리와 이어짐
즉, len(x)는 내부적으로 x.__len__()을 호출함

그래서 다음과 같이 메서드를 직접 호출해도 같은 결과가 나옴

x.__len__()  # len(x)와 같은 결과
9
Note

정확히 말하면,

  • len()은 어느 클래스에도 속하지 않는 독립적인 내장 함수임
    그 안에서 __len__()을 호출하고, 돌려받은 값이 0 이상의 정수인지까지 확인함
  • 한편, abs()와 같은 함수는 던더 메서드에 그대로 위임함
    __abs__()이 돌려준 값을 검사하지 않고 그대로 내보냄

이 원리를 다음과 같이 문자열 객체에 적용하면,

len("asdedwdawaw")

은 사실 내부적으로 문자열 클래스에 정의된 __len__ 메서드를 호출한 것임

"asdedwdawaw".__len__()

같은 len()을 써도 리스트면 리스트 클래스의 __len__, 문자열이면 문자열 클래스의 __len__이 호출됨; 이를 다형성(polymorphism)이라고 함

이는 객체지향 프로그래밍의 전형적인 특징으로 이해할 수 있음.

즉, 클래스라는 설계도를 만든 후, 이 설계도 안에서 정의된 함수들을 객체들이 호출할 수 있음

다음의 다른 예들을 살펴보면,

[1, 2, 3] + [4, 5, 6]
[1, 2, 3, 4, 5, 6]
# + 연산자는 사실 리스트 클래스에 정의된 메서드를 호출한 것임
[1, 2, 3].__add__([4, 5, 6])
[1, 2, 3, 4, 5, 6]

같은 + 연산자라도 어떤 클래스의 객체인지에 따라 각 클래스에 정의된 __add__가 호출되어 다른 의미를 가짐

"abc" + "def"
'abcdef'

위의 + 연산자는 문자열 클래스에서 정의된 메서드를 호출한 것임

"abc".__add__("def")
'abcdef'
"abcde".upper()  # upper()는 문자열 클래스(str)에 정의된 메서드
'ABCDE'
Part I: Chapter 1-3 정리
Chapter 5: Lists, Tuples, Sets

This work © 2025 by Sungkyun Cho is licensed under CC BY-NC-SA 4.0