객체지향 프로그래밍(OOP)이란? 개념, 특징, 장점 총정리
객체지향 프로그래밍의 정의와 특징, 장단점을 한눈에 정리한 가이드입니다.
객체가 서로 메시지를 주고받으며 협력하도록 설계‧구현하는 프로그래밍 패러다임입니다. “데이터 + 행위”를 하나로 묶어 응집도를 높이고, 필요한 곳만 노출해 결합도를 낮추는 것이 핵심이죠.
객체지향이란?
객체(Object)는 상태(State), 행동(Behavior), 그리고 다른 객체와 구분되는 식별자(Identity)를 가진 독립적인 단위입니다. 클래스(class
)는 설계도이고, 그 설계도로부터 메모리 위에 실체화된 인스턴스가 바로 객체입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// 클래스(설계도)
public class Cat {
// 상태(State)
private String name;
private int age;
// 생성자(Constructor)
public Cat(String name, int age) {
this.name = name;
this.age = age;
}
// 행동(Behavior)
public void cry() {
System.out.println("냐옹");
}
public void eat(String food) {
System.out.println(food + "를 먹었다!!");
}
// Getter / Setter (캡슐화)
public String getName() { return name; }
public int getAge() { return age; }
public void setName(String name) { this.name = name; }
public void setAge(int age) { this.age = age; }
}
// 객체(인스턴스)
public class Main {
public static void main(String[] args) {
Cat cat1 = new Cat("나비", 2); // 객체 생성
cat1.cry(); // 메시지 전달
cat1.eat("참치"); // 협력
}
}
위 코드에서 Cat
은 설계도(클래스)이고, cat1
은 메모리에 생성된 객체입니다. 실제 프로덕션 코드에서는 각 객체가 분명한 책임을 가지고 서로 협력해 시스템을 완성합니다.
절차지향 vs 객체지향
| 구분 | 절차지향(Procedural) | 객체지향(Object-Oriented) | | ————— | ——————– | ————————- | | 중심 개념 | 함수(절차) | 객체(데이터 + 행위) | | 데이터 접근 | 전역 데이터 공유 | 캡슐화로 은닉 | | 재사용 방법 | 함수 라이브러리 | 클래스, 상속, 조합 | | 확장성 | 기존 코드 수정 | 새로운 객체 추가 | | 적합한 규모 | 작은·단순한 프로그램 | 복잡한 비즈니스 도메인 |
장점과 단점
장점
유지보수성: 책임이 잘 분리되어 버그 수정·기능 추가가 용이합니다.
재사용성: 상속·조합으로 구현 코드를 손쉽게 재활용할 수 있습니다.
확장성: 새로운 요구 사항이 생겨도 객체를 확장·추가하여 수용하기 쉽습니다.
협업 효율: 역할·모듈이 명확해 팀 단위 개발에 유리합니다.
단점
학습 비용: 절차지향보다 설계 개념이 복잡해 러닝 커브가 있습니다.
성능 오버헤드: 메서드 호출, 객체 생성 비용이 존재해 실시간·임베디드에서 주의가 필요합니다.
- 과도한 설계: 작은 프로젝트에서 지나친 OOP 설계는 오히려 개발 속도를 늦출 수 있습니다.
언제 OOP를 선택할까?
도메인이 복잡해서 개념 모델링이 중요한 경우
변경·확장이 잦은 장기 프로젝트
- 협업 규모가 커서 역할 분담이 명확해야 하는 경우
반대로 계산 로직만 필요한 간단한 스크립트, 풋풋한 단일 기능 툴처럼 작고 수명이 짧은 프로그램은 절차지향·함수형이 더 빠르고 단순할 수 있습니다.
마무리
객체지향은 무조건 옳은 만능 열쇠가 아닙니다. 하지만 복잡한 문제를 사람 중심 사고로 해석할 수 있게 해 주는 강력한 도구이죠. 상황에 맞춰 OOP의 힘을 끌어내고, 필요하다면 절차지향·함수형 기법과 혼용해 유연한 소프트웨어를 만들어 보세요.