프로그램이 어떤 작업을 수행하기 위해서는 (1)데이터와 (2)데이터를 조작하는 행위, 두 가지 요소가 필요하다. 일반적으로 데이터는 변수(variable)에 넣어서 사용하고 데이터를 조작하는 일은 함수(function)로 구성해서 쉽게 실행시킬 수 있도록 만들어 놓는다.
객체(object)는 서로 연관된 데이터와 그 데이터를 조작하기 위한 함수를 하나의 집합에 모아놓은 것을 말한다.
집합의 원소가 되는 변수나 함수는 멤버(member) 또는 속성(attribute)이라고 한다. 특히 객체에 합쳐진 함수는 함수가 아니라 메서드(method)라고 부른다.
예를 들어 사각형의 면적을 구하는 프로그램을 만든다고 하자. 필요한 변수와 함수는 다음과 같다.
객체지향을 사용하지 않고 파이썬으로 구현하면 다음과 같아진다.
In [1]:
h = 10
v = 20
def area(h, v):
return h * v
a = area(h, v)
print(a)
위 프로그램에서 사각형의 가로 길이를 나타내는 변수 h
, 사각형의 세로 길이를 나타내는 변수 v
, 그리고 이 사각형의 면적을 계산하는 함수 area()
는 제각기 떨어져 있다. 하지만 객체 지향 프로그래밍에서는 이 세가지를 하나의 객체(object)로 묶을 수 있다.
다음은 이 프로그램을 객체 지향 방식으로 다시 구현한 것이다.
In [2]:
class Rectangle(object):
def __init__(self, h, v):
self.h = h
self.v = v
def area(self):
return self.h * self.v
이 부분은 클래스(class) 구현이라고 한다. 실제로 길이 변수들을 저장하고 면적을 계산하는 코드는 다음과 같다.
In [3]:
r = Rectangle(10, 20)
a = r.area()
print(a)
위 프로그램에서 r
이 바로 객체이다. 어떻게 위와 같은 코드를 만드는지에 대해서는 곧 자세히 설명할 것이다.
객체 r
은 사각형의 가로 길이와 세로 길이를 나타내는 변수 h
와 v
그리고 면적을 계산하는 함수 area()
가 합쳐져서 만들어진 것이다. 객체 r
에 포함된 이 변수들과 함수, 즉 속성을 꺼내려면 객체 이름 뒤에 점(.)을 붙인 다음 속성 이름을 치면 된다. 다음과 같이 입력해 보면 알 수 있다.
In [4]:
r.h
Out[4]:
In [5]:
r.v
Out[5]:
In [6]:
r.area()
Out[6]:
객체 지향 프로그래밍에서 객체를 만들려면 객체를 바로 만들지 못하고 항상 클래스(class)라는 것을 만든 후에 그 클래스를 이용하여 객체를 만들어야 한다.
위 예제에서 Rectangle
은 클래스이고 r
은 Rectangle
클래스로 만들어진 객체이다. 객체와 클래스의 관계는 "붕어빵"과 "붕어빵을 굽는 틀"에 비유할 수 있다. 즉, 정해진 속성, 여기에서는 가로 길이 h
와 세로 길이 v
라는 속성을 가지도록 사각형 클래스를 한 번 만들어 놓으면 이 속성을 가지는 실제 사각형은 얼마든지 많이 만들 수 있다.
예를 들어 위에서 만들어 놓은 Rectangle
클래스로 다음과 같이 5개의 사각형을 만들 수도 있다.
In [7]:
a = Rectangle(1, 1) # 가로 1, 세로 1인 사각형
b = Rectangle(2, 1) # 가로 2, 세로 1인 사각형
c = Rectangle(4, 2) # 가로 4, 세로 2인 사각형
d = Rectangle(6, 3) # 가로 6, 세로 3인 사각형
e = Rectangle(8, 5) # 가로 8, 세로 5인 사각형
이 사각형들의 면적은 다음과 같이 계산한다.
In [8]:
print(a.area())
print(b.area())
print(c.area())
print(d.area())
print(e.area())
파이썬에서 클래스를 정의하는 문법은 다음과 같다.
class 클래스이름(object):
def __init__(self, 속성값1, 속성값2, 속성값3):
self.속성이름1 = 속성값1
self.속성이름2 = 속성값2
self.속성이름3 = 속성값3
이 때 속성값 인수는 필요하지 않다면 없어도 된다.
여기에서 class 블럭안에 정의된 __init__
란 함수는 생성자(constructor)라고 하며 클래스 정의에서 가장 중요한 함수이다.
객체를 생성할 때는 클래스이름
이란 이름을 가진 함수를 호출해야 하는데 이 때 실제로는 __init__
로 정의된 생성자 함수가 호출된다. 생성자 함수 내부에서는 생성자를 호출할 때 넣은 입력 변수, 즉 인자의 값을 속성값으로 저장한다.
즉, init은 초기값을 저장한다고 보면 된다
삼각형의 넓이를 계산하기 위한 클래스를 만든다. 이 클래스는 다음과 같은 속성을 가진다.
b
와 높이 h
area
In [16]:
class triangle:
def __init__(self, b, h):
self.b = b
self.h = h
def area(self):
return self.b * self.h
In [17]:
a = triangle(10, 20)
In [20]:
a.area()
Out[20]:
사각 기둥의 부피를 계산하기 위한 클래스를 만든다. 이 클래스는 다음과 같은 속성을 가진다.
a
, 밑면의 세로 길이 b
, 높이 h
volume
surface
In [47]:
class 사각기둥부피:
def __init__(self, a1, b1, h1):
self.a1 = a1
self.b1 = b1
self.h1 = h1
def volume(self):
return self.a1 * self.b1 * self.h1
def surface(self):
return 2(self.a1*self.b1+self.b1*self.h1+self.h1*self.a1)
In [48]:
make_sample = 사각기둥부피(10,20,2)
In [49]:
make_sample.volume()
Out[49]:
In [50]:
make_sample.surface()
In [ ]: