객체지향 프로그래밍(OOP : Object-Oriented Programming)은 소프트웨어를 설계하고 개발하는 데 사용되는 프로그래밍 패러다임 중 하나이다. 이 패러다임은 현실 세계의 객체(object)에 기반을 둔 개념을 사용하여 프로그램을 구축하는 방식을 강조한다. 이를 통해 코드의 가독성, 재사용성, 유지 보수성을 향상시킬 수 있다.
객체지향 프로그래밍에는 크게 4가지 특징인 추상화, 캡슐화, 상속, 다형성이 있다.
추상화(Abstraction): 추상화는 객체들의 공통된 특징을 파악하여 정의해놓은 설계 방법이라고 볼 수 있다. 예를 들어, 자동차라는 클래스를 설계할 때 휠, 엔진, 차체 등의 공통적인 부분을 추상화하여 표현할 수 있다. Kotlin에서는 추상 클래스나 인터페이스를 사용하여 추상화를 구현할 수 있다.
// 추상 클래스
abstract class Shape {
abstract fun draw()
}
class Circle : Shape() {
override fun draw() {
println("Circle is drawn")
}
}
class Rectangle : Shape() {
override fun draw() {
println("Rectangle is drawn")
}
}
fun main() {
val circle = Circle()
val rectangle = Rectangle()
circle.draw()
rectangle.draw()
}
캡슐화(Encapsulation): 데이터와 그 데이터를 다루는 메서드를 하나의 단위로 묶는 것을 말한다. 이를 통해 객체의 내부 구현을 외부로부터 숨기고, 객체 간의 상호작용을 제어할 수 있다. 캡슐화는 정보 은닉을 통해 객체의 내부 상태를 보호하고 유지보수성을 높여준다. Kotlin에서는 클래스와 접근 제어자를 사용하여 캡슐화를 구현할 수 있다.
class Counter {
private var count = 0
fun increment() {
count++
}
fun getCount(): Int {
return count
}
}
fun main() {
val counter = Counter()
counter.increment()
println(counter.getCount())
}
상속(Inheritance): 부모 클래스의 속성과 메서드를 자식 클래스가 상속받는 것을 말한다. 상속을 통해 코드의 재사용성을 높일 수 있다. 부모 클래스의 변경사항이 자식 클래스에도 자동으로 적용되므로 코드 중복을 줄이고 유지 보수를 쉽게 할 수 있다. Kotlin에서는 :을 사용하여 상속을 구현할 수 있다.
// 부모 클래스
open class Animal(val name: String) {
open fun sound() {
println("Animal makes a sound")
}
}
// 자식 클래스
class Dog(name: String) : Animal(name) {
override fun sound() {
println("Dog barks")
}
}
fun main() {
val dog = Dog("Buddy")
println("Name: ${dog.name}")
dog.sound()
}
다형성(Polymorphism): 서로 다른 클래스가 같은 이름의 메서드를 가질 수 있으며, 실행 시점에 어떤 객체의 메서드를 호출할지 결정된다. 다형성은 코드의 유연성과 확장성을 높여준다. 같은 인터페이스를 가진 객체들을 동일하게 처리할 수 있어서 코드의 일반화를 가능하게 한다. Kotlin에서는 함수 오버라이딩을 통해 다형성을 구현할 수 있다.
// 동물 클래스
open class Animal {
open fun sound() {
println("Animal makes a sound")
}
}
// 각 동물들의 소리 클래스
class Dog : Animal() {
override fun sound() {
println("Dog barks")
}
}
class Cat : Animal() {
override fun sound() {
println("Cat meows")
}
}
fun main() {
val animals: Array<Animal> = arrayOf(Dog(), Cat())
for (animal in animals) {
animal.sound()
}
}