객체 지향 프로그래밍Object-Oriented Programming은 프로그램을 구성하는 주요 요소인 객체object 각자의 기능을 정의하고, 이 객체들 사이의 유기적인 관계를 묘사하는 프로그래밍 기법이다. 줄여서 보통 OOP라고 부르며, 파이썬, 자바, C++, C#, 루비, 자바스크립트 등 많은 컴퓨터 프로그래밍 언어가 OOP를 지원하는 객체 지향 프로그래밍 언어이다.
OOP와 대비되는 개념으로 절차 지향 프로그래밍이 주로 언급된다. 절차 지향 프로그래밍은 객체 간의 관계 보다는 처리해야 할 작업을 순차적으로 순행하는 과정에 집중한다. 대표적인 절차 지향 프로그래밍언어로 C, HTML 등이 분류된다.
12.1OOP와 객체¶
OOP에 대한 이해는 아래 두 가지 질문과 관련되어 있다.
객체object란 무엇인가?
“객체를 중심으로 프로그래밍한다” 라는 말의 의미는 무엇인가?
12.1.1객체란?¶
객체object는 특정 클래스Class의 인스턴스instance로 생성된 값이며, 그 값의 자료형으로 해당 클래스명이 지정된다. 프로그래밍 언어마다 객체로 정의되는 값의 종류가 다르지만, 파이썬에서는 모든 값이 객체로서 특정 클래스의 인스턴스로 생성됩니다.
예를 들어, 정수, 부동소수점, 부울값, 문자열, 리스트, 튜플, 사전, 집합 등은 각각 int, float, bool, str, list, tuple, dict, set 클래스를 자료형으로 갖는 객체입니다.
값 예시와 함께 파이썬의 기초 자료형을 표로 정리하면 다음과 같다.
| 값 예시 | 자료형(Class) | 설명 |
|---|---|---|
1, 2, 3 | int | 정수 객체 |
1.3, 2.0, 3.14 | float | 부동소수점 객체 |
True, False | bool | 불리언 객체 |
"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 | 집합 객체 |
12.1.2객체를 중심으로 프로그래밍한다?¶
모든 객체는 고유한 기능을 가지며, 메서드method를 통해 그 기능을 활용할 수 있다. 즉, 객체의 고유 기능을 이용하여 새로운 값을 생성하고 이를 활용하는 것이 객체 중심 프로그래밍Object-Oriented Programming 기본 의미이다. 여기서는 파이썬 리스트와 문자열의 메서드의 기초적인 사용법을 활용하여 객체를 중심으로 프로그래밍한다는 의미를 설명한다.
12.2리스트 메서드 활용¶
리스트에 항목을 추가 또는 삭제하려면 아래 코드에서처럼 append() 또는 pop() 메서드를 이용한다.
evens = [0, 2, 4]리스트에 항목 추가
evens.append(6)
evens[0, 2, 4, 6]리스트의 첫째 항목 삭제
evens.pop(0)
evens[2, 4, 6]12.3문자열 메서드 활용¶
문자열에 포함된 모든 대문자를 소문자로 변경해서 새로운 문자열을 생성하고자 할 때 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()는
메서드 호출에 사용된 문자열은 그대로 두고 새로운 문자열을 생성한다.
이런 이유로 매번 새로운 변수를 선언하여 생성된 문자열을 할당하였다.
즉, days와 lower_days가 가리키는 값은 변하지 않았다.
days'one day, two Days, three days'lower_days'one day, two days, three days'그런데 두 메서드의 반환값이 모두 str 자료형의 값이기에 한 메서드의 반환값에
다른 메서드를 적용할 수 있다.
예를 들어 days 변수가 가리키는 문자열에 포함된 day와 Day 를 모두 week로 대체하고자 할 때
lower() 메서드의 반환값에 바로 replace() 적용할 수 있다.
days.lower().replace('day', 'week')'one week, two weeks, three weeks'물론 여전히 days가 가리키는 문자열은 변하지 않는다.
days'one day, two Days, three days'