[TIL] Swift - 옵셔널타입

신승현·2024년 1월 19일

TIL

목록 보기
5/72

1. 옵셔널타입

  • 옵셔널은 안전성을 높이기 위해 사용되는 타입이다. 즉 nil을 사용할 수 있는 타입과 사용할 수 없는 타입으로 구분하고, 사용할 수 있는 타입을 가리켜 옵셔널 타입이라고 부른다.
  • 다른 언어의 'null'과 같은 의미라고 생각해 찾아봤는데, 'null'은 pointer값의 부재이며 'nil'은 특정 타입의 값이 부재로 서로 다른 의미이다.
  • 옵셔널타입은 반환하고자 하는 값은 옵셔널 객체로 다시 한번 감싼 형태이며, 이 값은 옵셔널언래핑을 통해 실제 값을 추출해 사용할 수 있다.

2. 옵셔널타입 선언

  • 일반 자료형을 옵셔널 자료형으로 바꾸는 방법은 자료형 뒤에 물음표를 붙이면 된다.
var optInt: Int? // 옵셔널 Int 타입 선언
optInt = 30;

var optStr: String? // 옵셔널 String 타입 선언
optStr = "Swift";

var optArr: [String]? // 옵셔널 Array 타입 선언
optArr = ["C", "Java", "SmallTalk"];

var optDic: Dictionary<String, String>? // 옵셔널 Dictionary 타입 선언
optDic = ["Korea": "Seoul", "Japan": "Tokyo", "China": "Beijing"];

3. 옵셔널 값 처리

  • 앞 서 말했듯이 옵셔널 타입의 결과 값은 그 자체로 아무것도 할 수 없기에 명시적 해제와 묵시적 해제를 통해 옵셔널 언래핑을 해줘야 한다.
  • 명시적 해제는 '강제적 해제'와 '비강제적 해제'로 나누어 지고, 묵시적 해제는 '컴파일러에 의한 자동 해제'와 '연산자를 사용한 자동해제'로 나누어 진다.

4. 옵셔널 강제 해제

  • 옵셔널을 강제 해제하는 방법은 옵셔널 타입의 값 뒤에 '!'만 붙여주면 된다. 이 '!'를 강제 해제 연산자라고 한다.
  • 옵셔널 강제 해제 시, nil 값이면 해제가 되지 않는다.
print("옵셔널 강제해제 : \(optInt!)"); // 옵셔널 강제해제 : 30
print("옵셔널 해제안함 : \(optInt)"); // 옵셔널 해제안함 : Optional(30)

var intFromStr = Int(optStr);

guard intFromStr != nil else {
	print("값 변환에 실패");
}

5. 옵셔널 바인딩(비강제적 해제)

  • 함수나 조건문을 통해 옵셔널 언래핑을 해준다.
func intToStr(str: String) {

    guard intFromStr = Int(str) else {
        print("값 변환에 실패");
        return;
    }
    
    print("변환된 값은 \(intFromStr));
}

6. 컴파일러에 의한 옵셔널 자동 해제

  • 비교 연산자를 사용하는 경우, 한쪽 타입이 옵셔널, 다른 한쪽이 일반 타입이라면 자동으로 옵셔널을 해제한다.
if (optInt == 30) {
    print("optInt == 30");
} else {
    print("optInt != 30");
}
// optInt == 30

7. 옵셔널의 묵시적 해제

  • 묵시적 해제 구문은 '?' 연산자 대신 '!' 연산자만 붙여주면 된다.
  • 변수의 값이 nil이 될 가능성이 있다면 묵시적 옵셔널 해제를 사용하면 안된다.
  • 묵시적 옵셔널이 유용하게 사용되는 경우는 클래스 또는 구조체에서 사용된다.
var optInt: Int! // 묵시적 옵셔널 Int 타입 선언
optInt = 30;

var optStr: String! // 묵시적 옵셔널 String 타입 선언
optStr = "Swift";

var optArr: [String]! // 묵시적 옵셔널 Array 타입 선언
optArr = ["C", "Java", "SmallTalk"];

var optDic: Dictionary<String, String>! // 묵시적 옵셔널 Dictionary 타입 선언
optDic = ["Korea": "Seoul", "Japan": "Tokyo", "China": "Beijing"];
profile
개발자

0개의 댓글