iOS 복습(4)

유재우·2022년 1월 12일
0

상속

  • 다른 언어와 똑같이 부모의 클래스를 자식이 물려받는다.
구조) 
class 자식클래스 : 부모클래스{
}
class Twice{
    var value : Int = 2
    var twice : Double = 2.0
    func display(){
        print("value = \(value), twice= \(twice)")
    }
    init(value: Int, twice: Double){
        self.value = value
        self.twice = twice
    }
}
class One : Twice{ // Twice클래스를 One클래스에 상속
}
var kim : Twice = Twice(value:1,twice:1.1)
yoo.display()
var yoo : One = One(value:10,twice:10.2)
yoo.display()

value = 1, twice= 1.1
value = 10, twice= 10.2


  • super | 부모 메서드 호출시 사용
class Twice{
    var value : Int = 2
    var twice : Double = 2.0
    func display(){
        print("value = \(value), twice= \(twice)")
    }
    init(value: Int, twice: Double){
        self.value = value
        self.twice = twice
    }
}
class One : Twice{ // Twice클래스를 One클래스에 상속
    var name : String = "Yoo"
    func display2(){
        print("name = \(name), value = \(value), twice= \(twice)")
    }
    init(value: Int, twice: Double, name: String){
        super.init(value:Int, twice:Double)
// super를 사용해서 부모 클래스인 Twice 클래스에 있는 생성자를 가져온다.        self.name = name
    }
}
var yoo : One = One(value:10,twice:10.2,name:"유재우")
yoo.display2()

value = 10, twice= 10.2, name=유재우


override

  • 부모와 자식에 같은 메서드가 있으면 자식 우선 사용한다.
class Twice{
    var value : Int = 2
    var twice : Double = 2.0
    func display(){
        print("value = \(value), twice= \(twice)")
    }
    init(value: Int, twice: Double){
        self.value = value
        self.twice = twice
    }
}
class One : Twice{ 
    var name : String = "Yoo"
    override func display(){
// 부모 자식 모두 display()라는 메서드가 있어 자식클래스에 메서드 선언 앞에  override를 써서 우선적으로 호출됨
        print("name = \(name), value = \(value), twice= \(twice)")
    }
    init(value: Int, twice: Double, name: String){
        super.init(value:Int, twice:Double)
        self.name = name
    }
}
var yoo : One = One(value:10,twice:10.2,name:"유재우")
yoo.display()

value = 10, twice= 10.2, name=유재우


extension

  • 하위 클래스를 생성하거나 참조하지 않고 기존 클래스에 메서드, 생성자, 계산 프로퍼티 등의 기능을 추가하기 위해 사용한다.
구조)
extension 기존타입이름 {
    // 새로운 기능
}
예)
extension Double {
    var squared : Double {
        return self * self
    }
}
let myValue : Double = 2.0
print(myValue.squared)
print(5.0.squared)

4.0
25.0


접근제어

  • Internal이 기본형이다.
open                   ↑ 높은 접근수준 ⌉ 클래스, 클래스 멤버에만 적용
public                 ⎮            ⌋ 어디서나 접근이 가능
internal              기본형
fileprivate            ⎮             해당 소스 파일 내에서만 사용가능
private                ↓ 낮은 접근수준  블록과 동일한 파일에 있는 접근만 가능

프로토콜

  • 부모 클래스 상속은 하나만 가능하지만 프로토콜은 여러개 가능하다.
구조)
protocol 프로토콜명{
    프로퍼티명
    메서드 선언 // 메서드는 선언만 있고 정의는 쓸 필요가 없음
}
protocol 프로토콜명 : 다른 프로토콜1,다른 프로토콜2{
}
선언 예시)
class 클래스명 : 부모 클래스, 프로토콜명{}            
class 클래스명 : 부모 클래스, 프로토콜명1,프로토콜명2{}
// 상속을 할 때엔 부모 클래스명 다음에 표기한다.
class 클래스명 : 프로토콜명{}
class 클래스명 : 프로토콜명1,프로토콜명2{}
// 상속을 하지 않을 때엔 바로 프로토콜 명을 표기한다.
protocol ExProtocol {
    var x: Int { get set}  // 읽기 쓰기 가능
    var y: Int {get}       // 읽기 전용
    static var tx: Int { get set}
    static func typeMethod() // 메서드는 선언만
    func random() -> Double  // 마찬가지로 선언만
}
  • 채택과 준수
protocol Say {
    var x : Int {get set} // 읽기, 쓰기 가능한 프로퍼티 x 선언
    func shout()          // shout() 메서드 선언
}
class You : say {         // Yoo클래스에서 Say프토로콜을 채택(adopt)
    var x : Int = 2       // 프로퍼티 x에 대한 정의 준수(conform)
    func shout(){print("소리질러!")} // shout()메서드의 기능 정의 준수(conform)
}

27:59~34:02까지의 내용입니다.

profile
끝없이 탐구하는 iOS 개발자 유재우입니다!

0개의 댓글