객체 지향 프로그래밍(OOP)은 객체(Object)와 클래스(Class)를 기반으로 프로그램을 설계하고 구현하는 프로그래밍 패러다임입니다.
데이터(필드)와 동작(메서드)을 하나의 객체로 묶어 재사용성과 유지보수성을 향상시키는 것이 핵심입니다.
📌 객체(Object): 데이터 + 동작(메서드)을 포함하는 단위
📌 클래스(Class): 객체를 생성하기 위한 설계도
✅ OOP의 핵심 개념:
✔ 캡슐화(Encapsulation)
✔ 상속(Inheritance)
✔ 다형성(Polymorphism)
✔ 추상화(Abstraction)
📌 캡슐화(Encapsulation)는 객체의 데이터(필드)를 외부에서 직접 접근하지 못하도록 숨기고, 메서드를 통해서만 접근할 수 있도록 하는 개념입니다.
✅ 장점
✔ 데이터 보호 (정보 은닉, Information Hiding)
✔ 코드 수정 최소화 (유지보수성 향상)
📌 캡슐화 예제 (Java)
class Person {
private String name; // private 필드 (외부 접근 불가)
// Getter (데이터 읽기)
public String getName() {
return name;
}
// Setter (데이터 변경)
public void setName(String name) {
this.name = name;
}
}
📌 외부에서는 setName()
, getName()
을 통해서만 name 값을 변경하고 읽을 수 있음.
📌 상속(Inheritance)은 기존 클래스를 확장하여 새로운 클래스를 만드는 개념입니다.
즉, 부모 클래스(슈퍼 클래스)의 속성과 메서드를 자식 클래스(서브 클래스)가 물려받아 재사용할 수 있습니다.
✅ 장점
✔ 코드 재사용성 증가
✔ 유지보수 용이
📌 상속 예제 (Java)
// 부모 클래스
class Animal {
void sound() {
System.out.println("동물이 소리를 냅니다.");
}
}
// 자식 클래스 (Animal 상속)
class Dog extends Animal {
void bark() {
System.out.println("멍멍!");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.sound(); // 부모 클래스의 메서드 호출 가능
dog.bark(); // 자식 클래스의 메서드 호출
}
}
📌 Dog 클래스는 Animal 클래스를 상속받아 sound()
메서드를 그대로 사용 가능.
📌 다형성(Polymorphism)은 같은 인터페이스나 부모 클래스를 공유하는 객체들이 서로 다른 동작을 할 수 있도록 하는 개념입니다.
✅ 장점
✔ 코드의 유연성 증가
✔ 확장성과 유지보수성 향상
📌 다형성 예제 (Java)
class Animal {
void makeSound() {
System.out.println("동물 소리");
}
}
class Dog extends Animal {
void makeSound() {
System.out.println("멍멍!");
}
}
class Cat extends Animal {
void makeSound() {
System.out.println("야옹!");
}
}
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
Animal myCat = new Cat();
myDog.makeSound(); // 멍멍!
myCat.makeSound(); // 야옹!
}
}
📌 makeSound()
메서드는 같은 메서드지만, 객체 타입에 따라 다르게 동작함.
📌 추상화(Abstraction)는 불필요한 세부 사항을 숨기고, 핵심적인 기능만을 제공하는 개념입니다.
즉, 인터페이스(interface)나 추상 클래스(abstract class)를 사용하여 객체의 동작을 정의합니다.
✅ 장점
✔ 코드의 복잡성을 줄이고, 유지보수성을 높임
✔ 설계 단계에서 공통적인 기능을 정의 가능
📌 추상 클래스 예제 (Java)
abstract class Animal {
abstract void makeSound(); // 추상 메서드 (구현 X)
}
class Dog extends Animal {
void makeSound() {
System.out.println("멍멍!");
}
}
public class Main {
public static void main(String[] args) {
Animal dog = new Dog();
dog.makeSound(); // 멍멍!
}
}
📌 추상 클래스 Animal
을 상속한 Dog
클래스에서 makeSound()
구현을 강제함.
✔ 코드 재사용성 증가 → 상속을 통해 기존 코드를 재사용 가능
✔ 유지보수성 향상 → 코드 변경 시 영향 범위 최소화
✔ 유연성과 확장성 증가 → 다형성을 활용하여 코드 변경 없이 새로운 기능 추가 가능
✔ 캡슐화로 데이터 보호 → 외부에서 객체의 데이터를 직접 변경할 수 없음
❌ 초기 설계 비용이 큼 → 클래스와 객체 간 관계를 고려해야 함
❌ 과도한 상속 사용 시 복잡성 증가 → 다중 상속 문제 발생 가능
❌ 실행 속도가 상대적으로 느릴 수 있음 → FP(함수형 프로그래밍)보다 성능이 낮을 수도 있음
비교 항목 | 객체 지향 프로그래밍(OOP) | 함수형 프로그래밍(FP) |
---|---|---|
중심 개념 | 객체(Object), 클래스(Class) | 함수(Function), 표현식(Expression) |
상태 변경 | 변경 가능 (Mutable State) | 불변성 유지 (Immutable State) |
코드 스타일 | 명령형 (Imperative) | 선언형 (Declarative) |
부작용 | 있음 (Side Effect 발생) | 없음 (순수 함수 사용) |
병렬 처리 | 어렵고 동기화 필요 | 쉬움 (Immutable 데이터) |
📌 OOP는 상태 중심, FP는 데이터 변환 중심!
📌 최근에는 "함수형 스타일 + 객체지향" 혼합 방식 사용이 많아짐!
✅ 웹 애플리케이션 개발 → Java, Python, C++ 기반 웹 서비스 (Spring, Django, Flask)
✅ 모바일 앱 개발 → Android(Java, Kotlin), iOS(Swift)
✅ 게임 개발 → Unity(C#), Unreal Engine(C++)
✅ 데스크톱 애플리케이션 개발 → Java Swing, .NET (C#)
✅ 엔터프라이즈 소프트웨어 → 은행, 금융, ERP 시스템
✅ 객체 지향 프로그래밍(OOP)은 "클래스 + 객체"를 기반으로 유지보수성과 재사용성을 높이는 프로그래밍 방식
✅ 캡슐화, 상속, 다형성, 추상화 등의 개념을 활용하여 효율적인 코드 구조 설계 가능
✅ 대규모 소프트웨어, 웹 애플리케이션, 게임 개발 등 다양한 분야에서 널리 사용됨
✅ 최근에는 함수형 프로그래밍(FP)과 OOP를 혼합하여 개발하는 방식도 많이 활용됨
**OOP를 활용하면 확장성과 유지보수성이 뛰어난 소프트웨어를 만들 수 있습니다!
추가 학습 자료