Software Design

객체지향 프로그래밍(OOP)이란? 절차지향과 뭐가 다를까

프로그래밍 공부하다 보면 꼭 마주치는 말이 있어요.

이석우iOS Developer5분 읽기
객체지향 프로그래밍(OOP)이란? 절차지향과 뭐가 다를까 대표 이미지

객체지향 프로그래밍(OOP)이란? 절차지향과 뭐가 다를까

프로그래밍 공부하다 보면 꼭 마주치는 말이 있어요.

“이건 객체지향적으로 짜야 해.”

처음 들으면 참 막막한 말이죠. 절차지향은 또 뭐고, 객체지향은 뭐가 그렇게 다른 건지 감이 잘 안 옵니다.

결론부터 말씀드릴게요. 절차지향은 “무엇을 순서대로 할까”에 집중하고, 객체지향은 “누가 그 일을 책임질까”에 무게를 둡니다. 데이터와 그 데이터를 다루는 기능을 하나로 묶느냐, 따로 두느냐의 차이예요.

이 글에서는 둘의 차이를 커피 주문에 빗대서 쉽게 풀고, 실제 코드로 어떻게 달라지는지까지 보여드릴게요.

절차지향과 객체지향(OOP) 비교 인포그래픽, 왼쪽 1·2·3 단계 흐름과 오른쪽 데이터·함수 묶음 객체
둘을 나란히 놓고 보면 데이터를 다루는 방식부터 다릅니다

절차지향 프로그래밍은 요리 레시피예요

절차지향은 이름 그대로 “절차”, 그러니까 순서에 집중하는 방식이에요.

데이터가 있고 그걸 처리하는 함수들이 따로 있어요. 위에서 아래로 순서대로 흘러가죠.

요리 레시피를 떠올리면 딱 맞아요. 재료를 씻고 썰고 볶고 담는다. 이 순서를 그대로 코드로 옮긴 게 절차지향입니다.

간단한 계좌 예시로 볼게요.

var balance = 10000  // 데이터

func deposit(amount: Int) {   // 기능은 따로
    balance += amount
}

deposit(amount: 5000)
print(balance)
// 출력: 15000

balance라는 데이터가 밖에 노출돼 있고, deposit 함수가 그걸 직접 건드려요.

작은 프로그램에선 이게 오히려 간단하고 빨라요. 문제는 프로그램이 커질 때예요.

계좌가 100개로 늘고 잔액을 건드리는 함수가 여기저기 흩어지면 어디서 값이 바뀌었는지 추적하기가 정말 힘들어집니다.


객체지향 프로그래밍(OOP)이란 무엇일까요

객체지향은 데이터와 기능을 하나로 묶어요. 이 묶음을 “객체”라고 부릅니다.

계좌라면 “잔액”이라는 데이터와 “입금한다”는 기능을 한 덩어리로 만드는 거예요.

아까 그 계좌를 객체로 바꿔볼게요.

class Account {
    private var balance = 10000   // 데이터를 안으로 숨김

    func deposit(_ amount: Int) { // 기능도 같이
        balance += amount
    }
    func show() { print(balance) }
}

let myAccount = Account()
myAccount.deposit(5000)
myAccount.show()
// 출력: 15000

balance가 private으로 숨겨졌어요. 이제 외부에서 잔액을 마음대로 못 바꿉니다. 반드시 deposit 같은 정해진 통로로만 접근하죠.

이게 객체지향의 핵심이에요. 데이터를 보호하고 “누가 이 일을 책임지는지”를 명확하게 만드는 거죠.

커피 주문으로 비유하면 이래요. 절차지향은 내가 원두 갈고 물 끓이고 다 하는 거고, 객체지향은 “바리스타님, 아메리카노요”라고 맡기는 거예요. 어떻게 만드는지는 바리스타 객체가 알아서 책임집니다.


OOP의 4가지 핵심 특징

객체지향에는 네 가지 기둥이 있어요. 용어가 어렵지만 개념은 단순합니다.

  • 캡슐화: 데이터를 숨기고 정해진 통로로만 접근하게 함 (위의 private처럼요)
  • 상속: 기존 클래스의 기능을 물려받아 재사용
  • 다형성: 같은 명령이라도 객체마다 다르게 동작
  • 추상화: 복잡한 내부는 감추고 필요한 것만 노출

특히 다형성이 강력해요. “울어봐”라고 시키면 강아지는 멍멍, 고양이는 야옹 하는 것처럼요. 명령은 하나인데 객체마다 알아서 다르게 반응합니다.

Account 객체 하나가 잔액과 입금을 같이 책임집니다
Account 객체 하나가 잔액과 입금을 같이 책임집니다

언제 객체지향을 쓰고 언제 절차지향이 나을까

무조건 객체지향이 정답은 아니에요. 상황에 맞게 골라야 합니다.

상황 어울리는 방식
짧은 스크립트, 일회성 계산 절차지향
데이터 흐름이 단순하고 순차적 절차지향
규모가 크고 계속 커지는 프로젝트 객체지향
여러 명이 협업하는 코드 객체지향
비슷한 개념이 반복 등장 객체지향

작고 단순하면 절차지향이 오히려 깔끔하고, 크고 복잡하고 오래 유지할 코드라면 객체지향이 힘을 발휘합니다.

작으면 순서대로, 커지고 복잡해지면 책임별로 나누는 쪽이 편했어요
작으면 순서대로, 커지고 복잡해지면 책임별로 나누는 쪽이 편했어요

절차지향은 순서를 설계하고, 객체지향은 책임을 설계합니다.

면접에서는 이렇게 물어봅니다

Q. 절차지향과 객체지향의 가장 큰 차이는 무엇인가요? A. 데이터와 기능의 관계입니다. 절차지향은 데이터와 함수가 분리돼 순서 중심으로 흐르고, 객체지향은 둘을 객체로 묶어 책임 단위로 관리합니다. 그래서 규모가 커질수록 유지보수와 협업에 유리합니다.

Q. 캡슐화가 왜 중요한가요? A. 데이터를 외부에서 직접 못 바꾸게 막아 예상치 못한 변경을 줄여줍니다. 정해진 메서드로만 접근하니 버그 추적이 쉬워지고, 내부 구현을 바꿔도 외부 코드에 영향을 덜 줍니다.


용어가 거창해 보여도, 결국 핵심은 “데이터를 어떻게 다룰까” 하나예요.

작은 코드부터 객체로 묶는 연습을 해보시면 금방 감이 올 거예요. 오늘 배운 걸로 내 코드 한 조각만 리팩터링해보시길 응원할게요.

함께 보면 좋은 글