객체 지향 프로그래밍

프로그램을 거대한 한 편의 요리법이 아니라, 각자 역할을 맡은 레고 블록들의 모임으로 만드는 방식이에요.

정의 객체 지향 프로그래밍(Object-Oriented Programming, 줄여서 OOP)은 데이터와 그 데이터를 다루는 기능을 '객체(Object)'라는 작은 부품 단위로 묶어서 프로그램을 조립하듯 만드는 개발 방식이에요.

레고 블록으로 완성된 마을

벽돌 하나하나를 처음부터 차례대로 쌓아서 거대한 건물을 통째로 짓는다고 상상해 보세요. 중간에 벽 한쪽이 틀어지면 건물 전체가 흔들리고, 구조를 고치려면 공사를 처음부터 다시 해야 해요.

객체 지향 프로그래밍은 이런 불편을 줄이기 위해 프로그램을 여러 개의 독립된 레고 블록(객체) 으로 나누어 만드는 방식이에요. 예를 들어 자동차 레이싱 게임을 만든다면 자동차, 트랙, 날씨, 계기판을 각각 독립된 부품으로 따로 만들어요.

각 부품은 자신이 지닌 속성(데이터)과 할 수 있는 행동(기능)을 한 덩어리로 묶어서 관리해요. 바퀴 객체는 현재 회전 속도를 기억하고 회전하는 기능을 가지며, 엔진 객체는 마력을 기억하고 동력을 만들어내요. 이렇게 각자 맡은 역할을 하는 블록들을 조립해서 하나의 완성된 게임을 완성해요.

객체 지향 프로그래밍의 부품 조립 개념도 엔진 객체 핸들 객체 바퀴 객체 조립 완성된 자동차

객체를 단단하게 만드는 네 가지 기둥

객체 지향에는 설계를 돕는 네 가지 핵심 원리가 있어요. 첫째는 캡슐화로, 부품 내부의 복잡한 기계 장치는 알약 껍질처럼 감추고 겉에는 꼭 필요한 버튼만 노출하는 방법이에요. 리모컨 내부 회로를 몰라도 전원 버튼만 누르면 TV를 켤 수 있는 것과 같아요.

둘째는 상속이에요. 기본 자동차 설계도를 바탕으로 스포츠카나 트럭을 만들면, 바퀴나 핸들 같은 공통 기능은 그대로 물려받고 특별한 기능만 새로 덧붙여 만들 수 있어요. 덕분에 같은 코드를 두 번 작성할 필요가 없어져요.

셋째와 넷째는 다형성과 추상화예요. 다형성은 같은 명령이라도 객체에 따라 다르게 반응하는 성질이고, 추상화는 복잡한 현실에서 핵심적인 특징만 뽑아내는 기법이에요. 이 네 가지 원리 덕분에 프로그램의 일부를 수정하거나 새 기능을 추가하기가 훨씬 쉬워져요.

조금 더 정확히 말하면: 항상 만능은 아니에요

예전에는 컴퓨터에게 시킬 일을 위에서부터 순서대로 적어 내려가는 '절차 지향' 방식을 주로 썼어요. 요리책의 레시피처럼 순서가 명확한 작업에는 절차 지향이 직관적이고 실행 속도도 더 빠를 수 있어요.

반면 객체 지향은 프로그램 규모가 커지고 복잡해질 때 진가를 발휘해요. 부품 단위로 나누어 관리하므로 여러 개발자가 역할을 나누어 협업하기 좋고, 고장 난 부품만 쏙 빼서 고칠 수 있거든요. 다만 설계를 꼼꼼히 해야 해서 초반 준비 시간이 오래 걸리고, 단순한 프로그램에서는 오히려 구조가 지나치게 복잡해질 수 있어요.

그래서 현대 소프트웨어 개발에서는 객체 지향과 함수형 프로그래밍의 장점을 함께 섞어서 쓰는 경우가 많아요. 결국 핵심은 도구 자체가 아니라, 변화에 유연하고 읽기 쉬운 코드를 만드는 데 있어요.

🤔 흔한 오해

✕ 오해

객체 지향 프로그래밍은 현실 세계의 모든 사물을 컴퓨터에 똑같이 베끼는 것이다.

✓ 사실

현실을 그대로 복제하는 것이 아니라, 프로그램의 목적에 필요한 핵심 특징과 동작만 선별해(추상화) 새롭게 정의하는 방식이에요.

🧺 일상에서 만나요

1 롤플레잉 게임(RPG)에서 전사, 마법사 캐릭터는 기본 '캐릭터' 설계도의 기능을 물려받아 각자의 전용 스킬을 발휘해요.
2 스마트폰 화면의 버튼, 입력창, 알림창은 각각 독립된 UI 객체로 만들어져 사용자의 터치에 반응해요.
💡 그러니까 한마디로

데이터와 기능을 객체라는 부품으로 묶어 조립함으로써, 큰 프로그램을 쉽게 관리하고 재사용하는 개발 방식이에요.