18. 객체 지향 프로그래밍#

18.1. OOP란?#

객체 지향 프로그래밍Object-Oriented Programming은 객체들 사이의 유기적인 관계를 묘사하는 프로그래밍 기법이며, 줄여서 보통 OOP라고 부른다. OOP를 지원하는 객체 지향 언어로 파이썬, 자바, C++, C#, 루비, 자바스크립트 등 많은 컴퓨터 프로그래밍 언어가 사용된다.

OOP와 대비되는 개념으로 절차 지향 프로그래밍이 주로 언급된다. 절차 지향 프로그래밍은 수행해야 할 일을 순차적으로 처리하는 과정을 묘사하는 것을 가장 중요하게 여기며 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법이다. C, HTML 등이 대표적인 절차 지향 프로그래밍언어다.

“해야 할 일을 순차적으로 처리한다”는 표현은 가장 기초적인 프로그래밍 기법이며, 모든 프로그램은 원하는 결과를 얻기 위한 과정을 논리적이며 순차적으로 처리하도록 구현되어야 한다. OOP 역시 예외가 아니다. 하지만 OOP는 구현해야 할 객체들을 선택하고 객체들 사이의 유기적인 관계를 이용하는 과정을 논리적으로 묘사하는 데에 보다 많은 방점을 둔다.

18.2. OOP와 객체#

OOP에 대한 이해는 아래 두 가지 질문과 관련되어 있다.

  1. 객체object란?

  2. “객체를 중심으로 프로그래밍한다”의 의미는?

18.2.1. 객체#

파이썬에서 객체는 특정 클래스의 인스턴스instance로 생성되는 값이다. 그렇게 생성된 값의 자료형은 값을 생성할 때 사용된 클래스로 지정된다.

파이썬의 모든 값은 하나의 객체, 즉 어떤 클래스의 인스턴스로 생성된다. 예를 들어 정수, 부동소수점, 부울값, 문자열, 리스트, 튜플, 사전, 집합 등은 각각 int, float, bool, str, list, tuple, dict, set 클래스의 인스턴스로 생성된 객체다.

Table 18.1 클래스와 인스턴스#

클래스

인스턴스

int

0, 1, 2, 3, -1. -17

float

1.3, 2.0, 3.14

str

'python', '파이썬', '프로그래밍'

list

[1.3, 2.0, 3.14], ["python", '파이썬', '프로그래밍']

tuple

(2, 3), (1.3, 2.0), ('파이썬', '프로그래밍')

dict

{'a': 3, 'b': [2, 3, 4]}

set

{1, 2, 3}, {'abc', 'def'}

18.2.2. 객체 중심 프로그래밍#

객체는 클래스가 제공하는 속성과 기능을 활용할 수 있다. 리스트의 속성은 예를 들어 항목으로 사용된 값과 항목의 개수 등의 정보를, 리스트의 기능은 리스트에 포함된 항목과 정보를 활용하고 수정하는 메서드들이다.

아래 코드는 리스트에 항목(속성)을 확인하고 추가, 삭제하는 기능을 다룬다. 이처럼 객체 고유 기능을 이용하여 새로운 값을 생성하고 활용하는 일이 객체 중심 프로그래밍의 핵심이다.

evens = [0, 2, 4]

# 항목 확인
print('1번 인덱스의 항목:', evens[1])

# 항목 추가
evens.append(6)
print('끝에 추가된 항목:', evens)

# 항목 삭제
print('삭제되는 첫째 항목:', evens.pop(0))
print('첫째 항목이 제거된 후:', evens)
1번 인덱스의 항목: 2
끝에 추가된 항목: [0, 2, 4, 6]
삭제되는 첫째 항목: 0
첫째 항목이 제거된 후: [2, 4, 6]

18.2.3. 모든 게 객체!#

파이썬에서는 심지어 함수, 모듈, 클래스 자체도 특정 클래스의 인스턴스다. 한마디로 파이썬에서 다룰 수 있는 모든 값은 특정 클래스에 속한다. turtle 모듈을 활용하는 코드를 이용하여 좀 더 자세히 설명한다.

아래 코드는 turtle 모듈의 거북이 객체를 활용하여 파이썬 프로그래밍의 기초를 소개한 코딩 한 시간에서 가져왔다.

  • 거북이 객체 예제 코드

위 코드에 사용된 클래스와 객체는 다음과 같다.

Table 18.2 turtle 모듈과 거북이 객체#

클래스

인스턴스

module

turtle 모듈

type

turtle.Turtle 클래스

turtle.Turtle

tina, tommy 등 거북이 객체

method

tina.shape, tina.goto, tommy.forward 등 거북이 객체 메서드

function

turtle_run 함수

코드에 사용된 객체의 속성과 메서드는 다음과 같다.

