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()  // 출력: 삼성 세탁기가 작동을 시작합니다.
}