상속(Inheritance)은 객체 지향 프로그래밍에서 중요한 개념으로, 기존 클래스의 속성과 기능을 새로운 클래스가 물려받아 사용하는 것입니다.
먼저 상속을 이해하려면 클래스와 객체의 개념부터 알아야 합니다.
- 클래스(Class): 어떤 사물이나 개념을 코드로 표현한 '설계도'라고 보시면 됩니다. 예를 들어, 동물(Animal)이라는 클래스를 만들면, 이 클래스는 모든 동물이 가질 공통된 속성(이름, 나이)과 기능(먹기, 잠자기)을 정의합니다.
- 객체(Object): 클래스라는 설계도를 바탕으로 실제로 만들어진 사물입니다. 예를 들어 Dog라는 객체는 Animal 클래스로부터 만들어진 하나의 실체입니다. 즉, 클래스가 설계도라면 객체는 그 설계도로 만들어진 실제 물건입니다.
이제 상속의 개념으로 들어가 봅시다.
상속이란, 부모 클래스의 속성과 메서드를 자식 클래스가 물려받는 것입니다. 이를 통해 자식 클래스는 부모 클래스의 기능을 그대로 사용하거나, 필요에 따라 확장할 수 있습니다.
코드를 통해 좀 더 자세히 알아보겠습니다.
먼저 Animal이라는 기본 클래스를 만들어보겠습니다.
기본 클래스란? 아무 클래스도 상속받지 않은 클래스를 기본 클래스라고 합니다.
class Animal {
var name: String
var age: Int
}
현재 Animal 클래스 뒤에 그 어떠한 클래스 이름이 오지 않았기에 즉 아무 클래스도 상속받지 않고 있기에 기본 클래스입니다.
기본 클래스를 상속받아보겠습니다. (자식 클래스)
class Dog: Animal {
var breeds: String
}
Dog클래스가 Animal클래스를 상속받았기 때문에 name과 age속성을 그대로 사용할 수 있습니다.
Animal 클래스는 처음에는 기본 클래스였지만, Dog 클래스가 이를 상속받으면서 부모 클래스가 됩니다.
동일한 코드로 조금 더 자세하게 알아보자면
1. 기본 클래스 (부모 클래스)
Animal 클래스는 모든 동물의 공통된 속성과 기능을 정의하는 기본 클래스입니다. 이 클래스는 나중에 다른 클래스가 상속받아 사용할 수 있는 기초를 제공합니다.
// 기본 클래스 (부모 클래스)
class Animal {
var name: String
// 생성자 메서드: Animal 클래스의 객체를 생성할 때 호출됨
init(name: String) {
self.name = name
}
// 메서드: 동물이 소리를 낸다는 행동을 정의
func makeSound() {
print("\(name) makes a sound.")
}
}
- 속성 (name): 동물의 이름을 저장합니다. 모든 동물 객체는 이름을 가지게 됩니다.
- 생성자 (init): 객체가 생성될 때 호출되는 메서드입니다. 여기서 name 속성을 초기화합니다.
- 메서드 (makeSound()): 동물이 소리를 낸다는 행동을 정의합니다. 이 메서드는 기본적으로 "동물이 소리를 낸다"는 출력을 제공합니다.
2. 자식 클래스 (자식 클래스)
Dog 클래스는 Animal 클래스를 상속받아, 기본적인 속성과 기능을 물려받으며, 개에 특화된 기능을 추가합니다.
// 자식 클래스 (Animal 클래스를 상속받음)
class Dog: Animal {
// 새로운 메서드: 개가 짖는 행동을 정의
func bark() {
print("\(name) barks: Woof!")
}
}
- 상속 (Dog: Animal): Dog 클래스는 Animal 클래스를 상속받습니다. 따라서 Dog 클래스는 Animal의 속성(name)과 메서드(makeSound())를 그대로 사용할 수 있습니다.
- 추가된 메서드 (bark()): bark() 메서드는 Dog 클래스에서 새롭게 정의한 메서드로, 개가 짖는 행동을 출력합니다.
3. 객체 생성 및 사용
이제 Dog 클래스를 사용하여 객체를 생성하고, 상속받은 메서드와 자식 클래스에서 추가한 메서드를 호출합니다.
// Dog 클래스의 객체를 생성
let myDog = Dog(name: "Buddy")
// 상속받은 메서드 호출
myDog.makeSound() // "Buddy makes a sound." 출력
// 자식 클래스에서 추가한 메서드 호출
myDog.bark() // "Buddy barks: Woof!" 출력
- 객체 생성 (Dog(name: "Buddy")): Dog 클래스의 객체 myDog를 생성합니다. 생성 시 name 속성에 "Buddy"라는 값을 전달합니다.
- 상속받은 메서드 호출 (makeSound()): myDog 객체는 Animal 클래스로부터 상속받은 makeSound() 메서드를 호출할 수 있습니다. 결과적으로 "Buddy makes a sound."가 출력됩니다.
- 추가된 메서드 호출 (bark()): myDog 객체는 Dog 클래스에서 새롭게 정의한 bark() 메서드를 호출할 수 있습니다. 결과적으로 "Buddy barks: Woof!"가 출력됩니다.
요약하자면
1. 기본 클래스 (Animal): 모든 동물에 공통된 속성(이름)과 메서드(소리 내기)를 정의합니다.
2. 자식 클래스 (Dog): Animal을 상속받아 공통 속성과 메서드를 사용하고, 추가로 개에 특화된 기능(짖기)을 정의합니다.
3. 객체 생성 및 메서드 호출: Dog 클래스의 객체를 생성하고, 상속받은 메서드와 자식 클래스에서 추가한 메서드를 호출하여 기능을 확인합니다.
상속이 필요한 이유
Dog 또는 Cat 클래스를 각각 따로 만들 수 있지만, 강아지와 고양이는 모두 ‘동물’이라는 공통된 분류에 속합니다. 이들은 각각의 존재이기 전에, 동물로서 공통된 속성과 기능을 가지고 있습니다.
예를 들어, 모든 동물은 이름과 나이를 가질 수 있으며, 먹고 잠을 자는 행동을 합니다. 이러한 공통된 속성(예: name, age)과 기능(예: eat(), sleep())을 각각의 클래스(Dog, Cat)에 모두 정의하게 된다면, 중복된 코드가 발생하고, 코드의 가독성이 떨어지며, 유지보수도 어려워집니다.
여기서 상속이 필요한 이유가 나옵니다. 상속을 통해 공통된 속성과 기능을 부모 클래스(예: Animal)에 정의하고, 자식 클래스(예: Dog, Cat)가 이를 상속받아 재사용할 수 있습니다. 이렇게 하면 코드의 중복을 줄이고, 유지보수를 쉽게 할 수 있으며, 객체 지향 프로그래밍의 원칙에 맞는 구조를 만들 수 있습니다.
정리하자면
강아지와 고양이는 서로 다른 종류의 동물이지만, 동물이 가질 수 있는 공통된 속성과 기능이 존재하기 때문에 상속이 필요합니다. 상속을 사용하면 중복된 코드를 줄이고, 더 간결하고 유지보수하기 쉬운 코드를 작성할 수 있습니다.
잘못된 내용 혹은 오타가 있거나 더 좋은 내용 피드백은 언제나 환영입니다 :)
'Apple > Swift' 카테고리의 다른 글
[iOS/Swift] 오버라이딩(Overriding) 이란? (2/2) (0) | 2024.08.28 |
---|---|
[iOS/Swift] 오버라이딩(Overriding) 이란? (1/2) (0) | 2024.08.26 |
[iOS/Swift] self & super 란? (0) | 2024.08.16 |
[iOS/Swift] 형식 속성(Type Property) 이란? (0) | 2024.08.13 |
[iOS/Swift] 계산 속성(Computed Properties) 이란? (0) | 2024.08.11 |