대메뉴 바로가기 본문 바로가기

데이터 기술 자료

데이터 기술 자료 상세보기
제목 스위프트 고급 문법(열거형과 프로퍼티)
등록일 조회수 4227
첨부파일  

스위프트 파헤치기

스위프트 고급 문법(열거형과 프로퍼티)



스위프트 언어에서 사용되는 열거형(Enumerations)과 구조체, 또는 열거형과 값들을 연결해 주는 방식의 일종인 속성(Properties)에 대해서 알아보겠다. enum 등은 다른 언어에서도 자주 사용되는 타입이기 때문에 이해에 어려움이 없지만, 스위프트의 프로퍼티는 여러 가지 방식의 조합으로 사용된다.



열거형(Enumerations)

열거형은 일반적으로 정해진 형식의 값들을 그룹으로 묶어서 정의하는 용도로 사용된다. C언어등에서 열거형은 정수들을 구성 요소로 가지고 있으며 정수로 값들을 표현한다. 스위프트 언어에서 열거형은 정수 이외의 다른 값(string, char, int, float)들도 사용할 수 있으며, 좀 더 유연하게 표현될 수 있다. 또한, 초기의 클래스 멤버 값을 정할 때 사용하는 이니셜라이저(Initializer)를 제공할 수도 있다.

● 열거형의 문법
열거형의 표현할 때는 다음과 같이 enum 이라는 키워드를 사용하게 된다.

enum Index {
// 이곳에 열거형에 해당되는 값들을 기술한다.
}

다음 예제는 열거형을 사용해서 멤버값들을 나열해 본 것이다. 여기서 case 키워드는 열거형의 멤버값들이 새로운 줄에 정의된다는 의미다. case 다음에 사용된 값들(One, Two, Three, Four, Five)은 C언어나 Objective-C언어에서 사용했던 순서를 의미하는 정수로 쓴 것이 아니고 각각의 값들이 ‘Index’라는 타입의 멤버로 명시적으로 사용된 것이다.



enum Index { case One case Two case Three case Four case Five }



여러줄에 나누어서 기술한 값들은 다음과 같이 콤마 기호(,)를 사용해서 한줄로 표시할 수도 있다.



enum Index { case One, Two, Three, Four, Five }



새로운 열거형을 표기할 때는 맨앞을 대문자로 써주고 복수형이 아닌 단수형으로 써주는 것이 자연스럽게 보일것이다. 열거형을 사용할 때 다음과 같이 해당값을 사용하게 되는데, 복수형이면 어색하게 보일 것이다.

var number = Index.One

위의 표기 예에서 number라는 타입은 열거형 ‘Index’가 표기할 수 있는 값 중의 하나가 되고 초기화 될 때 타입이 정해진다. 이후에 나오는 열거형 멤버값들을 표시할 때는 다음과 같이 ‘Index’를 쓰지 않아도 된다.

number = .Two

이렇게 표기하면 열거형의 멤버값을 표기할 때 가독성이 높은 코드가 될 수 있다.

● 열거형과 스위치문의 사용
일반적으로 C언어 등에서는 열거형으로 사용하게 되는 값에는 조건 등을 나열하지 않고 단순히 순서만을 전달하는 경우가 대부분이다. 하지만, 스위프트의 열거형으로 정의한 값을 사용할 때는 선택형 문장인 Switch 문을 사용할 수 있다. 다음의 예제는 조건문인 Switch 문을 사용해서 열거형의 값을 전달하기 위한 코드다.



var number = Index.One number = .Three switch number { case .One: print(“첫번째 열거형 값”) case .Two: print(“두번째 열거형 값”) case .Three: print(“세번째 열거형 값”) case .Four: print(“네번째 열거형 값”) case .Five: print(“다섯번째 열거형 값”) }



이 예제에서 number의 값을 .Three로 입력했으므로 결과는 <그림 1>과 같이 출력될 것이다. 이런식으로 열거형을 switch 문을 사용해서 명시적으로 표시하는 것이 가능하다.





또한 switch 문을 사용할 때 특별한 case를 제공하기 곤란한 경우 다른 언어와 마찬가지로 다음 코드로 기본값을 적용하는 것도 가능하다.

default:
print(“기본값의 적용”)

