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

9.1. OOP란?#

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

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

“해야 할 일을 순차적으로 처리한다”는 표현은 가장 기초적인 프로그래밍 기법이며, 모든 프로그램은 원하는 결과를 얻기 위한 과정을 논리적이며 순차적으로 처리하도록 구현되어야 한다. OOP 역시 예외가 아니다.

하지만 OOP는 구현해야 할 객체들을 선택하고 객체들 사이의 유기적인 관계를 이용하는 과정을 논리적으로 묘사하는 데에 보다 많은 방점을 둔다. 즉, 프로그램 전체를 하나로 묶어서 구현하는 방식이 아니라 프로그램을 구성하는 객체들을 중심으로 해서 구현해야 할 프로그램을 완성시키는 방식으로 프로그래밍을 진행한다.

9.2. OOP와 객체#

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

  1. 객체(object)란 무엇인가?

  2. “객체를 중심으로 프로그래밍한다” 라는 말의 의미는 무엇인가?

9.2.1. 객체란?#

파이썬에서 객체는 특정 클래스의 인스턴스로 생성되는 값이다. 그리고 그렇게 생성된 값은 해당 클래스를 자료형으로 갖는다고 말한다. 사실 파이썬의 모든 값은 객체, 즉 어떤 클래스의 인스턴스로 생성되는 객체다.

예를 들어 정수, 부동소수점, 부울값, 문자열, 리스트, 튜플, 사전, 집합 등은 각각 int, float, bool, str, list, tuple, dict, set 클래스를 자료형으로 갖는 객체다.

  • 1, 2, 3, … 등의 정수: int 클래스의 객체

  • 1.3, 2.0, 3.14 … 등의 부동소수점: float 클래스의 객체

  • "python", '파이썬', '프로그래밍', … 등의 문자열: str 클래스의 객체

  • [1.3, 2.0, 3.14], ["python", '파이썬', '프로그래밍'] 등의 리스트: list 클래스의 객체

  • (2, 3), (1.3, 2.0), ('파이썬', '프로그래밍') 등의 튜플: tuple 클래스의 객체

  • {'a': 3, 'b': [2, 3, 4]} 등의 사전: dict 클래스의 객체

  • {1, 2, 3}, {'abc', 'def'} 등의 집합: set 클래스의 객체

9.2.2. 객체를 중심으로 프로그래밍한다?#

모든 객체는 고유의 기능을 가지며 메서드를 이용하여 필요한 기능을 활용할 수 있다. 이처럼 객체의 고유 기능을 이용하여 새로운 값을 생성하여 활용하는 것이 객체 중심 프로그래밍의 기본 의미이다.

여기서는 파이썬 프로그래밍 언어를 이용한 데이터 분석과 관련시키기 위해 리스트와 문자열의 메소드를 활용하여 객체를 중심으로 프로그래밍한다의 의미를 설명한다.

예제 1: 리스트 메서드 활용

리스트에 항목을 추가 또는 삭제하려면 아래 코드에서처럼 append() 또는 pop() 메서드를 이용한다.

evens = [0, 2, 4]
  • 리스트에 항목 추가

evens.append(6)
evens
[0, 2, 4, 6]
  • 리스트의 첫째 항목 삭제

evens.pop(0)
evens
[2, 4, 6]

예제 2: 문자열 메서드 활용

문자열에 포함된 모든 대문자를 소문자로 변경해서 새로운 문자열을 생성하고자 할 때 lower() 메서드를 이용한다.

days = "one day, two Days, three days"
  • 대문자를 모두 소문자로 바꾼 문자열 생성

lower_days = days.lower()
lower_days
'one day, two days, three days'

'day'week로 대체해보자.

  • 부분 문자열을 대체해서 새로운 문자열 생성

lower_weeks = lower_days.replace('day', 'week')
lower_weeks
'one week, two weeks, three weeks'

문자열 메서드의 연속 적용

문자열 자료형 str은 수정이 허용되지 않은 불변 자료형이다. 따라서 lower()replace()는 메서드 호출에 사용된 문자열은 그대로 두고 새로운 문자열을 생성한다. 이런 이유로 매번 새로운 변수를 선언하여 생성된 문자열을 할당하였다. 즉, dayslower_days가 가리키는 값은 변하지 않았다.

days
'one day, two Days, three days'
lower_days
'one day, two days, three days'

그런데 두 메서드의 반환값이 모두 str 자료형의 값이기에 한 메서드의 반환값에 다른 메서드를 적용할 수 있다. 예를 들어 days 변수가 가리키는 문자열에 포함된 dayDay 를 모두 week로 대체하고자 할 때 lower() 메서드의 반환값에 바로 replace() 적용할 수 있다.

days.lower().replace('day', 'week')
'one week, two weeks, three weeks'

물론 여전히 days가 가리키는 문자열은 변하지 않는다.

days
'one day, two Days, three days'