[Swift] 기본 문법 (5)

니나노개발생활·2022년 3월 3일
0

💡ah-ha

목록 보기
50/51
post-thumbnail

상속

  • 부모가 자식에게 재산을 물려주는 행위
  • 클래스가 다른 클래스로부터 메소드, 프로퍼티, 특성을 상속받는 것

☝🏻 상속 받는 클래스 : 자식 클래스 = 서브 클래스
☝🏻 상속 하는 클래스 : 부모 클래스 = 슈퍼 클래스

class 클래스 이름: 부모클래스 이름 {
    하위 클래스 정의
}
// 부모 클래스
class Vehicle {
    var currentSpeed = 0.0
    var description: String {
        return "traveling at \(currentSpeed) miles per hour"
    }
    func makeNoise() {
    }
}

// 자식 클래스
class Bicycle: Vehicle {
    var hasBasket = false
}

var bicycle = Bicycle()
bicycle.currentSpeed // 0
bicycle.currentSpeed = 15.0 // 15

오버라이딩

메소드

  • 부모 클래스를 상속받은 자식 클래스에서 메소드를 오버라이드하여 기능을 재정의.
//오버라이딩
class Train: Vehicle {
    override func makeNoise() {
        print("choo choo")
    }
}

let train = Train()
train.makeNoise()

☝🏻 자식 클래스의 오버라이드된 메소드보다 부모 클래스의 메소드를 먼저 호출하고 싶은 경우

override func makeNoise() {
        super.makeNoise()
        print("choo choo")
    }
  • 오버라이드 메소드 내부에 super.메소드명()을 통해 먼저 호출 할 수 있다.
// 부모 클래스
class Vehicle {
    func makeNoise() {
        print("speaker on")
    }
}
// 자식 클래스
class Train: Vehicle {
	// 오버라이드
    override func makeNoise() {
    	// 부모 클래스의 메소드 먼저 호출
        super.makeNoise()
        print("choo choo")
    }
}
let train = Train()
train.makeNoise()
//speaker on
//choo choo

프로퍼티

  • 개념은 오버라이딩 메소드와 동일
// 부모 클래스
class Vehicle {
    var currentSpeed = 0.0
    var description: String {
        return "traveling at \(currentSpeed) miles per hour"
    }
}

// 오버라이딩
class Car: Vehicle {
    var gear = 1
    override var description: String {
        return super.description + "in gear \(gear)"
    }
}

☝🏻 프로퍼티 오버라이딩을 막으려면?

final var currentSpeed = 0.0

🌟final

  • 프로퍼티 외에 클래스의 상속도 제한할 수 있다!
final class Vehicle {
    var currentSpeed = 0.0
    var description: String {
        return "traveling at \(currentSpeed) miles per hour"
    }
}

타입 캐스팅

  • 인스턴스의 타입을 확인하거나 어떠한 클래스의 인스턴스를 해당 클래스 계층 구조의 슈퍼 클래스나 서브 클래스로 취급하는 방법

☝🏻 연산자 ( is / as )

  • 값의 타입을 확인하거나 변환할 때 사용

is 연산자

// 부모 클래스
class MediaItem {
    var name: String
    init(name: String) {
        self.name = name
    }
}

// 자식 클래스
class Movie: MediaItem {
    var director: String
    init(name: String, director: String) {
        self.director = director
        super.init(name: name)
    }
}

// 자식 클래스
class Song: MediaItem {
    var artist: String
    init(name: String, artist: String) {
        self.artist = artist
        super.init(name:name)
    }
}

let library = [
    Movie(name: "기생충", director: "봉준호"),
    Song(name: "Butter", artist: "BTS"),
    Movie(name: "올드보이", director: "박찬욱"),
    Song(name: "Wonderwall", artist: "Oasis"),
    Song(name: "Rain", artist: "이적")
]

var movieCount = 0
var songCount = 0

for item in library {
    // is로 인스턴스의 타입 확인
    if item is Movie {
        movieCount += 1
    } else if item is Song {
        songCount += 1
    }
}

as 연산자

  • 다운 캐스팅 > 형 변환
  • 특정 타입의 상수 또는 변수는 하위 클래스 인스턴스를 참조
  • as? : 조건부 ( 옵셔널 값으로 변환)
  • as! : 강제 ( 강제로 변환하기 때문에 항상 성공할 것이라고 확신할 때만 사용해야 한다.)
for item in library {
    if let movie = item as? Movie {
        print("Movie: \(movie.name), dir. \(movie.director)")
    } else if let song = item as? Song {
        print("Song: \(song.name), by \(song.artist)")
    }
}

패스트캠퍼스 ios 앱개발 swift 강의를 듣고 작성된 글입니다.

profile
깃헙으로 이사중..

0개의 댓글