일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 머신러닝
- 스프링
- 코린이
- K디지털크레딧
- iOS개발강의
- 서블릿
- Python
- 파이썬
- 썸머스쿨예약
- 내일배움카드
- 전주스터디카페
- 패스트캠퍼스
- ux
- 자바스크립트
- 리스트
- 문제풀이
- 메시지시스템
- ui
- 광주직업학교
- 딥러닝
- jsp
- 코딩
- 스마트인재개발원
- 전주독서실
- java
- 바이트디그리
- 자바
- 덴디컨설팅
- 빅데이터
- 자바페스티벌
- Today
- Total
멀리 보는 연습
iOS 개발 강의 정리_상속, 오버라이딩, 타입캐스팅 본문
상속
우리가 흔히 알고 있는 상속은 부모가 자식에게 재산을 물려받는 행위이다. Swift에서는 클래스가 다른 클래스로부터 메소드, 프로퍼티를 상속받는 것을 뜻한다. 서브 클래스가 자식, 슈퍼 클래스가 부모라고 할 수 있다.
import Foundation
class Vehicle {
var currentSpeed = 0.0
var description: String {
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise(){
}
}
/*
class 클래스 이름 : 부모 클래스 이름{
// 하위 클래스 정의
}
*/
class Bicycle : Vehicle{
var hasBasket = false
}
var bicycle = Bicycle()
bicycle.currentSpeed // 0
bicycle.currentSpeed = 15.0
bicycle.currentSpeed // 15
여기서 Vehicle이 부모 즉 슈퍼 클래스, Bicycle이 자식인 서브 클래스이다. 따라서 자식 클래스인 Bycycle을 'bicycle' 변수에 담으면 슈퍼 클래스의 모든 것을 가져다가 쓸 수 있다. 상속 받았으니까!
오버라이딩
서브 클래스는 슈퍼 클래스에 정의된 것을 자신만의 기능으로 전환하여 사용 가능하다.
import Foundation
class Vehicle {
var currentSpeed = 0.0
var description: String {
return "traveling at \(currentSpeed) miles per hour"
}
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 Car : Vehicle{
var gear = 1
override var description: String{
return super.description + " in gear \(gear)"
}
}
let car = Car()
car.currentSpeed = 30.0
car.gear = 2
print(car.description) // traveling at 30.0 miles per hour in gear 2
class AutomaticCar: Car{
override var currentSpeed: Double{
didSet{
gear = Int(currentSpeed/10)+1
// 프로퍼티 옵저버에 의해 gear 프로퍼티가 변경되게도 설정 가능
}
}
}
let automatic = AutomaticCar()
automatic.currentSpeed = 35.0
print("AutomaticCar : \(automatic.description)")
// AutomaticCar : traveling at 35.0 miles per hour in gear 4
쉽게 비유하자면 부모에게 상속 받은 자동차를 내 마음대로 튜닝해도 된다는 그런 뜻이다. Java 문법을 배워뒀던게 많은 도움이 됐다.
import Foundation
class Vehicle {
final var currentSpeed = 0.0
// 슈퍼클래스의 프로퍼티 앞에 final을 붙이면 재정의를 할 수 없다. class앞에서도 사용 가능
var description: String {
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise(){
print("Speaker On")
}
}
이것도 쉽게 비유하자면 부모님이 유언장에 "내가 물려준 자동차 튜닝하지 마라"라고 명시해두면 튜닝 할 수 없듯이(?) final을 명시해두면 재정의를 할 수 없다는 뜻이다. 비유가 조금 억지스러운가? 호호
타입 캐스팅
스위프트의 타입 캐스팅은 인스턴스의 타입을 확인하는 용도(is), 클래스의 인스턴스를 부모 혹은 자식 클래스의 타입으로 사용할 수 있는지 확인하는 용도(as)로 사용한다.
1. 형 확인 : is
is 연산자를 통해 특정 인스턴스의 타입을 확인할 수 있다. 아래의 코드는 library 배열을 순회하고 아이템이 특정 타입일 때마다 그 숫자를 증가시키는 예제 코드이다.
import Foundation
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: "벚꽃엔딩", artist: "버스커버스커"),
Song(name: "봄비", artist: "장범준")
]
var movieCount = 0
var songCount = 0
for item in library {
if item is Movie {
movieCount += 1
}else if item is Song{
songCount += 1
}
}
print("Media library contains \(movieCount) movies and \(songCount) songs")
// Media library contains 2 movies and 3 songs
tmi : 코드 블럭은 밑줄이나 형광펜이 불가해서 불편하다.
아무튼
var movieCount = 0
var songCount = 0
for item in library {
if item is Movie {
movieCount += 1
}else if item is Song{
songCount += 1
}
}
print("Media library contains \(movieCount) movies and \(songCount) songs")
// Media library contains 2 movies and 3 songs
이 부분을 자세히 보면 library의 item 타입이 만약 Movie라면 movieCount를 +1 해주고, Song이라면 songCount를 +1 해주라는..
그럴 때 저 is 를 사용한다. 타입을 알아보고자 할 때!
2. 업캐스팅과 다운캐스팅 : as
2-1. 업캐스팅
as를 사용하여 부모 클래스의 인스턴스로 사용될 수 있도록 컴파일러에게 타입 정보를 전환해준다. Any 혹은 AnyObject로도 타입 정보를 변환할 수 있다. 생략해도 무방하다.
2-2. 다운캐스팅
as? 또는 as!를 사용하여 자식 클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 인스턴스의 타입 정보를 전환해준다.
as?는 조건부 다운 캐스팅으로, 캐스팅하려는 타입에 부합하지 않는 인스턴스라면 nil을 반환하기 때문에 결과 타입은 옵셔널 타입이다.
as!는 강제 다운 캐스팅으로, 캐스팅하려는 타입에 부합하지 않는 인스턴스라면 런타임 오류가 발생하기 때문에 조심해야한다. 캐스팅에 성공하면 옵셔널이 아닌 일반 타입을 반환한다.
import Foundation
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: "벚꽃엔딩", artist: "버스커버스커"),
Song(name: "봄비", artist: "장범준")
]
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)")
}
}
/*
Movie : 기생충, dir 봉준호
Song : Butter, by BTS
Movie : 리틀포레스트, dir 송가현
Song : 벚꽃엔딩, by 버스커버스커
Song : 봄비, by 장범준
*/
'iOS 앱 개발 > Swift' 카테고리의 다른 글
iOS 개발 강의 정리_assert, guard (0) | 2022.04.18 |
---|---|
iOS 개발 강의 정리_구조체와 클래스 (0) | 2022.03.09 |
iOS 개발 강의 정리_Swift 옵셔널(Optional) (0) | 2022.03.06 |
iOS 개발 강의 정리_Swift 기본 문법 (0) | 2022.03.01 |
iOS 개발 강의 정리_Swift란? (0) | 2022.03.01 |