JAVA

[JAVA] 객체 지향 프로그래밍의 정의와 특징

tudamoa 2025. 8. 13. 20:26

📌 객체 지향 프로그래밍(OOP) 탄생 배경과 기본 개념

1️⃣ 객체 지향 프로그래밍은 왜 생겼을까?

과거 대부분의 프로그래밍은 절차지향 프로그래밍(Procedural Programming) 방식이었다.

절차 지향 프로그래밍은 어떤 일을 처리하는 순서를 중심으로 코드를 작성하는 방식이다.

 

하지만 소프트웨어가 커지면서 변경도 잦고 복잡도도 높아지게 되었다.

절차지향(Procedural) 방식은 순서 중심이라 작은 요구 변경도 여러 곳의 연쇄 수정을 부르고,
데이터와 이를 다루는 로직이 분리되어 있어 일관성 유지가 어렵다.

 

✅ 절차지향의 특징

  • 순차적 처리에 강하다.
  • 데이터(상태)와 함수(메서드)가 서로 분리되어 있다.

❌ 절차지향의 한계

  • 순서 의존성이 크기 때문에 중간 단계에서 추가나 수정 시 연쇄적으로 수정해야 하는 경우가 많다.
  • 여러 함수가 공유 상태를 직접 변경하기 때문에 건드리지 말아야 할 곳이 변경되기 쉽다.
  • 코드가 길어지면 중복/누락이 증가하고 디버그가 쉽지 않다.
  • 결과적으로 유지보수 비용이 커진다.

 

👉이러한 한계를 해결하기 위해 탄생한 것이 객체 지향 프로그래밍(Object-Oriented Programming)이다.


2️⃣ 객체지향 프로그래밍에서 객체(Object)란 무엇일까?

 

프로그래밍에서 자동차를 구현한다고 하면
자동차의 색상, 브랜드 등을 정의하는 상태를 정의해야 하고, 자동차가 감속하고 가속하는 행동을 정의하는 함수가 필요할 것이다.

이때 절차지향 프로그래밍은 상태함수를 따로 구현하지만, 객체지향 프로그래밍은 "자동차" 자체를 하나로 구현한다.

 

이렇게 그 자체를 하나로 보고 구현해 놓은 틀이 바로 객체이다.

객체 = 상태(데이터)와 행동(함수)을 한 단위로 캡슐화하고, 필요하면 스스로의 규칙을 유지하는 실행 단위.
우리가 아는 모든 사물, 현상은 상태 + 행동을 가지고 있다.

예시 상태(필드) 행동(메서드) + 규칙 (선택)
계좌 계좌번호, 잔액 입금, 출금, 잔액 잔액은 음수가 될 수 없다.
주문 주문번호, 항목, 주문상태 항목 추가/삭제, 결제, 취소 결제 완료 후에는 취소할 수 없다.
장바구니 품목, 수량, 총액 담기, 빼기, 총 가격 수량은 0 미만일 수 없다.
자동차 색상, 연료량, 브랜드 가속, 감속, 방향 전환 속도는 음수일 수 없다.

✅프로그래밍에서 객체는 현실의 사물, 현상같은 개념을 코드로 모델링한 단위이다.

✅객체로 잘 분리하면 코드의 가독성이 증가하고 유지보수 비용을 낮출 수 있다.


3️⃣ 객체지향 프로그래밍(OOP)

OOP는 상태·행동을 하나의 객체로 구현하고 객체들 간의 상호작용을 통해 프로그래밍하는 방법론이다.

 

대표적인 객체지향 언어는 Java, Python, C++, Kotlin 등이 있다.

✅객체지향 프로그래밍의 장점

  • 응집도↑: 관련된 것들을 한곳에 모아 어디를 고칠지가 명확
  • 결합도↓: 객체 간에는 인터페이스로 느슨하게 연결
  • 유지보수성↑: 작은 변경이 작은 범위의 수정으로 끝남
  • 재사용성↑: 객체 자체가 하나의 프로그램임

📍 객체지향 언어 4가지 특징

1️⃣ 캡슐화 (Encapsulation)

✅ 정의

  • 상태(필드)와 행동(메서드)을 한 단위로 묶고 내부 구현을 숨겨 외부에서는 내부 구조나 처리 과정을 알 수 없도록 보호하는 것

