Kotlin/Kotlin 입문
[Kotlin] 8. 객체 지향 프로그래밍 (OOP)
JoonYong
2024. 10. 10. 16:58
1. 객체 지향 프로그래밍의 필요성
- 객체 지향 프로그래밍(OOP)은 코드의 재사용성과 유지 보수성을 향상시키기 위해 필요한 프로그래밍 패러다임입니다.
- OOP는 현실 세계의 개념을 클래스와 객체로 모델링하여 문제를 직관적으로 해결할 수 있도록 돕습니다.
- 코드의 중복을 줄이고, 프로그램의 확장성을 높여주는 주요한 특징을 가지고 있습니다.
2. 객체 지향 프로그래밍의 주요 개념
객체 지향 프로그래밍은 네 가지 주요한 특징으로 구성됩니다: 캡슐화, 상속, 다형성, 추상화.
1. 캡슐화 (Encapsulation)
- 캡슐화는 데이터를 보호하고, 외부에서 직접 접근할 수 없도록 은닉하는 개념입니다.
- 클래스 내부의 필드와 메서드를 캡슐화하여, 객체의 상태를 안전하게 유지할 수 있습니다.
- 예시)
- 접근 제어자 private, protected, public을 사용하여 접근 범위를 제한합니다.
class Car(private val brand: String, private val model: String) {
fun startEngine() {
println("$brand $model의 엔진이 켜졌습니다.")
}
}
fun main() {
val myCar = Car("Hyundai", "Sonata")
myCar.startEngine() // 출력: Hyundai Sonata의 엔진이 켜졌습니다.
}
2. 상속 (Inheritance)
- 상속은 기존의 클래스를 재사용하여 새로운 클래스를 생성하는 방법입니다.
- 상속을 통해 코드 중복을 줄이고, 공통된 기능을 부모 클래스에서 정의하여 자식 클래스에서 활용할 수 있습니다.
open class Animal(val name: String) {
fun eat() {
println("$name이(가) 먹고 있습니다.")
}
}
class Dog(name: String): Animal(name) {
fun bark() {
println("$name이(가) 멍멍 짖습니다.")
}
}
fun main() {
val dog = Dog("바둑이")
dog.eat() // 출력: 바둑이가 먹고 있습니다.
dog.bark() // 출력: 바둑이가 멍멍 짖습니다.
}
3. 다형성 (Polymorphism)
- 다형성은 하나의 객체가 여러 가지 형태를 가질 수 있는 성질을 의미합니다.
- 상속과 함께 사용되어 부모 클래스의 참조 변수로 자식 클래스의 객체를 참조할 수 있으며, 동일한 인터페이스를 구현하여 다른 동작을 수행할 수 있습니다.
open class Animal {
open fun sound() {
println("동물이 소리를 냅니다.")
}
}
class Cat: Animal() {
override fun sound() {
println("야옹!")
}
}
fun main() {
val myAnimal: Animal = Cat()
myAnimal.sound() // 출력: 야옹!
}
4. 추상화 (Abstraction)
- 추상화는 공통적인 속성과 기능을 추출하여 클래스로 정의하는 것을 의미합니다.
- 불필요한 세부 사항은 숨기고 중요한 기능만을 드러내어 복잡성을 줄입니다.
abstract class Appliance(val name: String) {
abstract fun turnOn()
}
class WashingMachine(name: String): Appliance(name) {
override fun turnOn() {
println("$name이(가) 작동을 시작합니다.")
}
}
fun main() {
val washer = WashingMachine("삼성 세탁기")
washer.turnOn() // 출력: 삼성 세탁기가 작동을 시작합니다.
}