궁금한 내용을 검색해보세요!
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
서근 개발노트
티스토리에 팔로잉
SWIFT/Grammar

Swift : 기초문법 [상속#1 - 클래스 상속(자식, 부모, 기반 클래스)]

서근
QUOTE THE DAY

-
Written by SeogunSEOGUN

반응형

본 게시글은 yagom님의 Swift 프로그래밍 3판을 참고하여 작성되었습니다.

 

상속

클래스는 메서드나 프로퍼티 등을 다른 클래스로부터 상속받을 수 있다.

  • final 키워드를 사용하면 재정의 (Override) 방지 가능
  • static 키워드를 사용해 타입 메소드를 만들면 재정의 불가능
  • class 키워드를 사용해 타입 메소드를 만들면 재정의 가능
  • class 앞에 final 을 붙이면 static 키워드를 사용한 것과 동일
  • override 키워드를 사용하여 부모 클래스 메소드 재정의 가능

자식 / 부모 / 기반 클래스

  • A클래스로 부터 상속을 받으면 상속을 받은 B클래스는 A클래스의 자식클래스(Subclass/Child-class)라고 한다.
  • 자식클래스에게 자신의 특성을 물려준 A클래스를 부모클래스(Superclass/ Parents-class)라고 한다.
  • 다른 클래스로부터 상속을 받지 않은 클래스를 기반클래스(Base class)라고 한다. (대부분의 클래스)
// SuperClass 부모 클래스

class Seogun {
    func name() {
        print("저의 이름은 서근 입니다")
    }
}

// SubClass 자식 클래스

class Mijin: Seogun {
    override func name() {
        print("저의 이름은 미진 입니다")
    }
}

// Base class 기반 클래스

class Person {
  var name: String
  var age: Int
  
  var introduction: String {
    return "이름 : \(name). 나이 : \(age)"
  }
}

상속 관계

NSObject > UIResponder > UIView > UIControl > UIButton/UILabel/UISlider...

 

상속은 Swift의 다른 타입과 클래시를 구별 짓는 클래스 만의 특징이다.

  • 클래스는 부모클래스로부터 물려받은 메서드 호출 및 프로퍼티 접근 그리고 서브스크립트 사용 가능
  • 부모클래스로부터 물려받은 메서드, 프로퍼티, 서브스크립트 등을 자신만의 내용으로 재정의(override) 가능
  • 자식클래스에서 재정의 할 때 자식클래스가 부모클래스의 요소를 재정의 한다는 것을 명확히 확인해야 함
  • 상속받은 프로퍼티에 값이 변경되었을 때 알려주는 프로퍼티 옵저버 구현 가능
  • 연산 프로퍼티를 정의한 클래스에선 연산 프로퍼티에 프로퍼티 옵저버를 사용할 수 없지만, 부모클래스에서 연산 또는 저장 프로퍼티로 정의했으면 자식클래스에서는 프로퍼티 옵저버를 구현할 수 있음
class 클래스명: 부모클래스명 {
    프로퍼티와 메서드
}

먼저, 아무것도 상속받지 않은 Person이라는 기반 클래스를 만들고 name, Int 저장 프로퍼티와 introduction이라는 연산 프로퍼티, speak()라는 메서드를 정의해보자.

// Base class 기반 클래스
class Person {
  //저장 프로퍼티
  var name: String
  var age: Int
  
  //연산 프로퍼티
  var introduction: String {
    return "이름 : \(name). 나이 : \(age)"
  }
  //메서드
  func speak() {
    print("안녕하세요. 서근 개발노트 입니다!")
  }
}
//인스턴스
let seogun: Person = Person()
seogun.name = "서근"
seogun.age = 99
print(seogun.introduction) //
seogun.speak() //안녕하세요. 서근 개발노트 입니다!

또, 상속을 통해 기반클래스인 Person 클래스보다 더 많은 기능을 수행할 수 있고, 더 세분화되어있는 자식클래스를 만들어 줄 수 있다.

//기반클래스에서 부모클래스로 변경 됨
class Person {
  //저장 프로퍼티
  var name: String = ""
  var age: Int = 0
  
  //연산 프로퍼티
  var introduction: String {
    return "이름 : \(name). 나이 : \(age)"
  }
  //메서드
  func speak() {
    print("안녕하세요. 서근 개발노트 입니다!")
  }
}

//자식클래스
class Student: Person {
    enum grade:String {
        case A = "통과 입니다."
        case B = "재시험 입니다."
        case F = "탈락 입니다."
    }
    
    func study(score: grade) {
        print("\(score.rawValue)")
    }
}

//부모클래스 인스턴스
let seogun: Person = Person()
seogun.name = "서근"
seogun.age = 99
print(seogun.introduction) //이름 : 서근. 나이 : 99
seogun.speak() //안녕하세요. 서근 개발노트 입니다!

//자식클래스 인스턴스
let mijin: Student = Student()
mijin.name = "미진"
mijin.age = 88
print(mijin.introduction) //이름 : 미진. 나이 : 88
mijin.speak() //안녕하세요. 서근 개발노트 입니다!
mijin.study(score: .A) //통과 입니다.

이처럼 Student클래스가 Person클래스를 상속받아서 Student는 자식클래스, Person은 부모클래스가 되어 자식클래스에서 Person의 메서드와 저장 프로퍼티를 모두 호출할 수 있게 됐다.

 

더불어 Student(자식클래스)를 상속받는 또 다른 클래스를 만들 수 있다. 즉, Student가 다른 클래스의 부모 클래스가 될 수 있다.

// Person을 상속받은 Student를 상속받은 AnotherSutdent클래스

class AnotherStudent: Student {
    var subject: String = ""
}

let cheolsu: AnotherStudent = AnotherStudent()
cheolsu.name = "철수"
cheolsu.age = 77
print(cheolsu.introduction) //이름 : 철수. 나이 : 77
cheolsu.study(score: .F) // 탈락 입니다.

 

 

읽어주셔서 감사합니다 🤟

 

 

 


잘못된 내용이 있으면 언제든 피드백 부탁드립니다.


서근


위처럼 이미지 와 함께 댓글을 작성할 수 있습니다.