● 연관된 값의 적용
앞에서 열거형 값을 정의하는 방법과 상수와 변수를 열거형 타입에 적용하는 방식을 확인했고, 그것을 switch 문 등을 통해서 활용하는 방안에 대해서도 알아 보았다. 이외에도 스위프트의 특징은 여러 가지 타입을 열거형으로 지원한다는 것이다. 이번에는 바코드 타입을 열거형의 멤버로 사용해서 처리하는 경우를 살펴보겠다.

바코드는 14개 정도의 종류가 있고, 상품이나 도서등의 분류를 위해서 사용하게 된다. 가장 평범하게 막대 형태로 된 범용 상품 기호(Universal Product Code, UPC)를 표시하는 1차원 바코드가 있고, 도형 형태로 된 큐알코드(QR Code), 데이터 매트릭스(Data Matrix), 맥시 코드(Maxi code), 마이크로피디에프417 (MicroPDF417) 등이 있다.





이번 예제에는 0~9까지 10개의 숫자 조합으로 사용되는 UPC-A 타입의 바코드와 3개의 위치 확인 도형과 데이터 셀의 영역으로 이루어진 큐알코드 형태를 사용해서 구성되는 것들을 알아보겠다. A 타입의 바코드는 숫자로 표시할 수 있기 때문에 다음과 같이 튜플로 열거형 타입을 늘려갈 수 있다. 또한 큐알코드, 데이터 매트릭스, 맥시코드 등은 문자열 타입으로 정의할 수 있다.



enum BarcodeIndex { case UPCA(Int, Int, Int, Int) case QRCode(String) case DataMatrix(String) case MaxiCode(String) } var BarcodeInfo = BarcodeIndex.UPCA(0, 12345, 67890, 5) BarcodeInfo = .QRCode(“ABCDEFGHIJK”) BarcodeInfo = .DataMatrix(“ABCDEF”) BarcodeInfo = .MaxiCode(“ABCDE”)



이후부터 바코드들을 다음과 같이 특정 변수로 지정해 사용할 수 있다. 다음은 바코드 타입의 열거형을 BarcodeInfo라는 변수에 저장한 경우다.



var BarcodeInfo = BarcodeIndex.UPCA(0, 12345, 67890, 5) BarcodeInfo = .QRCode(“ABCDEFGHIJK”) BarcodeInfo = .DataMatrix(“ABCDEF”) BarcodeInfo = .MaxiCode(“ABCDE”)



이것은 switch 문으로 다음과 같이 표현될 수도 있다. 이 때 열거형의 멤버값에 대해서 인자로 사용되는 상수(let)나 변수(var)를 명시적으로 표시해줄 수도 있다.



switch BarcodeInfo { case .UPCA(let num01, let num02, let num03, let num04): print(“UPC-A: (num01), (num02), (num03), (num04).”) case .QRCode(let str01): print(“QR code: (str01).”) case .DataMatrix(let str01): print(“DataMatrix: (str01).”) case .MaxiCode(let str01): print(“MaxiCode: (str01).”) default: print(“NA”) }



상수나 변수의 타입이 case 별로 모두 같다면 case의 바로 다음에 대표값으로 표시할 수도 있다.



switch BarcodeInfo { case let.UPCA(num01, num02, num03, num04): print(“UPC-A: (num01), (num02), (num03), (num04).”) … }



● 원시 값(Raw Values)
프로그램 언어에서 열거형을 사용할 때 멤버값으로 하나의 값을 지정하면 그 이후에는 자동으로 값이 증가하는 형식으로 자주 사용된다. 일반적으로 정수형으로 지정해서 사용되는데 스위프트에서는 다른 형식들도 지정할 수 있다. 다만, 정수형이 아닌 열거형 멤버들은 모든 같은 타입으로 채우는 것을 기본으로 한다. 예를 들면 다음과 같이 어떤 ASCII 문자에 대해서 ‘Character’형으로 열거형을 선언했을 때 지정된 경우가 나오게 되면 열거형의 원시 값(Raw Value)에서 지정한 형식으로 해석을 한다는 의미다.



enum ASCIIControl: Character { case Tab = “ ” case LineFeed = “ ” case CarriageReturn = “ ” }



