티스토리 뷰

객체지향 프로그래밍을 하다보면 상속 관계에 있는 여러 클래스의 인스턴스를 만들고 그 인스턴스들을 관리하는 방법이 필요하다. type별로 일일히 관리하면 코드가 너무 비효율적이니까 효율적으로 관리하기 위해서는 일단 해당 인스턴스의 정확한 type을 알아야하고, 가능한 가장 추상적인 type으로 관리할 수 있어야 한다.

보통 super class type으로 모든 인스턴스를 관리하고 특정 sub class의 연산을 수행하려면 sub class type으로 캐스팅해서 접근하도록 구현하는데 swift 에서 이걸 어떻게 구현할 수 있는지 알아보자.

 

 

 

is

is라니.

swift는 가독성을 향상시키기 위해서 노력한 흔적들이 굉장히 많이 보인다. 그래서 문법을 말로 설명하는 것 보다 코드를 한번 보는 게 오히려 더 이해가 잘 될 때가 있다.

var some = 0

if a is Int {
	print("is int")
} else if a is Double {
	print("is double")
} else if a is String {
	print(a)
}

== 연산자는 안에 있는 값을 비교하지만 is는 type을 비교한다고 할 수 있겠다.

 

 

 

as

is를 보고 as를 보면 이름만 봐도 어떤 일을 하는 키워드인지 감이 온다. 피연산자를 as? 뒤에 오는 자료형으로 캐스팅한다는 뜻이다. ?을 주로 붙여서 사용하는데 이유는 이 캐스팅이 실패할 수도 있기 때문이다. as는 캐스팅에 실패하면 nil을 반환한다.

class Espresso {
	var shot = 1

	func sayMyName() { print("I'm espresso") }
}

class Latte: Espresso {
	var milk = 1
	var whipping = false

	func sayMyName() { print("I'm latte") }
}
class Americano: Espresso {
	var water = 1

	func sayMyName() { print("I'm americano") }
}

var orders = [Espresso(), Latte(), Americano()]

for order in orders {
	if let drink = order as? Latte {
		drink.sayMyName()
	} else if let drink = order as? Americano {
		drink.sayMyName()
	} else if let drink = order as? Espresso {
		drink.sayMyName()
	}
}
// I'm espresso
// I'm latte
// I'm americano

위 코드에서는 실패할 일이 없긴 하지만 Int나 다른 type으로만 검사했다면 for문을 돌다가 캐스팅에 실패할 것이고 if문에 의해 무시되고 아무것도 출력되지 않을 것이다.

'Programming > Swift' 카테고리의 다른 글

Swift Expert | Codable  (0) 2020.12.02
Swift Beginner | 인터페이스  (0) 2020.11.18
Swift Beginner | 함수의 시작과 끝 guard defer  (0) 2020.11.18
Swift Beginner | Closure  (0) 2020.11.18
Swift Beginner | 함수(2)  (0) 2020.11.18
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함