Python 기초

객체 지향 프로그래밍이란?

객체 지향 프로그래밍(OOP : object-oriented programming)은 우리가 살고 있는 실제 세계가 객체(object)들로 구성되어 있는 것과 비슷하게, 소프트웨어도 객체로 구성하는 방법입니다.

실제 세계에는 사람, 텔레비전, 세탁기, 냉장고 등의 많은 객체가 존재합니다. 객체들은 객체 나름대로의 고유한 기능을 수행하면서 다른 객체들과 상호 작용합니다.

 

object oriented에 대한 이미지 검색결과

실제 세계는 객체들로 이루어져 있습니다.

 

예를 들면, 사람이 리모콘을 이용하여 텔레비전을 조작하는 상황을 생각해봅시다.

티비와 리모콘은 모두 특정한 기능을 수행하는 객체라고 생각할 수 있고 티비와 리모콘은 메시지를 통하여 서로 상호 작용하고 있습니다.

 

tv and remocon에 대한 이미지 검색결과

이렇게 객체들은 메시지를 보내고 받으면서 상호작용합니다.

 

소프트웨어 개발도 이와 같이 하는 방식을 객체 지향이라고 합니다.

다양한 기능을 하는 소프트웨어 객체들이 존재하고 이러한 객체들을 조합하여 자기가 원하는 기능을 구현하는 기법입니다.

위의 그림에서 티비와 리모콘은 소프트웨어 객체로 표현되며 이들 소프트웨어 객체들이 메시지를 전달하여 서로 상호 작용하면서 원하는 작업을 수행하게 됩니다.

프로그램에서는 현실 세계에서 볼 수 있는 물리적인 객체도 사용하지만 소프트웨어 세계에서만 존재하는 객체도 사용합니다.

예를 들면 화면의 윈도우나 버튼도 하나의 객체로 취급됩니다.

 

객체

객체(Object)는 그 이름에서 볼 수 있듯이, 객체 지향 기술의 핵심 개념입니다. 객체는 상태와 동작을 가지고 있습니다.

객체의 상태(state)는 객체의 속성입니다. 예를 들어, 텔레비전 객체의 경우, 상태는 채널 번호, 볼륨, 전원 상태 등입니다.

객체의 동작(behavior)은 객체가 취할 수 있는 동작(기능)입니다. 텔레비전을 예로 들면, 켜기, 끄기, 채널 변경하기, 볼륨 변경하기 등이 여기에 해당됩니다.

 

객체의 상태와 동작은 소프트웨어에서는 각각 인스턴스 변수와 메소드로 표현할 수 있습니다.

객체 안의 변수를 인스턴스 변수(instance variable)라고 하고 객체의 동작을 나타내는 부분을 메소드(method)라고 부릅니다.

즉 객체는 인스턴스 변수와 메소드로 이루어져 있는 소프트웨어의 묶음이라 할 수 있습니다. 인스턴스 변수에 객체의 상태를 저장합니다.

메소드는 특정한 작업을 수행합니다. 텔리비전 객체의 경우에는 아래와 같은 인스턴스 변수와 메소드를 생각할 수 있습니다.

 

  • 인스턴스 변수 - 상태를 의미합니다.
    •  int channelNO
    • int volume
    • bool onOff
  • 메소드 - 동작을 의미합니다.
    • turnOn()
    • turnOff()
    • changeChannel()
    • changeVolume()

 

클래스란?

우리는 앞에서 객체 지향 프로그램은 객체로 구성된다는 사실을 알았습니다. 그런데 같은 종류의 객체는 하나만 있을까요?

자동차를 예로 들어봅시다. 자동차는 하나만 있는 것이 아닙니다. 슬기네도 같은 브랜드의 자동차를 가질 수 있고, 봉민이네도 같은 브랜드의 자동차를 가질 수 있습니다.

자동차는 어떻게 만들어질까요? 엔지니어가 설계하여 자동차 설계도를 만들고 이 설계도에 의하여 각각의 자동차가 만들어집니다.

 

와플 기계에 대한 이미지 검색결과

와플을 찍어내는 와플 기계처럼 클래스는 객체를 찍어내는 틀과 같습니다.

 

객체 지향 소프트웨어에서도 객체들이 동일한 방법으로 생성됩니다. 즉 설계도에 의하여 객체들이 생성됩니다.

객체에 대한 설계도를 클래스(class)라고 합니다. 클래스란 특정한 종류의 객체들을 찍어내는 형틀(template) 또는 청사진(bluprint)이라고도 할 수 있습니다.

