일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 직장인공부
- 패캠강의후기
- 파이썬
- 직장인자기계발
- 패캠인강후기
- 코딩교육
- 30개프로젝트로배우는iOS앱개발withSwift초격차패키지Online.
- 코딩테스트
- 패캠reactnative
- 자바스크립트
- 패캠
- 패스트캠퍼스후기
- 수강료0원챌린지
- 오공완
- reactnative강의
- 패스트캠퍼스
- 환급챌린지
- 직장인인강
- fastcampus
- 자바
- 패캠챌린지
- 직정인자기계발
- 코딩자격증
- Today
- Total
라티의 작은 일기장
[9일차] 익스텐션, 열거형, 옵셔널 체이닝 본문
당장 목요일이 개강인데 아직도 Swift 기본 문법을 못 떼었다는게 조금 충격이라 오늘은 클립 3개 분량을 공부했다!
익스텐션, 열거형, 옵셔널 체이닝에 대해 알아보자!
익스텐션?
익스텐션(Extension)은 말 그대로 확장이다. 그럼 무엇의 확장일까? (내 자취방 평수 확장) 타입의 기능적 확장이다.
기존 타입 및 구조체, 클래스, 열거형에 새로운 기능을 추가하는 기능인 것이다.
추가할 수 있는 기능은 다음과 같다.
- 연산 타입 프로퍼티 / 연산 인스턴스 프로퍼티
- 타입 메소드 / 인스턴스 메소드
- 생성자 함수
- 서브스크립트
- 중첩 타입
- 특정 프로토콜을 준수할 수 있도록 기능 추가
참고로 익스텐션을 통해 기존에 존재하는 기능을 오버라이딩 하는 것은 불가능하다.
그래도 기존에 없는 기능을 추가해서 사용할 수 있는 것은 매력적이다.
그럼 어떻게 쓰는걸까?
extension 타입 {
// 추가 기능
}
이렇게 간단하게 사용할 수 있다.
다음으로 기존 타입인 Int형에 기능을 추가하는 코드를 한번 살펴보자.
extension Int {
var isEven: Bool {
return self % 2 == 0
}
var isOdd: Bool {
return self % 2 == 1
}
}
타입으로 지정된 변수의 값이 짝수인지, 홀수인지 판별하는 isEven과 isOdd 연산 프로퍼티를 정의하였다.
이렇게 기능이 확장된 Int 타입의 변수는 다음과 같이 추가된 기능을 사용할 수 있게 된다.
익스텐션은 이렇게 연산 프로퍼티는 정의할 수 있지만, 저장 프로퍼티는 정의할 수 없다.
메소드도 한번 정의해보자.
extension String {
func convertToInt() -> Int? {
return Int(self)
}
}
String 타입에 String 값을 Int 값으로 캐스팅해주는 convertToInt() 메소드를 정의하였다.
이렇게 메소드도 익스텐션으로 추가하여 그 기능을 잘 활용할 수 있는 것을 확인할 수 있다.
다음으로 열거형에 대해 알아보자.
열거형?
열거형(Enumeration)은 연관된 값들을 모아놓는 단위이다.
타 언어에서 사용하는 열거형과 그 쓰임새와 의미가 같다. 바로 예시 코드를 보도록 하자.
enum CompassPoint {
case north
case south
case east
case west
}
enum 키워드로 정의하고 내부 값들은 case로 정의한다.
특징이 하나 있는데, 열거형 타입은 정의하게 되면 하나의 새로운 타입으로 사용하기 때문에 Swift 내부 명명 규칙에 따라
맨 앞 글자를 대문자로 지정해야한다는 것이다(구조체, 클래스와 동일).
또한 direction 인스턴스를 선언하고 열거형 내부 항목을 할당해주면, 그 때부터 해당 인스턴스는 열거형 타입으로 추론되어
해당 열거형의 이름을 명시하지 않아도 내부 항목에 접근할 수 있게 된다.
열거형 타입은 switch 구문과 같이 사용하면 그 활용도가 높다고 한다.
예시를 확인해보자.
switch direction {
case .north:
print("north")
case .west:
print("west")
case .east:
print("east")
case .south:
print("south")
}
direction 인스턴스에 대해 switch 구문을 작성하고 실행해보면,
다음과 같이 case 구문에 해당되어 west 문자열이 출력되는 것을 확인할 수 있다.
열거형 타입의 항목도 일종의 값이지만, 원시값(Raw Value)를 지정할 수 있다.
enum CompassPoint: String {
case north = "북"
case south = "남"
case east = "동"
case west = "서"
}
이렇게 열거형에 특정 타입을 지정하게 되면, 각 항목은 해당 타입의 원시값을 가질 수 있게 된다.
이렇게 정의한 원시값을 불러오려면, rawValue라는 프로퍼티를 사용하면 된다.
위에서 작성했던 switch 구문에 문자열 대신 rawValue 프로퍼티를 이용하여 인스턴스의 원시값을 출력하도록 했다.
"west"라는 문자열 대신 원시값으로 지정한 문자열 "서"가 출력된 것을 확인할 수 있다.
rawValue 프로퍼티를 활용하면 열거형 타입의 내부 항목을 확인할 수도 있다.
이렇게 rawValue를 열거형 타입의 파라미터로 넘기면 내부 항목의 이름 south를 반환해준다.
마지막으로 열거형은, 각 항목과 관련된 연관값을 가질 수 있다.
항목의 이름 옆에 소괄호로 감싸 해당 연관값의 타입을 지정해주면 된다.
인스턴스를 생성하고 지정한 연관값에 특정 값을 할당하는 코드의 실행 결과를 확인해보면 연관값이 잘 할당되었음을 확인할 수 있다.
이 연관값을 활용할 때는 보통 if문 또는 switch문을 활용하는데, switch문을 이용한 방법을 확인해보자.
switch error {
case .batteryLow(let message):
print(message)
case .unknown:
print("알 수 없는 에러입니다.")
}
이렇게 항목의 연관값을 할당받을 상수를 소괄호 자리에 지정해주면, 연관값을 활용할 수 있다.
실행 결과에서도 연관값이 잘 출력되는 것을 확인할 수 있었다.
자, 이제 마지막 대목으로 옵셔널 체이닝에 대한 내용을 알아보자.
옵셔널 체이닝?
옵셔널 체이닝은, 옵셔널에 속해있는 nil일지도 모르는 프로퍼티, 메소드, 서브스크립션 등을 가져오거나 호출할 때 사용할 수 있는 일련의 과정이다. 옵셔널에 값이 존재한다면 프로퍼티나 메소드 등을 가져올 수 있고, 존재하지 않는다면 nil을 반환한다.
바로 코드부터 살펴보자.
struct Developer {
var name: String
}
struct Company {
var name: String
var developer: Developer?
}
개발자의 정보를 담고 있는 Developer 구조체와, 회사의 정보를 담고 있는 Company 구조체를 정의했다고 하자.
이 때 개발자와 회사의 관계는 다음 두 경우로 나뉜다.
1. 개발자가 회사에 아직 채용되지 않은 경우
인스턴스를 생성할 때 developer에 파라미터를 넘겨줄 수 없다. 따라서 nil을 넘겨받은 company 인스턴스의 developer 프로퍼티의 값을 출력해보면 nil이 출력된다.
2. 개발자가 회사에 채용된 경우
Developer 구조체의 인스턴스를 생성하고 적당한 값으로 초기화한 뒤, 해당 인스턴스를 company 인스턴스의 초기화를 위한
파라미터로 넘겨주면, Company 구조체의 developer 프로퍼티는 옵셔널이기 때문에,
해당 프로퍼티를 출력하면 옵셔널 상태의 developer 인스턴스가 표시된다.
만약 여기서 developer 인스턴스의 name 프로퍼티만을 출력하고 싶어서 단순히 해당 프로퍼티를 참조해버린다면,
이런 에러를 만날 수 있다.
뜻인 즉 원래 구조체 타입 Developer의 name 프로퍼티에 접근하고 싶다면,
Company 구조체의 developer 프로퍼티의 타입이 옵셔널이기 때문에 그것을 해소(옵셔널 바인딩)시켜줘야한다는 것이다.
자, 여기서 옵셔널 체이닝을 사용해서 옵셔널 바인딩을 시킬 수 있다.
방법은 해당 옵셔널 프로퍼티 이름 뒤에 ? 또는 ! 연산자를 붙이면 된다.
?의 경우, 접근한 프로퍼티의 값은 항상 옵셔널 상태이고(nil이 될 수 있는 가능성이 있다),
따라서 실제 값 추출을 위해 별도의 옵셔널 바인딩이 필요하다.
!의 경우, 강제로 옵셔널 체이닝을 한 것이므로 반환값은 실제 값이다.
패스트캠퍼스 바로가기 : http://bit.ly/3Y34pE0
> 본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'Swift' 카테고리의 다른 글
[11일차] 클로저 (0) | 2023.03.02 |
---|---|
[10일차] try-catch (0) | 2023.03.01 |
[8일차] 프로토콜 (0) | 2023.02.27 |
[7일차] assert와 guard (0) | 2023.02.26 |
[6일차] 상속 (0) | 2023.02.25 |