📌왜 필요한가

  • 필요한 정보만 공개하여 보안 유지
  • 외부에서 내부 상태를 임의로 바꾸지 못하도록 하여 일관성 보장
  • 민감한 부분은 가리기 때문에 변경 시 영향을 최소화하여 유지보수성 향상

📌Java에서 구현방법

  • 정보 은닉: private로 필드 감추어 외부에서의 직접적인 접근 차단
  • Getter/Setter로 내부 데이터에 제한적 접근
  • 접근 제어자(public, protected, private)로 범위 설정
public class Account {
    private int balance; // 외부 접근 제한

    public int getBalance() { // balance에 데이터를 읽고 쓰기위해 getter 메서드 생성
        return balance;
    }

    public void deposit(int amount) {
        if(amount > 0) balance += amount;
    }
}

 

 

2️⃣ 상속 (Inheritance)

✅ 정의

  • 기존 클래스(부모)의 필드와 메서드를 다른 클래스(자식)가 물려받아 재사용하는 것.

📌왜 필요한가

  • 코드 재사용성 향상 → 중복 제거
  • 계층 구조 설계 가능 → 확장성 향상
  • 공통 기능을 한 곳에서 관리 가능

📌Java에서 구현방법

  • extends 키워드 사용
  • 부모 클래스의 멤버를 자식 클래스가 그대로 사용 가능
  • 필요에 따라 오버라이딩(Overriding) 가능
class Vehicle {
    void move() { System.out.println("이동 중"); }
}

class Car extends Vehicle {
    void honk() { System.out.println("비켜"); }
}

// 상속 활용
Car car = new Car();
car.move(); // 부모 메서드 사용
car.honk();

 

3️⃣ 다형성 (Polymorphism)

✅ 정의

  • 하나의 인터페이스나 메서드가 상황(객체 타입)에 따라 다른 동작을 하는 것.

📌왜 필요한가

  • 코드 유연성 향상
  • 같은 코드로 다양한 객체 제어 가능
  • 유지보수와 확장성에 유리

📌Java에서 구현방법

  • 오버로딩(Overloading): 같은 이름, 다른 매개변수 (컴파일 시 결정)
  • 오버라이딩(Overriding): 부모 메서드 재정의 (실행 시 결정)
  • 부모 타입 참조 변수로 자식 객체 다루기
class Animal {
    void sound() { System.out.println("소리"); }
}

class Dog extends Animal {
    @Override // 입맛에 맞게 메서드를 변형시킴
    void sound() { System.out.println("멍멍"); }
}

class Cat extends Animal {
    @Override
    void sound() { System.out.println("야옹"); }
}

Animal a1 = new Dog();
Animal a2 = new Cat();
a1.sound(); // 멍멍
a2.sound(); // 야옹

 

4️⃣ 추상화 (Abstraction)

✅ 정의

  • 객체의 핵심적인 속성과 공통적인 기능을 추출하여 새로 정의하는 것
  • ex. window, mac ➡ 운영체제 / 택시, 버스  ➡ 대중교통

📌왜 필요한가

  • 복잡한 시스템을 단순화
  • 공통된 설계로 다양한 구현 가능
  • 변경에 강한 구조 설계

📌Java에서 구현방법

  • 추상 클래스(abstract class)
  • 인터페이스(interface)
  • 공통 기능만 정의, 세부 구현은 하위 클래스에서
abstract class Shape {
    abstract void draw(); // 추상 클래스에선 "그린다"라는 추상적인 행위만 정의 
}

class Circle extends Shape {
    @Override
    void draw() { // 상속을 받아 어떤 것을 그릴지 구체적인 정의
        System.out.println("원을 그린다.");
    }
}

Shape s = new Circle();
s.draw(); // 원을 그린다.

 

 

 

 

reference

https://jja2han.tistory.com/330

'JAVA' 카테고리의 다른 글

[Java] equals 재정의 할 때 HashCode도 재정의 해야 하는 이유  (0) 2025.07.16
[JAVA] 예외(Exception) 정리  (1) 2025.06.01
[JAVA] ORM 이란?  (0) 2025.05.31
[JAVA] JDBC 정리  (0) 2025.05.27
[JAVA] 스레드(Thread) 정리  (0) 2025.03.01