클래스로부터 만들어지는 각각의 객체를 그 클래스의 인스턴스(instance)라고 합니다.

 

왜 클래스를 통하여 객체를 생성하는 것일까요? 일반적으로 프로그램에서는 같은 종류의 객체가 많이 필요하기 때문입니다.

예를 들어 슈팅 게임 프로그램에서 미사일을 나타내는 객체는 아주 많이 필요합니다. 이럴 때는 클래스를 만들어 두고 필요할 때마다 객체를 찍어내는 것이 편리합니다.

 

객체 지향에서는 소프트웨어의 기본 단위가 클래스가 됩니다. 소프트웨어를 만들어간다고 하는 것은 클래스를 하나씩 추가해나가는 과정입니다.

물론 다른 사람이 만들어놓은 클래스를 사용할 수도 있습니다. 예를 들어 파이썬은 우리를 위하여 많은 유용한 클래스들을 제공하고 있습니다.

따라서 이들 클래스들을 이용하여 우리가 원하는 프로그램을 아주 빠르게 작성할 수 있습니다.

예를 들어서 네트워킹 프로그램을 작성할 때, 파이썬이 제공하는 클래스들을 이용하여 몇 가지 객체만 생성하면 바로 네트워킹 기능을 구현할 수 있습니다.

 

NOTE

인스턴스(instance)는 사례라는 의미입니다. 객체라는 용어가 있는데 인스턴스라는 새로운 용어를 사용하는 이유는 무엇일까요?

객체는 너무 광범위한 의미를 가지고 있기 때문입니다. 특정한 클래스로부터 생성된 객체를 그 클래스의 인스턴스라고 합니다.

 

파이썬에서는 모든 것이 객체입니다.

파이썬에서는 모든 것이 객체로 구현됩니다. 정수도 객체이고 문자열도 객체이며 리스트도 객체입니다.

객체의 특징은 우리가 사용할 수 있는 메소드를 가지고 있다는 점입니다. 예를 들어 리스트는 insert()나 remove()와 같은 메소드를 가지고 있습니다.

문자열은 upper()와 같은 메소드를 가지고 있습니다. 다음과 같은 문장을 살펴 봅시다.

print("Everything in Python is an object".upper())

 

<실행 결과>

EVERYTHING IN PYTHON IS AN OBJECT

 

"Everything in Python is an object" 는 문자열이고 파이썬 안에서는 객체로 취급됩니다.

따라서 여러 가지 메소드를 가지고 있습니다. 그 중의 하나가 upper() 입니다. upper() 는 문자열의 모든 문자를 대문자로 변환하는 메소드입니다.

upper()를 호출하면 대문자로 변환한 문자열을 반환합니다.

 

정수도 객체로 구현되어 있습니다. 다음 문장에서는 정수 객체가 가지고 있는 메소드인 __add__()를 호출하였습니다.

print((1).__add__(2))

 

<실행 결과>

3

 

클래스에 의하여 제공되는 메소드는 클래스의 공용 인터페이스(public interface)라고 불립니다.

개발자로서 객체를 가지고 작업할 때는 객체가 어떻게 내부적으로 속성을 저장하고 어떻게 메소드들이 구현되는지 알 필요가 없습니다.

예를 들어서 여러분은 문자열 객체가 내부적으로 어떻게 문자들을 저장하는지 알 필요가 없습니다.

우리에게 중요한 것은 개발자가 사용할 수 있는 공용 인터페이스입니다. 우리가 어떤 메소드를 사용할 수 있으며 또한 그 메소드가 하는 작업만 알면 됩니다.

이렇게 공용 인터페이스만 제공하고 구현 세부 사항을 감추는 것은 캡슐화(encapsulation)라고 합니다.

 

캡슐화에 대한 이미지 검색결과

캡슐화는 데이터와 알고리즘을 하나로 묶는 것입니다.

 

캡슐화를 이렇게 이해하여 봅시다. 우리가 자동차를 구입하면 자동차가 어떻게 동작되는지 알 필요가 있을까요? 우리에게 중요한 것은 자동차를 사용하는 방법입니다.

즉 방향을 바꿀 수 있는 운전대와 누르면 멈추는 브레이크 페달, 누르면 속도가 증가되는 엑셀 페달만 알면 됩니다.

이것이 바로 자동차의 공용 인터페이스라고 할 수 있습니다.

 

encapsulation example image에 대한 이미지 검색결과