정수형의 열거형 멤버값은 다음과 같이 표현될 수 있다. 다음에서 첫번째 멤버값인 ‘1’ 이후에 자동으로 값이 +1씩 증가된 것을 확인할 수 있고, 열거형의 멤버값 중에서 ‘Three’가 이러한 규칙에 따라서 3이라는 값이 할당된 것을 알 수 있다.



역으로 열거형의 세 번째 값이 ‘Three’라는 것을 알 수 있게 해주는 방법이 있다. 다음과 같이 rowValue를 인자로 사용하면 열거형에서 ‘3’에 해당되는 멤버값이 어떤 것인지 알려줄 수 있다.



● 원시 값으로 부터의 초기화

열거형의 값을 원시 값으로부터 초기화 해야할 경우가 있다. 이럴 때 다음과 같이 ‘let’ 키워드를 사용해서 명시적으로 열거형 멤버값을 지정해 줄 수가 있다. <그림 6>의 코드는 ‘NumberPosition’이라는 상수를 사용해서 멤버값을 7로 지정한 경우다.



프로퍼티(Properties)

스위프트에서 프로퍼티는 주로 특별한 클래스와 구조체, 열거형을 연결해 주는 역할을 담당한다. 각각의 성격에 따라서 저장 프로퍼티(Stored property), 계산 프로퍼티(Computed property), 타입 프로퍼티(type property)로 나누어서 설명할 수 있다. 개발자는 이들 프로퍼티 값의 변경 사항 등을 프로퍼티 옵저버(property observer)라는 것으로 모니터링할 수 있다.

● 저장 프로퍼티(Stored Properties)
저장 프로퍼티는 가장 단순한 형태로 클래스와 구조체의 인스턴스에 저장될 수 있는 상수나 변수를 표현할 때 사용한다. 저장할 때 키워드로 속성을 구별할 수 있다. 변수는 var, 상수는 let으로 선언할 수 있다. 개발자는 저장 프로퍼티를 위한 초기값을 지정할 수 있는데, 단순히 프로퍼티로 선언한 상수나 변수 다음에 값을 써주면 된다. 상수로 선언된 프로퍼티는 한번 생성되면 수정할 수 없다.

● 계산 프로퍼티(Computed Properties)
계산 프로퍼티는 실제로 값을 저장하는 성질은 가지고 있지 않고, 다른 프로퍼티나 값을 통해서 간접적으로 제공하는 getter와 setter의 역할을 담당한다. 주로 좌표 등의 계산을 수행하는 함수 등에서 사용된다.

● 프로퍼티 옵저버(Property Observers)
프로퍼티 옵저버는 프로퍼티 값의 변경 사항이나 할당되는 순간에 이벤트를 발생시켜서 값을 모니터링 할 수 있게 해주는 도구다. 값이 저장되기 전에 호출되는 willSet과 새로운 값이 저장될 때마다 호출되는 didSet이라는 옵션이 있다. 만약 willSet이 구현돼서 포함된다면 새로운 프로퍼티 값은 newValue라는 상수 형태의 인자로 전달될 수 있다. didSet은 이전의 속성값을 상수 인자로 전달하게 되고, oldValue라는 이름을 사용할 수 있다.



다음의 코드는 하루 동안 이동한 거리를 측정하는 예제다. 여기서 newValue(=newTotalSteps)와 oldValue에 해당되는 값을 사용해서 변경되는 동작들을 모니터링했다. 이외에도 전역 변수와 지역 변수를 모니터링하는 방법을 제공하고 있고, 타입 프로퍼티를 사용해서 클래스와 구조체등의 값에 대해서 변동을 모니터링 할 수 있도록 해 준다.

이번 호에서는 스위프트 프로그램에서 사용되는 열거형과 프로퍼티들에 대해서 알아보았다. 다른 프로그램 언어와 유사한 방식으로 열거형과 프로퍼티들을 사용하고 있지만 좀 더 다양한 타입들을 열거형에 사용할 수 있게 해준다. 또한, 구조체와 클래스 등에서 사용된 값들을 모니터링 할 수 있도록 프로퍼티 옵저버 등과 같은 방식을 제공해서 개발자들이 클래스나 구조체에서 생성한 인스턴스의 값들을 디버깅하기 쉽도록 도와준다.



출처 : 마이크로소프트웨어 8월호

제공 : 데이터 전문가 지식포털 DBguide.net