객체지향 프로그래밍이란?
객체지향 프로그래밍(OOP: object-oriented programming)은 객체를 중심으로 프로그램을 구성하는 패러다임이다. 파이썬은 이 객체지향 프로그래밍을 자연스럽게 지원하기 때문에 개발자들이 더 쉽고 효과적으로 코드를 작성할 수 있게 해 준다. 객체 지향 프로그래밍이 무엇인지, 파이썬에서 어떻게 활용되는지 알아보자.
객체란?
객체지향 프로그래밍이 무엇인지 이해하기 위해서는 당연히 객체가 무엇인지를 알아야 하겠다. 객체(object)는 쉽게 말해 “사물”이나 “개체”를 의미한다. 사람, TV, 세탁기, 냉장고 등등.. 우리 주변에 있는 다양한 것들이 모든 것이 객체라고 볼 수 있다. 이 세상은 무수한 객체들로 이루어져 있는 것이다.
객체는 상태(state)와 동작(behavior)을 가지고 있다. 객체의 상태는 객체의 속성을, 객체의 동작은 말 그대로 객체가 취할 수 있는 동작이나 기능을 말한다. TV라는 객체를 예로 들어보자.
TV는 채널번호, 볼륨, 전원 상태 같은 상태를 가지고 있다. 그리고 이런 상태들을 조작할 수 있는 기능들을 가지고 있다. 전원을 켜고 끄는 것, 채널을 변경하고, 볼륨을 변경하는 것들이 TV의 동작에 해당하는 요소들이다.
프로그래밍에서는 이러한 객체의 상태와 동작을 각각 인스턴스 변수와 메소드로 표현한다. 그러니까 객체 안의 상태 정보를 저장하는 변수를 인스턴스 변수(instance variable), 객체의 동작을 나타내는 함수를 메서드(method)라고 부르는 것이다. 즉, 객체는 인스턴스 변수와 메서드로 이루어져 있다.
클래스란?
그런데 앞서 본 TV 객체는 어떻게 만들어진 걸까? 앞서 나열했던 TV의 채널 번호와 동작 같은 상태와 켜고 끄는 등의 동작은 설계도에 정의되어 있고 그 설계도를 기반으로 TV라는 객체가 만들어진 것이다. 객체지향 소프트웨어에서도 마찬가지이다.
어떠한 객체는 그 객체의 설계도를 기반으로 만들어진다. 그 설계도를 클래스(class)라고 한다. 쉽게 말해, 클래스는 특정한 종류의 객체들을 찍어내는 틀(template)이라고 볼 수 있다. 그리고 그 클래스라는 틀로부터 만들어지는 각각의 객체를 인스턴스(instance)라고 부른다.
그 유명한 붕어빵의 비유를 빌려오자면, 클래스는 붕어빵 틀에 해당하고 인스턴스는 그 붕어빵 틀을 통해 만들어진 각각의 붕어빵에 해당한다. 붕어빵 틀이 하나 만들어져 있다면 손쉽게 많은 붕어빵을 만들어낼 수 있다.
클래스는 소프트웨어를 작성하는 기본 단위가 된다. 그리고 이런 클래스를 이용하면 우리가 원하는 프로그램을 빠르게 만들어나갈 수 있다.
파이썬에서의 객체지향 프로그래밍
파이썬에서는 모든 것이 객체다. 정수도, 문자열도, 리스트도 전부 다 객체이다. 사실 우리가 시퀀스의 길이를 구할 때 자연스럽게 썼던 len()도 이런 객체 안에 정의되어 있던 메서드이다. 그렇기 때문에 가져와 쓸 수 있었던 것이다.
list = [1, 2, 3]
len(list) # 3
이렇게 클래스에 의하여 제공되는 메소드는 클래스의 '공용 인터페이스'라고 한다.
그런데 우리는 len() 메서드가 내부적으로 어떻게 동작하는지에 대해서는 알지 못한다. 이 메서드를 사용하려고 할 때 그 내부의 내용까지 알 필요가 없다. 잘 만들어진 이 공용 인터페이스가 무슨 역할을 하는지, 어떻게 사용하는지만 알면 되고 그냥 가져다 쓰면 되는 것이다. 이렇게 공용 인터페이스만 제공하고 구현 세부사항을 감추는 것을 캡슐화(encapsulation)라고 한다.
예를 들어, 은행 계좌에서 잔액을 외부에서 직접 변경하지 못하게 하고, 입금이나 출금이라는 동작을 통해서만 잔액을 수정할 수 있게 하는 것도 캡슐화라고 할 수 있다. 이렇게 하면 잔액이 잘못되거나 부정하게 변경되는 것을 방지할 수 있어.
정리
객체지향 프로그래밍은 코드의 재사용성과 유지보수성을 높여주고 복잡한 문제를 효율적으로 해결할 수 있게 해 준다.
파이썬에서 클래스를 활용한 객체지향을 구현하는 방법은 다음 포스트에서 이어서 다루도록 하겠다.
'Language > Python' 카테고리의 다른 글
[Python] 파이썬 정보 은닉 개념 이해하기 (0) | 2025.01.21 |
---|---|
[Python] 파이썬 클래스와 생성자 사용하여 객체 생성하기 (0) | 2025.01.21 |
[Python] 파이썬의 언패킹 연산자 (0) | 2025.01.20 |
[Python] 파이썬 딕셔너리(dictionary) 이해하기 (0) | 2025.01.18 |
[Python] 파이썬 세트(set) 자료구조 이해하기 (0) | 2025.01.18 |