안녕하세요!
오늘은 타입캐스팅(Type Casting)에 관하여
알아보고자 합니다
타입캐스팅
|
Type Casting
부모 클래스에서 상속된 자식 클래스는
자기 자신의 타입 + 부모클래스 타입을
가지고 있어요
이유는
부모 클래스의 특성을 물려받았기 떄문인데요
메서드를 오버라이딩했더라도 컴파일러가
클래스의 형태에서 중요하게 여기는
메서드의 이름 매개변수 타입 반환타입이 변하지 않는 한
클래스 형식이 달라지는 것은 아니기 때문입니다
이렇기 때문에 자식 클래스는 자신의 타입 대신
부모 클래스 타입으로 선언하여 사용이 가능하답니다
타입 캐스팅은
is
as
연산자로 구현합니다
두 연산자는 값의 타입을 확인하거나
값이 다른 타입으로 캐스트하는 간단한 방법을 제공하고 있답니다
이제 간단한 설명은 끝났으니
코드를 통해서 알아보고자 합니다
배열로 담았을 때 하나의 클래스가 아닌
두 개의 인스턴스가 있는걸 확인 할 수 있습니다
여기서 타입 검사를 확인해서 어떤 인스턴스가 들어갔는지 확인이 가능합니다
is
연산자
|
Bool (true/false)타입 으로 이루어져 있습니다
상속관계의 계층에서 포함관계를 생각하면 쉽습니다
is 연산자에 대해서 알아봤으니
이제 as 연산자에 대해서 알아보고자 합니다
as
연산자
|
업캐스팅과 다운캐스팅으로 이루어져 있습니다
업 캐스팅이란?
(Upcasting)
as
하위클래스의 메모리구조로 저장된 인스턴스(자식클래스)를
상위 클래스(부모클래스)로 캐스팅합니다
다운캐스팅이란?
(Donwcasting)
as? / as!
상위 클래스 타입을 하위 클래스 타입으로 캐스팅 하는것을 말하며
캐스팅 과정에서 오류가 발생할 가능성이 있으며
옵셔널 처리에 따라서
옵셔널 캐스팅과 강제 캐스팅으로 나누어 집니다
옵셔널 캐스팅(as?)은 실패시 nil을 반환하지만
강제 캐스팅(as!)은 캐스팅에 실패하게 되면 런타임 오류가 나게 됩니다
타입 캐스팅의 의미란?
인스턴스 사용시에 어떤 타입으로 사용할지 메모리구조에 대한 힌트를 변경하는것입니다
메모리 값을 수정하는게 ❌❌❌❌
🙆🏻♀️해당 타입 인스턴스인 것처럼 취급하라는게 목적🙆🏻♀️
한가지 더 예시를 보자면
as? / as!의 에시입니다
우선
부모 자식 클래스를 만들고
기본적으로 상속된 클래스에는
프로퍼티가 하나씩 더 늘어난걸 확인할 수 있습니다
마지막에 오류난 이유는 person인스턴스를 undergraduate 로 강제 캐스팅 하려고하기에 오류가 납니다
강제 캐스팅은 실제 객체가 해당 타입이거나 그 하위 타입이여야만 성공합니다
그래서 성공하려고 한다면??
여기서 자세히 설명하자면
변수 선언 타입이 'Person'이기 때문에
'Person'클래스에서 정의된 속성들만 접근할 수 있습니다
하지만 person2는 실제로 Undergraduate 타입의 객체를 가리키고 있더라도
컴파일러는 'Person'타입으로만 인식하기 때문에
studentId
major
불러올 수 없습니다
그래서 안전한 다운캐스팅이 필요합니다
업캐스팅인 경우
그냥 됩니다
네 된다구요
오류가능성?
없어요
타입 캐스팅은 앱 제작 과정에서 자주사용되는 구문입니다
파운데이션 프레임워크를 사용하다보면 메서드 반환 타입이 상위 클래스 타입으로 추상화된 경우가 많아
추상화된 객체를 반환받아 우리가 사용해야 할 적합한 형태로 바꾸기 위해 이러한
타입 캐스팅 / 다운캐스팅을 사용합니다
만약 학생관리 앱을 간단하게 만들어서 사용한다 했을때 이러한 예시로 사용할 수 있을거 같아
예시로 만들어보았습니다
❤️혹시나 잘못된 부분이 있다면 댓글로 알려주면 감사하겠습니다❤️
✏️참고
앨런스위프트 문법 자료(강의)⭐️⭐️⭐️ -추천
꼼꼼한 재은씨의 스위프트 프로그래밍
Swift 공식문서
'Swift' 카테고리의 다른 글
Swift | 프로토콜(Protocols)에 관하여 -1 (0) | 2024.05.20 |
---|---|
Swift | 확장(extension)에 관하여 (0) | 2024.05.20 |
Swift | 서브스크립트(Subscripts)에 관하여 (0) | 2024.05.17 |
공식문서 Swift | class(클래스) 필수 생성자 / 실패가능 생성자(c / 소멸자에 관하여 (0) | 2024.05.17 |
공식문서 Swift | class(클래스)와 struct(구조체)에 관하여 - 초기화와 생성자 3 (✏️편의생성자/지정생성자) (0) | 2024.05.17 |