객체지향 프로그래밍(OOP)의 4가지 핵심 원칙
객체지향 프로그래밍(Object-Oriented Programming, OOP)은 현실 세계의 객체 개념을 바탕으로 소프트웨어를 설계하는 방식이다.
객체지향에서는 코드의 재사용성과 유지보수성을 높이기 위해 여러 가지 개념을 사용하는데, 그중 가장 대표적인 4가지 원칙은 다음과 같다.
- 상속(Inheritance)
- 다형성(Polymorphism)
- 추상화(Abstraction)
- 캡슐화(Encapsulation)
이번 글에서는 각각의 개념이 왜 필요한지와 장단점까지 함께 정리해보려고 한다.
1. 상속(Inheritance)
상속은 부모 클래스의 속성과 메서드를 자식 클래스가 물려받아 사용할 수 있게 해주는 개념이다.
이를 통해 중복 코드를 줄이고 코드의 재사용성을 높일 수 있다.
예를 들어 여러 클래스에서 공통적으로 사용하는 기능이 있다면 부모 클래스에 정의하고, 자식 클래스들이 이를 상속받아 사용할 수 있다.
상속의 장점
- 코드 재사용 가능
- 중복 코드 감소
- 공통 로직 관리 용이
- 유지보수 편리
상속의 단점
하지만 상속 구조가 너무 깊어질 경우 다음과 같은 문제가 발생할 수 있다.
- 클래스 간 결합도가 증가
- 코드 흐름 파악이 어려워짐
- 부모 클래스 변경 시 자식 클래스 영향 발생
이러한 이유로 최근에는 무조건 상속을 사용하는 것보다 Composition(조합)을 선호하는 경우도 많다.
즉,
“가져다 쓰는 관계(has-a)”를 활용하여 유연한 구조를 만드는 방식이다.
언제 사용할까?
- 여러 클래스가 공통 기능을 공유해야 할 때
- 부모의 기능 대부분을 재사용하고 싶을 때
2. 다형성(Polymorphism)
다형성은 같은 메서드 호출이라도 객체에 따라 다른 동작을 수행할 수 있게 하는 개념이다.
즉,
“같은 인터페이스지만 동작은 다르게”
구현할 수 있도록 해준다.
다형성의 종류
1) 오버로딩(Overloading)
컴파일 시점의 다형성이다.
- 같은 메서드 이름 사용
- 매개변수(parameter)가 다름
예시:
print(String s)
print(int n)
2) 오버라이딩(Overriding)
실행 시점(Runtime)의 다형성이다.
부모 클래스나 인터페이스의 메서드를 자식 클래스에서 재정의하여 사용한다.
예시:
class Animal {
void sound() {}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("멍멍");
}
}
다형성의 장점
- 코드 확장 용이
- 객체 교체가 쉬움
- 유연한 설계 가능
- 객체지향 특징을 잘 살릴 수 있음
언제 사용할까?
- 같은 동작이 객체마다 다르게 동작해야 할 때
- 인터페이스 기반 설계를 할 때
3. 추상화(Abstraction)
추상화는 복잡한 내부 구현을 숨기고 필요한 기능만 외부에 제공하는 개념이다.
사용자는 내부 동작 원리를 몰라도 제공된 기능만으로 쉽게 객체를 사용할 수 있다.
주로 다음과 같은 방식으로 구현한다.
- 인터페이스(interface)
- 추상 클래스(Abstract Class)
추상화의 장점
- 복잡성 감소
- 유지보수성 향상
- 사용 방법 단순화
- 역할과 구현 분리 가능
예를 들어 자동차를 운전할 때 엔진 내부 구조를 몰라도 핸들과 페달만 사용하면 되는 것과 비슷하다.
언제 사용할까?
- 내부 구현을 감추고 싶을 때
- 공통 규격(인터페이스)을 정의하고 싶을 때
4. 캡슐화(Encapsulation)
캡슐화는 데이터와 메서드를 하나의 클래스 내부에 묶고, 필요한 정보만 외부에 공개하는 개념이다.
보통 접근 제어자(private, protected, public)를 활용하여 구현한다.
캡슐화의 목적
- 객체 내부 데이터 보호
- 외부의 잘못된 접근 방지
- 데이터 무결성 유지
예를 들어:
private int age;
처럼 외부에서 직접 수정하지 못하도록 막고,
getter/setter를 통해 안전하게 접근하도록 만들 수 있다.
캡슐화의 장점
- 데이터 보호 가능
- 객체 상태 관리 용이
- 유지보수성 향상
- 코드 안정성 증가
마무리
객체지향의 4가지 원칙은 단순히 암기하는 개념이 아니라, 유지보수성과 확장성을 높이기 위한 설계 철학에 가깝다.
특히 실제 개발에서는 다음과 같은 흐름으로 함께 사용된다.
- 상속 → 코드 재사용
- 다형성 → 유연한 확장
- 추상화 → 복잡성 감소
- 캡슐화 → 데이터 보호
결국 객체지향 프로그래밍의 핵심은
“변화에 유연한 코드를 만드는 것”이라고 볼 수 있다.
'개발 > 개념정리' 카테고리의 다른 글
| What is a primary key? What is a foreign key? (0) | 2026.05.23 |
|---|---|
| What is an index, and why do we use it? (0) | 2026.05.19 |
| Network - OSI 5계층 (1) | 2026.05.18 |
| 인증/인가 개념 정리 (0) | 2026.03.21 |
| 트랜잭션 (0) | 2026.03.19 |