Table 18.3 거북이 속성과 메서드#

메서드

설명

tina.shape()

객체 모양 속성 지정

tommy.color()

객체 색상 속성 지정

t.speed()

객체 이동 속도 속성 지정

t.forward()

객체 전진 이동

tina.goto()

객체 위치 이동

tina.penup(), tommy.penup()

객체 펜 들어올리기

tina.pendown(), tommy.pendown()

객체 펜 내리기

객체의 모양, 색깔, 이동 속도 등은 객체 내에서 선언된 변수에 할당되어 저장된다. 예를 들어 tommy 거북이가 사용하는 펜의 색깔은 tommy._pencolor 속성 변수에 저장된다. 이런 속성들은 터틀 그래픽스가 게임을 실제로 실행되도록 구현할 때 활용된다.

18.3. 객체 상호 작용#

하나의 클래스를 이용해서 생성된 여러 개의 객체는 기본적으로 상호 독립적이다. 예를 들어 두 개의 [1, 2, 3]['a', 'b', 'c'] 는 둘 모두 list의 인스턴스이지만 기본적으로 서로 아무 연관이 없다. 위 코드에서 생성된 두 마리이의 거북이 객체들도 서로 상관없이 각자 독립적으로 움직인다.

반면에 두 객체 사이의 상호 작용이 가능하게 만들 수도 있다. 예를 들어 아래 코드는 [1, 2, 3]['a', 'b', 'c'] 를 서로 연관시킨 후 홀수와 관련된 항목만 출력한다.

for (x, y) in zip([1, 2, 3], ['a', 'b', 'c']):
    if x % 2:
        print(x, y)
1 a
3 c

객체 지향 프로그래밍은 한마디로 객체 각각이 수행하는 기능과 객체들 사이의 상호 작용을 활용하는 프로그램 기법을 의미한다.

아래 코드는 tinatommy 두 거북이 객체가 서로 충돌할 때 각자 임의의 위치로 달아나는 장면을 구현한다. distance() 함수는 수평선상에서 움직이는 두 거북이의 거리를 계산하기 위해 단순히 x-좌표의 오차를 이용한다. 두 거북이가 서로를 향해 다가오다가 거리가 30 이하가 되는 순간 화들짝 놀라 서로 방향을 틀고 각자 임의의 위치로 달아난다.

  • 거북이 충돌 감지 예제 코드

이어지는 장에서 객체 상호 작용을 보다 다양한 방식으로 구현하는 방식을 소개한다.

18.4. 예제#

예제 1

아래 프로그램에서 polygon() 함수는 지정된 길이를 한 변으로 하는 정다각형을 그리도록 하며 두 개의 매개변수를 사용한다.

  • n: 다각형의 모양. 즉, 변의 개수

  • length: 한 변의 길이

프로그램을 실행하면 Tina가 한 변의 길이가 50인 정삼각형과 한 변의 길이가 30인 정오각형을 그린다.

  • 다각형 그리기 코드

예제 2

거북이 객체의 circle() 함수를 이용하면 지정된 반지름의 원을 그린다. 그런데 polygon() 함수를 이용하여 원을 그릴 수 있다. 예를 들어 아래 프로그램에서 정의된 p_circle() 함수는 반지름 r이 주어졌을 때 먼저 원의 둘레를 계산한다. 계산에 사용되는 math.pimath 모듈에서 원주율을 할당 받은 변수 pi를 가리킨다.

circumference = 2 * math.pi * r

그런 다음 원의 둘레를 100 등분해서 정 100-각형을 그린다. 엄밀히 따지면 원이 아니지만 각 변의 길이가 짧아서 마치 하나의 원처럼 보인다.

  • 원 그리기 코드

예제 3

isosceles(t, r, angle) 함수는 길이가 r인 두 등변의 꼭지각이 2*angle인 이등변 삼각형을 그린다. 단, t는 이등변 삼각형을 그리는 거북이 객체를 가리킨다.

참고: isosceles는 ‘이등변의’ 뜻을 가진 영어 단어. ‘아이사슬리즈’ 라고 발음된다.

  • 이등변 삼각형 그리기 코드

예제 4

polygon_pie(t, n, r) 함수는 다각형 파이 모양을 그린다. 각각의 매개변수의 역할은 다음과 같다.

  • t: 거북이 객체

  • n: 정 n-각형 지정

  • r: 파이를 그릴 때 사용되는 이등변 삼각형의 등변 길이

예를 들어 polygon_pie(t, 6, 60)은 등변의 길이가 60인 이등변 삼각형 6개로 구성된 파이를 그린다.

  • 다각형 파이 그리기 코드

18.5. 연습문제#

참고: (연습) 객체 지향 프로그래밍