객체지향프로그래밍(OOP)의 핵심 특징 4가지 완벽 정리
✨ 개요
객체지향프로그래밍(OOP: Object-Oriented Programming)은 복잡한 문제를 객체 단위로 나누어 해결하는 효율적이고 유지보수하기 쉬운 소프트웨어 설계 방식입니다.
Java, Kotlin, Swift, C++, Python 등 다양한 언어에서 채택하며 실무에서도 가장 많이 쓰이는 패러다임입니다.
1. ✅ 캡슐화 (Encapsulation)
- 데이터와 동작을 하나의 객체로 묶고, 외부에 필요한 인터페이스만 제공
- 내부 구현을 숨기고(
private
) 필요한 부분만 열어둠(getter/setter
) - 코드의 안정성을 높이고 외부에서 잘못된 변경을 막기 위함
class User {
private var age: Int = 0
fun setAge(value: Int) {
if (value >= 0) age = value
}
fun getAge(): Int = age
}
2. ✅ 상속 (Inheritance)
- 기존 클래스를 확장해서 새로운 클래스를 생성
- 코드 재사용성 증가, 계층적 구조 설계 가능
- 코드의 중복을 막고 불필요한 코드 생산을 막음 그리고 기능을 확장성 있게 구현
open class Animal(val name: String) {
open fun speak() = println("$name makes a sound")
}
class Dog(name: String) : Animal(name) {
override fun speak() = println("$name barks")
}
3 ✅. 다형성 (Polymorphism)
- 동일한 이름의 함수가 객체 타입에 따라 다른 동작을 수행
- 유연한 설계 가능, 추상화와 함께 활용
- 다형성 방식으로 메소드 오버라이팅/오버로딩/제네릭/서브타입
val animals = listOf(Animal("Fox"), Dog("Buddy"))
animals.forEach { it.speak() }
// 출력: Fox makes a sound, Buddy barks
4 ✅. 추상화 (Abstraction)
- 공통된 기능을 추출해 인터페이스나 추상 클래스로 정의
- 구체적인 동작은 각 클래스에 위임
- 추상화는 ‘복잡성을 줄이고 유연함을 높이기 위해’ 사용
- 공통점만 뽑아서 정의하면 여러 클래스가 이를 기반으로 동작 가능 → 유지보수, 확장성 증가
- 코드 중복을 줄이고, 변경에 강한 설계를 할 수 있음
- 인터페이스나 추상 클래스를 통해 “어떻게”보다는 “무엇을” 할 것인지에 집중하게 됨
interface Animal {
fun speak()
}
class Cat : Animal {
override fun speak() = println("Meow")
}
5.🧠 요약비교
특징 | 설명 | Kotlin 예시 키워드 |
---|---|---|
캡슐화 | 내부 구현 숨기고 외부에는 메서드만 노출 | private , getter/setter |
상속 | 부모 클래스의 속성과 메서드 상속받아 재사용 | open , override , : |
다형성 | 동일한 함수가 객체에 따라 다르게 동작 | override , interface , abstract |
추상화 | 공통 인터페이스 정의 후 구체적 구현은 하위 클래스에 위임 | interface , abstract class |
6.🧠 결론
- OOP는 초급 개발자에게도 현실 세계의 사고방식으로 접근 가능한 설계 방식
- 중·대형 앱이나 협업이 필요한 프로젝트에서 반드시 알아야 할 핵심 개념.