타입 캐스팅 [스코클 TIL_230718 ]

7과11사이·2023년 7월 18일
0

스파르타코딩클럽

목록 보기
5/90
post-thumbnail

오늘의 생각

  • 잘 배우기 위해선 스스로 정리해보아야 한다. 나만의 언어로
    그동안 노션에 쭉 정리해두었는데, 깃헙과 여기에도 틈틈히 정리해서 올려야겠다.

오늘의 공부

1. TYPE CASTING

오늘 공부한 내용이 한 장에 들어갈 내용이 아니란 걸 알고 있지만...
그래도 조금이나마 정리해보고자 한다.
나중에 분리해서 더 상세하게 적어야지...ㅋㅋㅋ

우선 내가 간단하게 이해하고 있던 타입 캐스팅은...

  • 타입 캐스팅은 객체의 타입을 다른 타입으로 변환 해줌
  • 상속 관계간의 타입 한에서만 타입 변환이 가능
  • Downcasting && Upcasting이 존재


    이정도가 끝이었다.
    이전에는 optional, forced unwrapping와 동일한 사용 방식, 구조를 가졌다보니
    '아~ 강제로 변환하고 싶을 때, 혹시 모를 때' 정도로 이해하고 넘어갔다.
    하지만 타입 캐스팅을 더 찾아보게 된 이유는 한 코드를 때문이었다.
    내가 본 아래 예시 코드를 함께 봤으면 한다!
class MediaItem {
	var name: String
    init(name: String) {
    	self.name = name
    }
}

class Movie {
	var director: String
    init(name: String, director: String) {
    	self.director = director
        super.init(name: name)
    }
}

class Album: MediaItem {
	var artist: String
    init(name: String, artist: String) {
    	self.artist = artist
        super.init(name: name)
    }
}

let library = [
Movie(name: "반지의 제왕", director: "톨킨"),
Album(name: "SkinHead", director: "Kanye"),
Movie(name: "해리포터", director: "롤링")]

for item in library {
	if let movie = item as? Movie {
    	print("영화 제목은 \(movie.name), 감독은 \(movie.director)입니다.")
        } else if let song = item as? Album {
        print("음악 제목은 \(song.name), 부른 가수는 \(song.artist)입니다")
   }
}

궁금했던 부분은...

  1. item as? Movie를 하는 이유가 뭐지?
  2. item as! Movie를 하면 안되나?
  3. 애초에 typeCasting을 하는 이유가 뭘까?
    였다.

1. item as? 를 한 이유

  • 보니 타입 캐스팅할 때 대체적으로 as?를 쓰도록 권장하는 기분이었다.
    이유는 as 를 제외하고 Application Runtime에 실행이 되기 때문에 혹여나 타입 변환이 되지 않거나 의도했던 결과가 일어나지 않는다면 오류로 인해 앱이 꺼지기 때문이다.

    여기서도 as? Movie, as? Album으로 작성한 이유는 library 배열에 담긴 객체들이 선언된 클래스의 타입과 일치하지 않을 시, 앱 종료 대신 에러 화면을 띄울 수 있도록 하기 위해였다.

2. item as! 는 안될까?

  • 일단 내가 지금 알고 있는 수준에서는 불가능해 보인다.
    이것저것 코드를 수정해보며 노력했지만 안되는 것 같다.
    그 이유가 여러개 있어 보이는데,

    1. as! 는 강제 타입 캐스팅이다.
    만일 Forced unwrapping처럼 값을 강제로 변환하면 모든 값이 한 타입으로 변환되는 것으로 이해된다. Library 배열 안에 담긴 Album, Movie의 값이 if let 첫 번째 구문에 걸려 Movie로 모두 변환되지 않을까 싶다.

    물론 말이 안되는 상상이다.
    그 이유는...

3. 애초에 타입캐스팅 하는 이유는 뭘까?

  • 어플은 실행하는 동안 수많은 객체들을 생성해 낼 것이다. 이때 우리는 생성된 객체들이, 필요한 타입에 따라, 질서있게 정리되어 어플이 종료되는 오류 없이 하나하나 처리를 해야만 한다. 영화 타입으로 저장했다면 영화 컬렉션에, 음악 타입으로 저장했다면 음악 컬렉션에, 혹여나 입력이 잘못되어 코드 어디에서도 잡을 수 없다면 에러 문자를 보여줘야 할 것이다.

    이때 나는 타입 캐스팅이 활약한다고 생각한다.
    as!는 강제적으로 타입을 변환시키지만, 명확하게 어떤 타입의 객체가 생성되는지 알고 있을 때에만 실행이 된다. 반대로 as?는 우선 우리 상속 관계도 타입은 맞지만 어디에 소소되는지 한번 더 확인하고 변환해주는 구조로 이해된다.

재밌는 점은 Type Conversion, 타입을 완전히 바꿔주는 형 변환과 달리
Type Casting은 변경하고자 하는 타입으로 '취급'만 한다는 점!

분량 조절로 클로저는 뒤 이어 정리해보겠다!

1개의 댓글

comment-user-thumbnail
2023년 7월 18일

너무 좋은 글이네요. 공유해주셔서 감사합니다.

답글 달기