프로그래밍에는 크게 절차 지향(Procedural)과 객체 지향(Object-Oriented) 두 가지 방식이 있다.
자바는 태생부터 객체 지향 언어이며, 실무 대부분의 프로젝트는 객체 지향적인 사고와 설계 위에서 돌아간다.
이번 글에서는 절차 지향과 객체 지향의 차이를 비교하고, 실제 예제를 통해 객체 지향 프로그래밍을 이해해보겠다.
절차 지향 vs 객체 지향
- 절차 지향 (Procedural)
- 실행 순서를 중심으로 프로그래밍한다. (어떻게에 초점)
- 데이터와 기능이 분리된다.
- 예: C 언어 스타일
- 객체 지향 (OOP)
- 객체 자체를 중심으로 프로그래밍한다. (무엇을에 초점)
- 데이터(속성)와 기능(메서드)을 하나의 단위(객체)에 묶는다.
- 예: Java, C++, C#
- 절차 지향에서는 데이터와 행동이 따로 존재하지만,
- 객체 지향에서는 데이터 + 메서드가 하나의 캡슐로 묶인다.
절차 지향 예제: 음악 플레이어
int volume = 0;
boolean isOn = false;
// 음악 플레이어 켜기
isOn = true;
System.out.println("음악 플레이어를 시작합니다");
// 볼륨 증가
volume++;
System.out.println("음악 플레이어 볼륨:" + volume);
- 실행 순서에 따라 작성된 전형적인 절차 지향 코드이다.
- 데이터(volume, isOn)와 기능(출력, 증가)이 분리되어 있다.
점진적 개선: 데이터 묶음 → 메서드 추출
데이터 묶기
class MusicPlayerData {
int volume = 0;
boolean isOn = false;
}
- 음악 플레이어 관련 데이터를 한 클래스에 묶는다.
메서드 추출
static void volumeUp(MusicPlayerData data) {
data.volume++;
System.out.println("음악 플레이어 볼륨:" + data.volume);
}
- 기능별로 메서드를 분리해 모듈화한다.
- 하지만 여전히 데이터와 기능이 따로 존재한다는 한계가 있다.
객체 지향 예제: 음악 플레이어
public class MusicPlayer {
int volume = 0;
boolean isOn = false;
void on() {
isOn = true;
System.out.println("음악 플레이어를 시작합니다");
}
void off() {
isOn = false;
System.out.println("음악 플레이어를 종료합니다");
}
void volumeUp() {
volume++;
System.out.println("음악 플레이어 볼륨:" + volume);
}
void volumeDown() {
volume--;
System.out.println("음악 플레이어 볼륨:" + volume);
}
void showStatus() {
System.out.println("음악 플레이어 상태 확인");
if (isOn) {
System.out.println("음악 플레이어 ON, 볼륨:" + volume);
} else {
System.out.println("음악 플레이어 OFF");
}
}
}
- 사용 예시
MusicPlayer player = new MusicPlayer();
player.on();
player.volumeUp();
player.showStatus();
player.off();
- 이제 데이터와 기능이 하나의 객체 안에 캡슐화되어 있다.
- 음악 플레이어라는 현실 개념을 그대로 코드로 옮겨온 것이다.
추가 예제: 직사각형 프로그램
절차 지향 방식
int width = 5, height = 8;
int area = width * height;
int perimeter = 2 * (width + height);
boolean square = (width == height);
객체 지향 방식
class Rectangle {
int width;
int height;
int calculateArea() {
return width * height;
}
int calculatePerimeter() {
return 2 * (width + height);
}
boolean isSquare() {
return width == height;
}
}
- 넓이, 둘레, 정사각형 여부 같은 기능이 Rectangle 객체 안으로 들어온다.
추가 예제: 계좌 프로그램
class Account {
int balance;
void deposit(int amount) {
balance += amount;
}
void withdraw(int amount) {
if (balance >= amount) {
balance -= amount;
} else {
System.out.println("잔액 부족");
}
}
}
- 사용 예시
Account account = new Account();
account.deposit(10000);
account.withdraw(9000);
account.withdraw(2000);
System.out.println("잔고: " + account.balance);
- 데이터(balance)와 기능(deposit, withdraw)이 객체에 함께 존재한다.
정리하자면...
- 객체 지향은 데이터(속성)와 기능(메서드)를 하나로 묶는 것
- 현실 세계의 사물을 그대로 모델링할 수 있음
- 절차 지향은 "어떻게" (순서 중심), 객체 지향은 "무엇을" (객체 중심)
- 유지보수성, 확장성, 코드 재사용성이 훨씬 좋아짐
객체지향은 앞으로 학습할 캡슐화, 상속, 다형성, 추상화의 기초가 되는 개념이다.
'java' 카테고리의 다른 글
| Java 패키지(Package) 정리 (0) | 2025.09.14 |
|---|---|
| Java 생성자(Constructor) 정리 (0) | 2025.09.14 |
| Java 기본형(Primitive) vs 참조형(Reference) 정리 (0) | 2025.09.14 |
| Java 클래스와 데이터 정리 (0) | 2025.09.11 |
| Java 메서드(Method) 정리 (0) | 2025.09.10 |