Java

[Java] 객체지향 프로그래밍이란?

kittity 2025. 3. 27. 22:55

목차

  1. 객체지향 프로그래밍이란?
  2. 객체지향의 특징
  3. 절차지향 vs 객체지향
  4. 객체지향 설계의 핵심 원칙

 

1. 객체지향 프로그래밍이란?

객체지향 프로그래밍(OOP)은 실세계의 사물을 객체로 모델링하여 개발하는 프로그래밍 기법이다. Java가 대표적인 객체지향 언어지만, Python, C++, C#도 객체지향 패러다임을 지원한다. 객체지향의 핵심은 역할, 책임, 협력의 개념이다.

  • 역할: 각 객체는 시스템 내에서 특정 역할을 맡는다.
  • 책임: 객체는 자신이 맡은 역할에 따른 책임을 가진다.
  • 협력: 여러 객체가 서로 메시지를 주고받으며 협력한다.

예를 들어, 온라인 쇼핑몰 시스템에서 '주문' 객체는 주문 정보를 관리하는 역할을 하며, 주문 상태 변경에 대한 책임을 가지고, '결제' 객체와 협력하여 전체 주문 프로세스를 완성한다.

 

2. 객체지향의 특징

추상화 (Abstraction)

추상화는 복잡한 현실에서 필요한 부분만 추출하는 과정이다.

// 추상화 예시
public abstract class 자동차 {
    protected int 속도;

    public abstract void 가속();
    public abstract void 감속();
}

예를 들어 결제 시스템에서 결제 인터페이스를 정의하고 카드결제, 계좌이체 등 구체적인 클래스들이 이를 구현하게 만들 수 있다.

 

상속 (Inheritance)

상속은 부모 클래스의 특성을 자식 클래스가 물려받는 것이다.

public class 스포츠카 extends 자동차 {
    private boolean 터보모드 = false;

    @Override
    public void 가속() {
        if(터보모드) 속도 += 30;
        else 속도 += 10;
    }

    @Override
    public void 감속() {
        속도 -= 10;
    }
}

상속은 "IS-A" 관계가 명확할 때만 사용하고, 그렇지 않다면 “HAS-A” 고려하자.

 

다형성 (Polymorphism)

다형성은 하나의 인터페이스나 메서드가 다양한 형태로 동작하는 능력이다.

자동차 차1 = new 스포츠카();
자동차 차2 = new SUV();

// 같은 메소드 호출이지만 다르게 동작1.가속();  // 스포츠카의 가속 메소드 실행2.가속();  // SUV의 가속 메소드 실행

이 특성을 활용해 코드 변경 없이 기능을 확장할 수 있다. 예를 들어 새로운 결제 방식이 추가되어도 기존 코드를 수정할 필요가 없다.

 

캡슐화 (Encapsulation)

캡슐화는 데이터와 해당 데이터를 처리하는 메서드를 하나로 묶고, 외부로부터 직접 접근을 제한하는 것이다.

public class 계좌 {
    private int 잔액;  // private으로 외부 접근 차단

    public void 입금(int 금액) {
        if(금액 > 0) 잔액 += 금액;
    }

    public boolean 출금(int 금액) {
        if(잔액 >= 금액) {
            잔액 -= 금액;
            return true;
        }
        return false;
    }
}

캡슐화를 통해 객체의 내부 상태를 보호하고, 잘못된 사용을 방지할 수 있다.

 

3. 절차지향 vs 객체지향

객체지향은 프로그램을 상호작용하는 객체들의 집합으로 바라본다면, 절차지향은 순차적인 처리를 중요시하는 프로그래밍 기법으로 C언어가 대표적이다. 프로그램의 실행 순서와 흐름이 중요하며, 이 순서가 바뀌면 동일한 결과를 보장할 수 없다.

// 절차지향 예시
void process_payment(Payment* payment) {
    validate_payment(payment);
    update_account_balance(payment->account_id, payment->amount);
    generate_receipt(payment);
    send_notification(payment->user_id);
}

 

4. 객체지향 설계의 핵심 원칙

SOLID 원칙

  1. 단일 책임 원칙(SRP): 클래스는 하나의 책임만 가져야 한다.
  2. 개방-폐쇄 원칙(OCP): 확장에는 열려있고, 수정에는 닫혀있어야 한다.
  3. 리스코프 치환 원칙(LSP): 자식 클래스는 부모 클래스를 대체할 수 있어야 한다.
  4. 인터페이스 분리 원칙(ISP): 인터페이스는 클라이언트에 특화되어야 한다.
  5. 의존성 역전 원칙(DIP): 구체화가 아닌 추상화에 의존해야 한다.

 

 

객체지향 프로그래밍은 단순한 코딩 방식이 아니라 문제를 바라보는 관점의 전환이다. 실세계의 개념을 그대로 코드로 옮기면서 개발자와 사용자 간의 인지적 거리를 줄여준다. 객체지향 패러다임을 제대로 이해하고 적용한다면, 유지보수가 용이하고 확장성 높은 소프트웨어를 개발할 수 있다.

728x90

'Java' 카테고리의 다른 글

[Java] Checked Exception과 Unchecked Exception  (0) 2025.03.06
[Java] 비동기 처리를 위한 CompletableFuture 완벽 가이드  (0) 2025.03.06
[Java] Java 21 특징  (0) 2025.01.31
[Java] Java 17 특징  (1) 2025.01.30
[Java] Java 11 특징  (0) 2025.01.30