객체지향 프로그래밍(OOP)은 AI 시대에 '꼭 알아야 하는거야?'라고 말할 수 있습니다. 하지만 그건 모르는 소리입니다.
OOP는 알파벳을 모르고 개발하겠다는 이야기와 같을 만큼 아주 기초중에 기초입니다.
객체지향 프로그래밍(OOP)의 핵심인 4대 요소(캡슐화, 추상화, 상속, 다형성)의 개념과 차이점을 다이어그램 및 Java 예제 코드로 정리합니다.
1. 객체지향 프로그래밍(OOP)이란?
객체지향 프로그래밍(Object-Oriented Programming, OOP)은 소프트웨어 프로그램을 '객체(Object)'들의 모임으로 구성하여 개발하는 프로그래밍 패러다임입니다. 데이터(변수)와 해당 데이터를 처리하는 동작(메서드)을 하나의 단위로 묶어 관리함으로써, 코드의 재사용성을 높이고 유지보수를 용이하게 만듭니다.
OOP를 제대로 이해하기 위해서는 핵심이 되는 4가지 기둥(Four Pillars)인 Encapsulation(캡슐화), Abstraction(추상화), Inheritance(상속), Polymorphism(다형성)을 명확히 파악해야 합니다.
2. OOP의 4대 핵심 요소 (Four Pillars)
2.1 캡슐화 (Encapsulation)
- 정의: 데이터(변수)와 기능(메서드)을 하나의 클래스로 묶고, 객체 내부의 직접적인 상태 접근을 제한하여 자신만의 상태를 스스로 제어하도록 만드는 공정입니다.
- 💡 핵심 목적: 정보 은닉(Data Hiding) 및 무분별한 데이터 수정 방지
public class Car {
// 1. private 접근 제어자를 통한 데이터 은닉
private String name;
// 2. Getter 메서드로 데이터 제공
public String getName() {
return name;
}
// 3. Setter 메서드로 안전한 데이터 변경
public void setName(String name) {
this.name = name;
}
}
2.2 추상화 (Abstraction)
- 정의: 복잡한 내부 구현 세부사항은 숨기고, 사용자에게 필요한 핵심 기능(인터페이스)만을 외부에 노출하는 공정입니다.
- 💡 핵심 목적: 시스템 복잡도 감소 및 세부 구현 의존도 낮춤
// 추상 클래스 정의: 멈추는 기능(stop)의 틀만 정의
public abstract class Car {
public abstract void stop();
}
// 구체 클래스(Concrete class): 실제 멈추는 메커니즘을 구현
public class Honda extends Car {
@Override
public void stop() {
System.out.println("Honda::Stop");
System.out.println("Mechanism to stop the car using break");
}
}
2.3 상속 (Inheritance)
- 정의: 한 클래스(자식 클래스)가 다른 클래스(부모 클래스)의 속성과 메서드를 물려받아 사용하는 개념입니다. 객체 간의 IS-A 관계를 표현합니다.
- 💡 핵심 목적: 코드 재사용성 증대 및 계층적 확장 구조 구축
// 부모 클래스 (Base Class)
class Vehicle {
protected String brand;
public Vehicle(String brand) {
this.brand = brand;
}
public String describe() {
return "This is a vehicle of brand: " + brand;
}
}
// 자식 클래스 (Derived Class) - Vehicle을 상속
class Car extends Vehicle {
private int doors;
public Car(String brand, int doors) {
super(brand); // 부모 생성자 호출
this.doors = doors;
}
@Override
public String describe() { // 메서드 오버라이딩
return "This is a car of brand: " + brand + " with " + doors + " doors.";
}
}
2.4 다형성 (Polymorphism)
- 정의: 하나의 기호나 인터페이스가 다양한 형태나 동작으로 해석될 수 있는 능력입니다. 동일한 상속 체계 내의 객체들은 에러 없이 서로 교체되어 사용될 수 있습니다.
- 💡 유형: Compile-Time 다형성 (오버로딩) & Run-Time 다형성 (오버라이딩)
// 정의 (Definition)
class Vehicle {
public void start() {
System.out.println("The vehicle starts.");
}
}
class Car extends Vehicle {
@Override
public void start() {
System.out.println("The car starts with a key.");
}
}
// 사용 (Usage)
Vehicle myVehicle; // 부모 타입 참조 변수 선언
myVehicle = new Car(); // 자식 객체(Car) 할당 (Upcasting)
myVehicle.start(); // "The car starts with a key." 출력 (다형적 실행)
3. 한눈에 보는 OOP 4대 요소 비교표
| 개념 (Pillar) | 핵심 키워드 | 주요 역할 및 비유 |
| 캡슐화 | Private, Getter/Setter, 정보 은닉 | 캡슐 약처럼 내부 약재는 감추고 안전한 포장재만 제공 |
| 추상화 | Abstract, Interface, 세부 감추기 | 엔진 구조 몰라도 핸들과 페달로 운전 가능 |
| 상속 | Extends, IS-A 관계, 재사용 | 탈것(Vehicle)의 공통 특징을 승용차, 버스가 물려받음 |
| 다형성 | Overriding, Upcasting, 유연성 | '시동을 걸다' 명령에 차/오토바이가 각자 다르게 동작 |
4. 자주 묻는 질문 (FAQ)
Q1. 캡슐화(Encapsulation)와 추상화(Abstraction)의 가장 큰 차이는 무엇인가요?
캡슐화는 "데이터 보호(Implementation privacy)"에 초점을 맞춰 변수를 private으로 감싸는 것이고, 추상화는 "복잡도 감소(Complexity reduction)"에 초점을 맞춰 내부 세부 로직을 심플한 인터페이스 뒤로 감추는 개념입니다.
Q2. 다형성을 활용했을 때의 가장 큰 장점은 무엇인가요?
부모 타입 참조 변수로 하위 객체들을 일관되게 다룰 수 있어, 새로운 객체가 추가되어도 기존 제어 코드를 수정할 필요 없는 결합도 낮은(Loosely Coupled) 코드를 만들 수 있습니다.
5. 맺음말
객체지향 프로그래밍의 4대 요소인 캡슐화, 추상화, 상속, 다형성은 독립된 개념이 아니라 서로 유기적으로 연결되어 고품질의 소프트웨어를 구축하는 기반이 됩니다.
실무 설계를 진행하거나 면접을 준비할 때 이 원칙들이 실제 코드에서 어떻게 동작하는지 정리해보시면 큰 도움이 될 것입니다.
Thanks
Hans
'IT' 카테고리의 다른 글
| 57. Netflix는 어떻게 초당 7만 5천 건의 이벤트를 카운팅할까? — Distributed Counter Abstraction 완전 분석 (0) | 2026.07.31 |
|---|---|
| 55. DORA 매트릭(Metric)이란? DevOps 성과를 측정하는 4가지 핵심 지표 (0) | 2026.07.31 |
| 54. 안전한 서비스를 위한 첫걸음: 개발자를 위한 이중 인증(2FA) 구현 가이드 및 모범 사례 (0) | 2026.07.18 |
| 53. [AI 개발 입문] LLM의 한계를 넘는 핵심 기술, RAG(검색 증강 생성) 완벽 이해하기 (0) | 2026.07.18 |
| 52. 실전 운영에서 마주하는 분산 시스템의 대가(Cost): 지연 시간과 파티션 허용 오차 (1) | 2026.07.18 |