상속과 인터페이스란?
객체지향 프로그래밍(OOP)에서 상속(Inheritance)과 인터페이스(Interface)는 코드의 재사용성, 확장성, 유지보수성을 높이는 중요한 개념입니다. 상속은 기존 클래스의 속성과 메서드를 물려받아 새로운 클래스를 만들 수 있게 해주며, 인터페이스는 클래스가 반드시 구현해야 할 메서드들의 집합을 정의하는 방법입니다. BoxLang에서도 상속과 인터페이스를 통해 코드를 더욱 유연하고 구조적으로 만들 수 있습니다. 이번 강의에서는 BoxLang에서 상속과 인터페이스를 사용하는 방법에 대해 배워보겠습니다.
상속 (Inheritance) 이해하기
상속은 객체지향 프로그래밍에서 부모 클래스의 속성과 메서드를 자식 클래스가 물려받는 개념입니다. 자식 클래스는 부모 클래스의 기능을 그대로 사용할 수 있으며, 필요한 경우 기능을 추가하거나 수정할 수 있습니다. 상속을 통해 코드 중복을 줄이고, 재사용성을 높일 수 있습니다.
BoxLang에서 상속을 구현하려면, 자식 클래스가 부모 클래스를 extends
키워드를 사용하여 상속받습니다.
상속 예제: 동물 클래스와 개 클래스
먼저, 동물 클래스를 정의하고, 이를 상속받아 개 클래스가 동작하도록 해보겠습니다.
class Animal {
var name: String
var age: Int
func init(name: String, age: Int) {
self.name = name
self.age = age
}
func speak() {
print(name & "이(가) 소리 냅니다.")
}
}
class Dog: Animal {
func bark() {
print(name & "가 짖습니다!")
}
}
위 예제에서 Animal 클래스는 모든 동물의 공통 속성과 동작인 speak
메서드를 가지고 있습니다. Dog 클래스는 Animal 클래스를 상속받아 bark
라는 추가적인 메서드를 정의하고 있습니다. 이렇게 상속을 사용하면, Dog 클래스는 Animal 클래스의 기능을 그대로 사용하면서도, 자신만의 추가적인 기능을 정의할 수 있습니다.
상속을 활용한 객체 생성
이제, 상속을 통해 생성된 Dog 객체를 만들어 보고, speak
와 bark
메서드를 호출해보겠습니다.
var dog = Dog(name: "멍멍이", age: 3)
dog.speak() // "멍멍이가 소리 냅니다." 출력
dog.bark() // "멍멍이가 짖습니다!" 출력
위 코드에서는 Dog 클래스가 Animal 클래스의 speak
메서드를 물려받고, 추가로 bark
메서드를 정의하여 호출할 수 있습니다.
인터페이스 (Interface) 이해하기
인터페이스는 클래스가 반드시 구현해야 할 메서드를 정의한 것입니다. 인터페이스는 메서드의 선언만을 포함하고, 실제 구현은 이를 채택하는 클래스가 담당합니다. 이를 통해 클래스 간의 일관성을 유지할 수 있습니다.
BoxLang에서는 인터페이스를 정의하고, 클래스가 이를 구현하도록 할 수 있습니다. 인터페이스는 interface
키워드를 사용하여 정의됩니다.
인터페이스 정의하기
먼저, Speakable이라는 인터페이스를 정의하고, 이 인터페이스를 구현하는 Person 클래스를 만들어 보겠습니다.
interface Speakable {
func speak()
}
class Person: Speakable {
var name: String
func init(name: String) {
self.name = name
}
func speak() {
print(name & "이(가) 말합니다.")
}
}
위 예제에서 Speakable 인터페이스는 speak
메서드를 선언합니다. Person 클래스는 이 인터페이스를 구현하고, speak
메서드를 정의합니다. 이제, Person 클래스는 Speakable 인터페이스의 요구사항을 충족하는 클래스가 됩니다.
인터페이스 활용하기
인터페이스를 구현한 클래스를 객체로 생성하고, 해당 클래스의 메서드를 호출하는 방법을 살펴보겠습니다.
var person = Person(name: "홍길동")
person.speak() // "홍길동이(가) 말합니다." 출력
위 코드에서는 Person 클래스가 Speakable 인터페이스를 구현하고, 그 안에 정의된 speak
메서드를 실제로 구현하여 호출할 수 있습니다.
상속과 인터페이스의 차이점
상속과 인터페이스는 비슷한 점이 있지만, 중요한 차이점이 존재합니다. 아래에 두 개념의 차이점을 정리해보겠습니다:
- 상속: 부모 클래스의 속성과 메서드를 자식 클래스가 물려받아 사용할 수 있습니다. 자식 클래스는 부모 클래스의 기능을 수정하거나 추가할 수 있습니다.
- 인터페이스: 클래스가 반드시 구현해야 할 메서드들을 정의합니다. 인터페이스 자체는 구현을 제공하지 않으며, 이를 구현한 클래스는 반드시 정의된 메서드를 구현해야 합니다.
상속은 클래스 간에 "is-a" 관계를 표현하는 데 적합하고, 인터페이스는 클래스 간에 "can-do" 관계를 표현하는 데 유용합니다.
상속과 인터페이스의 실전 예제
이번에는 상속과 인터페이스를 함께 활용한 예제를 만들어 보겠습니다. Speakable 인터페이스를 구현한 Person 클래스와 Animal 클래스를 상속받은 Dog 클래스에서 speak
메서드를 어떻게 활용할 수 있는지 살펴보겠습니다.
class Dog: Animal, Speakable {
func speak() {
print(name & "가 짖습니다!")
}
}
var dog = Dog(name: "멍멍이", age: 3)
dog.speak() // "멍멍이가 짖습니다!" 출력
위 예제에서 Dog 클래스는 Animal 클래스를 상속받고, Speakable 인터페이스를 구현합니다. 이렇게 상속과 인터페이스를 동시에 사용하여, 다양한 방식으로 클래스를 설계하고, 유연하게 동작할 수 있습니다.
마무리 및 다음 강의 예고
이번 강의에서는 BoxLang에서 상속과 인터페이스를 사용하는 방법에 대해 배웠습니다. 상속을 사용하면 기존 클래스를 확장하고, 인터페이스를 사용하면 여러 클래스 간의 일관성을 유지할 수 있습니다. 이 두 개념을 잘 활용하면, 더 나은 객체지향 설계를 할 수 있습니다.
다음 강의에서는 다형성(Polymorphism)과 추상 클래스(Abstract Class)에 대해 다룰 예정입니다. 객체지향 프로그래밍에서 더욱 중요한 개념들을 익히게 될 것입니다. 기대해 주세요!