반응형

 Swift 에는 클로저 (Closures) 라는 개념이 존재한다.

얼핏 봐서는 코드를 간결하게 짤 수 있게 해주는 기능을 하는 것 같고,

실제로 적용해서 많이 사용해봐야 익숙해 질 것 같은 기능이다. 

클로저는 필수적이라기 보다는 Swift 를 더 잘 사용하기 위한 기능에 가까운 것 같아서

처음 배울 때는 한 번에 완벽하게 이해하고 지나가기 보다 개념 정도와 기본적인 사용법 정도만 알고 지나가면 될 것 같다.




클로저 (Closures) 란 ?


 클로저 란 간단하게 설명하자면 코드 블럭이다. 

함수를 코드들의 모임이라고 설명했었는데, 클로저는 함수 보다 더 포괄적인 개념으로 생각하면된다.

(함수도 클로저의 일종이다.)

다만 Swift 에서는 클로저의 개념이 주로 이름이 없는 함수 (익명 함수)로 많이 활용되는 것 같다.

클로저를 통해 일회성으로 사용 되는 함수를 간결한 형태로 표현하려고 하기 때문이다.

Swift 공식 문서에 따르면 클로저는 세 가지 형태가 있다고 한다.

  1.  이름이 있고, 어떤 값도 획득하지 않는 전역함수 
  2.  이름이 있고, 값을 가지고 있는 함수로 부터 값을 획득할 수 있는 중첩된 함수
  3.  이름이 없고, 주변 문맥에 따라 값을 획득할 수 있는 축약된 문법의 표현 

이렇게 세 가지가 있다고 하는데 말로만 들어서는 이해가 바로 되진 않는다.




클로저 표현법


 클로저의 표현법은 다음과 같다.


{ (파라미터) -> 리턴타입 in 

//코드 작성 

}


 대충봐도 함수와 뭔가 비슷한 느낌이 든다.




클로저의 기본적인 사용법


Swift 공식 문서의 예제를 통해 간단하게 클로저의 기본적인 사용법만 따라해 보았다.

예제는 sorted(by: ) 메서드를 통해 이름 값을 가지고 있는 배열을 알파벳 역순으로 정렬하는 예제이다.

( sorted() 메서드에 대한 정보는 https://developer.apple.com/documentation/swift/array/1688499-sort 참고)




그림을 보면 sorted(by: ) 함수를 클로저 문법을 사용하면 간단하게 표현이 가능하다.

sorted(by: ) 함수 처럼 공통으로 사용되는 함수가 아니라면 지나치게 축약된 표현은 오히려 코드의 가독성을 떨어뜨릴 것 같다.



이외에도 클로저에 대해 값 획득이나 클로저의 참조 타입, Escaping Closures, Autoclosures 에 대한 개념들을

추가로 공부해야한다. 

처음 공부할 때에는 Swift 의 코드를 간결하고 깔끔하게 만드는 것 보다 익숙해지고 많이 사용하는게 더 

중요하기 때문에 추후에 코드들을 많이 접하고 나서 나머지 개념들도 다루도록 해야겠다.












* 해당 포스팅은 스위프트(Swift)4  버전을 기준으로 하고 있습니다.

* 참고 : https://swift.org/ 



 



반응형

'IT 정보 로그캣 > Swift' 카테고리의 다른 글

[Swift 공부] 함수  (0) 2018.12.15
[Swift 공부] 반복문  (0) 2018.11.11
[Swift 공부] 조건문  (0) 2018.11.10
[Swift 공부] 기본 연산자  (0) 2018.11.04
[Swift 공부] 컬렉션 타입이란 ?  (0) 2018.11.03
반응형

 Swift를 제대로 사용하기 위해 함수에 대해서 알아보자.

프로그래밍 언어에서 함수는 특정한 작업을 수행하는 코드들의 모임이다.

어떤 프로그램에서 코드들이 쭉 있다면 그중 일부분을 떼어와서 그룹화 시키고 그 그룹에 이름을 붙여주는 것과 같다.

매번 똑같은 코드를 복붙하는건 귀찮고 비효율적이기 때문에 간단하게 함수명만으로 코드들을 호출하는 것이다.

(항상 말하지만 결국은 프로그래머 좋으라고...ㅎㅎ)


 예전에는 함수를 그날 기분에 따라 함수 또는 메서드로 불렀는데 사실 함수와 메서드는 엄밀히 따지자면 조금 다르다.

함수가 메서드의 상위 개념이고, 보통 전역으로 사용하는 함수를 "함수" 라고 부르고 객체지향 언어에서 클래스,구조체 등의 내부에서 사용하는 함수를 메서드라 부른다. 즉 메서드는 멤버함수를 의미한다.

(메서드를 항상 메소드라 적었는데 표기법도 찾아 봤더니 국립국어원 표준국어대사전에 따르면 "메서드"가 올바른 표기법이라 한다.)




Swift의 함수


 다른 프로그래밍 언어의 함수와 비교하자면 Swift의 함수는 기본적인 형태는 자바나 다른 프로그래밍 언어와 

비슷하지만 함수의 자유도가 비교적 높은 편이다.

자유도가 높다고 한 이유는 함수의 중요한 요소인 매개변수와 리턴 타입 등을 다양한 형태로 사용할 수 있고, 

함수 자체를 매개변수나 리턴 타입으로 사용 하는 등 함수를  다양하게 정의할 수 있기 때문이다.

또한 기본적으로 함수의 오버라이드(재정의), 오버로드(중복 정의)를 모두 지원한다.

Swift는 함수를 선언할 때 func 이라는 키워드를 사용한다.  

리턴타입은 -> 를 사용하고, 리턴은 말그대로 return 이라는 키워드를 사용한다.




Swift의 기본적인 함수 사용법


기본적인 함수 형태는 다음과 같다. 


func 함수명 (매개변수...) -> 리턴 타입

//코드작성

return 리턴 값 

}


이 형태를 기본으로 다양하게 활용이 가능하다. 

다만 리턴 타입이 없는 경우에는 생략해도 되고 [ -> Void ] 를 넣어줘도 된다.




함수의 매개변수 이름과 전달인자 레이블


 Swift 의 함수는 매개변수 이름을 지정해주는 것 뿐만 아니라 전달인자 레이블 이라는 것도 지정해 줄 수 있다.

매개변수 이름은 함수내에서 매개변수를 호출할 때 사용하고, 전달인자 레이블은 함수를 호출해서 사용할 때 변수들을 쉽게 구분하기 위한 용도 정도로 사용한다. 

자바 처럼 함수를 호출하여 매개변수를 넣을 때 별다른 명칭없이 넣고 싶으면 와일드카드 식별자 ( _ ) 를 넣어주면 된다.

( 전달인자 레이블 명을 바꿔도 함수를 오버로드 하여 사용할 수 있다!)





함수의 매개변수 기본값


 Swift의 함수는 매개변수에 기본값을 줄 수 있다. 

그리고 기본값이 지정되어 있는 매개변수는 보통 앞쪽에 배치된다.





함수의 가변 매개변수


 코딩을 하다보면 매개변수가 유동적으로 들어가야하는 경우가 있는데 이 때 가변 매개변수를 사용하면 된다.

가변 매개변수는 함수마다 하나씩만 사용이 가능하고, 가변 매개변수는 배열처럼 사용이 가능하다.




함수의 입출력 매개변수


 프로그래밍 언어를 공부하다보면 call by value 와 call by reference 를 접하게된다. 

call by value 는 값을 복사해서 사용하는 형태이고 call by reference 는 참조로 객체를 전달하는 형태이다.

보통 매개변수는 call by value 로 값만 복사해서 사용하는데 C 언어의 포인터처럼 call by reference 로 참조하고 싶을 때

사용하는 것이 입출력 매개변수이다. 매개변수 타입 앞에 inout을 붙여주면 되고 함수를 호출할 때에는 참조했다는 표시로 

앰퍼샌드(&)를 붙여준다. 입출력 매개변수의 값을 변경하면 참조이기 때문에 할당한 참조의 값도 변경된다.

(애초에 참조가 아니면 함수에서 매개변수의 값을 변경하는게 불가능하다.)





함수 타입 


 Swift 에서 함수는 일급 객체로 함수 자체를 타입을 사용할 수 있다. 

함수를 데이터 타입 뿐만 아니라 매개변수 타입이나 리턴 타입으로도 사용이 가능하다.




 이외에도 함수 안에 함수를 중첩하여 사용하는 등 Swift 의 함수는 다양하게 사용이 가능하므로 

코딩을 하면서 조금씩 자기에게 필요한 형태의 함수를 찾아 사용하는게 좋겠다.






* 해당 포스팅은 스위프트(Swift)4  버전을 기준으로 하고 있습니다.

* 참고 : https://swift.org/ 






반응형

'IT 정보 로그캣 > Swift' 카테고리의 다른 글

[Swift 공부] 클로져 (Cloures) 란?  (0) 2019.01.13
[Swift 공부] 반복문  (0) 2018.11.11
[Swift 공부] 조건문  (0) 2018.11.10
[Swift 공부] 기본 연산자  (0) 2018.11.04
[Swift 공부] 컬렉션 타입이란 ?  (0) 2018.11.03
반응형

 Swift 의 흐름제어 (Control Flow) 에는 조건문과 반복문이 있다. 

조건문에는 IF 문과 Switch 문이 있었고




2018/11/10 - [IT 정보 로그캣/Swift] - [Swift 공부] 조건문




이번에 살펴볼 반복문에는 For-In while 구문이 있다. 

반복문은 이름 그대로 어떠한 작업을 반복하기 위해서 필요한 것들인데 이름에서부터 왜 필요한지 느껴진다. 

코드나 상황을 반복해야할 때 Ctrl + c , Ctrl + v  는 지겹고도 비효율적이기 때문이다. 

(이것도 결국 프로그래머 좋으라고 있는..)




For - In 


 For - In 구문은 우리가 자바에서 사용하던 for - each 구문과 똑같다고 보면된다. 

기존에 사용하던 for ( ~ ; ~ ; ~ ) 형태의 구문이 Swift 에서는 사라졌는데  (Swift 3 부터 없어졌다.) 

아마도 For - In  구문이 더 간단하기도 하고, For - In 구문만으로도 충분하다고 생각한 것 같다.

For - In 구문은 배열, 수의 범위, 딕셔너리 같은 시퀀스를 다루는데 사용한다. 



그림 1 > 배열을 이용한 For - In 








그림 2 > 딕셔너리를 이용한 For - In






그림 3 > 수의 범위를 이용한 For - In ( 따로 시퀀스가 필요없는 경우 와일드 카드 패턴을 이용할 수도 있다.)



 For - In 구문에서 stride(from : 값1 to : 값2 by: 값3 ) 라는 함수를 사용할 수도 있다. stride 함수는 두 수 사이에 특정한 값의 간격을 주어 시퀀스를 사용할 수 있게 한다. 함수를 풀이해보자면 from 의 값1 부터 to 의 값2 까지 by 의 값3 씩 간격을 준다는 의미이다.

 * stride 함수에는 (from : 값1 to : 값2 by : 값3) 와 (from : 값1 through : 값2 by: 값3 ) 의 형태가 있는데 to 를 사용하는 경우에는 마지막값이 포함되지 않고, through 를 사용하는 경우 마지막값까지 포함한다 ( 미만과 이하 의 차이라고 생각하면 된다.)


그림 4 > For - In 구문에 Stride (from : 값1 to : 값2 by : 값3) 함수 사용








그림 5 > For - In 구문에 Stride (from : 값1 through : 값2 by : 값3) 함수 사용





while


 while 구문에는 그냥 while 을 사용하는 것과 repeat - while 을 사용하는 2가지 방법이 있다. 

두개 의 차이는 자바로 비교하면 while 과 do - while 의 차이라고 볼 수 있다. ( 실제로 do 를 repeat 으로 바꾼 것 뿐이다)

 while 은 조건부터 체크하여 조건이 만족할 때에만 { } 안의 코드를 실행 시키지만 repeat - while 은 일단 { } 안의 코드를 한번 실행시키고 그다음 (2회 차) 부터 조건을 체크하여 { } 안의 코드를 실행 시킬지 결정한다.


그림 6 > while 구문









그림 7 > repeat - while 구문

반응형

'IT 정보 로그캣 > Swift' 카테고리의 다른 글

[Swift 공부] 클로져 (Cloures) 란?  (0) 2019.01.13
[Swift 공부] 함수  (0) 2018.12.15
[Swift 공부] 조건문  (0) 2018.11.10
[Swift 공부] 기본 연산자  (0) 2018.11.04
[Swift 공부] 컬렉션 타입이란 ?  (0) 2018.11.03
반응형

 Swift 에도 다른 프로그래밍 언어와 마찬가지로 코드를 짤 때 가장 중요한 흐름제어 (Control Flow) 인 

조건문과 반복문이 있다. 

그 중에 조건문에는  IF 문과 Switch 문이 있는데, 각각 Swift 만의 특징을 가지고 있다. 




IF 문

 

 조건문 중에 하나인 IF 문은 평범하게(?) if ~ else if ~ else 로 사용 된다. 

다만 Swift 의 경우 IF 문의 조건을 입력할 때 소괄호 ( )를 생략할 수 있다. 개인적으로는 습관이기도 하고 코드의 구분이 더 

쉬운 것 같기도해서 괄호를 넣는 편이다.

또 한가지 특징이 더 있는데 IF 문의 조건은 무조건 Bool 타입 (true / false) 만 사용해야한다. 

Swift 에서는 true 와 false 를 1 과 0 의 값으로 사용하지 않기 때문이다. 



그림 1 > IF 문 사용법




Switch 문


 조건문으로 Switch 문도 있는데 Swift 의 Switch 문은 특이점이 많다. 그만큼 활용도가 높다는 뜻이기도 하다.

Swift 공식문서에서도 여러가지 Switch 문의 활용 방법을 소개해주고 있는데 각각 다음과 같다.


1. default 사용 


 Swift 의 Switch 문은 조건의 범위를 모두 포함하고 있어야한다. 이게 무슨 말이냐면 조건에 해당하는 범위가 case 에 모두

포함되지 않으면 default 를 추가하여 여기다가 나머지 조건들을 처리해줘야 한다는 것이다.

예를들어 아래의 그림에서 처럼 조건이 알파벳이라고 가정하면 case 에 있는 "a", "b" 이외의 case 상황은 default 를 사용하여 처리해줘야한다.  다른 말로하면 case 에 a~z 까지 모두 있다면 default 는 없어도 된다.



그림 2 > Switch 문의 기본 사용법



2. break 의 생략과 fallthrough


 Switch 문에서 조건에 소괄호 ( )를 생략할 수 있는건 당연하고, case 의 break 생략도 가능하다. 

자바와 비교하자면 자바의 Switch 문 에서는 break 가 없으면 조건에 맞는 case 부터 그 아래에 있는 

case 의 코드들 까지 모두 실행되지만 Swift 에서는 break 가 없어도 자동으로 해당하는 case 의 코드만 실행해 준다. 

그래서 Swift 에서는 조건에 맞는 case 부터 그 아래에 있는 case 코드들 까지 모두 실행 하려면 fallthrough 를 입력해줘야 한다. 





그림 3 > Switch 문 fallthrough 사용법



3. 범위 연산자 사용


 Swift 의 Switch 문은 case에 범위 연산자도 사용할 수 있다. 그리고 case 에는 비교값을 여러개 넣을 수도 있다.



그림 4 > Switch 문의 범위연산자 사용과 여러 값 비교 법



4. 튜플 (Tuples) 사용과 값 바인딩

 

 Switch 문의 case 에는 튜플도 사용이 가능한데 여기서 끝이 아니라 튜플안에 들어있는 값 대신에 와일드 카드패턴( _ ) 

까지 사용할 수있다. 와일드 카드패턴 이란 언더 바 ( _ ) 를 사용하여 어떤 값의 자리를 대신 채워주는 것이다. 

대신 해당 값 자체는 무시한다.(Swift 에는 와일드 카드패턴 이외에도 다양한 패턴이 존재한다.)

값 자체를 무시하기 때문에 무시된 어떠한 값을 사용할 수 없는 불편함이 있다... 

그래서 이를 해결하기 위해 값 바인딩을 사용하면 된다!

값 바인딩 이란 별건 아니고 와일드 카드 패턴 ( _ ) 대신에 상수를 선언하듯이 [ let 변수명 ] 을 넣어줘서 해당 값까지 사용할 수 있도록 하는 것이다.


그림 5 > Switch 문에서 튜플 사용과 값 바인딩



4. Where 


  Swift 의 Switch 문에서 가장 특이한 점은 Where 을 사용할 수 있다는 것이다. 

Where 은 우리가 sql 쿼리를 사용할 때 보던 것과 비슷한데 case 에 조건을 추가하고 싶을 때 사용할 수 있다.

사용하기에 따라 다양하게 활용할 수 있을 것 같다.



그림 6 > Switch 문에서 Where 의 사용법







* 해당 포스팅은 스위프트(Swift)4  버전을 기준으로 하고 있습니다.

* 참고 : https://swift.org/ 


반응형

'IT 정보 로그캣 > Swift' 카테고리의 다른 글

[Swift 공부] 함수  (0) 2018.12.15
[Swift 공부] 반복문  (0) 2018.11.11
[Swift 공부] 기본 연산자  (0) 2018.11.04
[Swift 공부] 컬렉션 타입이란 ?  (0) 2018.11.03
[Swift 공부] 튜플(Tuple)이란?  (0) 2018.10.28
반응형

 코딩을 하다보면 단순한 숫자 사칙연산 부터 시작해서 , 변수들을 합치거나 비교하는 등의 작업들이 많다.

이러한 작업들을 가능하게 해주는게 연산자(operator) 이다. 

주의할 점이 있다면 연산자는 보통 같은 데이터 타입끼리 사용이 가능하다. 

만약 서로 다른 두 데이터 타입에 연산자를 사용하려면 타입 캐스팅이라고 해서 한 쪽의 데이터 타입을 바꿔서 둘 다

똑같은 데이터 타입으로 만들어줘야한다.



연산자(operaotr)란


 프로그래밍 언어에서 연산자란 수학연산 등의 특정한 작업을 하기 위한 기호를 의미한다. 

연산자를 단항 연산자(Unary) , 이항 연산자(binary), 삼항 연산자(ternary)  로 분류하기도 하는데

이름만 어렵지 그냥 피연산자(연산하는 값) 의 개수에 따라 구분한 것이다. 

예를들면 다음과 같다.


1. 단항 연산자 예시 : - A 


2. 이항 연산자 예시 : A+B


3. 삼항 연산자 예시 : A ? B : C ( A 의 값이 true 이면 B , false 이면 C 를 선택)


결국 연산하는 값 ( A , B, C 의 개수)이 몇 개 인가 구분한 것으로 그렇게 중요한 개념은 아니다 :)

특이한 점이 있다면 Swift에는 삼항 연산자가 위에 예시 하나밖에 없다. 




할당 연산자 (Assignment Operator)


 번역해서 표현하다보니 이름만 뭔가 복잡하다. 할당 연산자는 이름 그대로 값을 할당하는 연산자로 ( = ) 이다.


연산자 

사용법 

설명 

할당 연산자 ( = ) 

A = B 

 A 에 B 의 값을 넣는다




산술 연산자 (Arithmetic Operator)


 마찬가지로 이름 그대로 산술을 하게 해주는 연산자로 더하기 ( + ), 빼기 ( - ), 곱하기 ( * ), 나누기( / ) 이다.

한가지 추가하자면 나누기의 나머지 값을 반환해주는 나머지 연산자 ( % ) 도 있다.


연산자 

 사용법

설명 

더하기 연산자 ( + )

A + B 

A 값에 B 의 값을 더한다

빼기 연산자 ( - )

A - B 

A 값에 B 값을 뺀다

곱하기 연산자 ( * )

A * B 

A 값에 B 값을 곱한다

나누기 연산자 ( / ) 

A / B 

값을 B로 나눈다.

나머지 연산자 ( % )

A % B 

A 값을 B 로 나눈 나머지 값




비교 연산자 (Comparison Operator)


 비교 연산자는 비교를 하는 건데 같은지, 다른지, 대소 비교 등을 할 때 사용한다. 

비교 연산자는 모두 true / false 로 boolean 값을 반환 한다.


연산자 

사용법 

설명 

같다 ( == ) 

A == B

 A 값과 B 값이 같은가?

같지 않다 ( != )

A != B

A 값과 B 값이 다른가? 

크다 ( > )

A > B 

A 값이 B 값 보다 큰가?

작다 ( < ) 

A < B 

A 값이 B 값 보다 작은가?

크거나 같다 ( >= ) 

A >= B 

A 값이 B 값 보다 크거나 같은가?

작거나 같다 ( <= ) 

A <= B

A 값이 B 값 보다 작거나 같은가?

참조가 같다  ( === )   

A === B

참조타입 A 와 B 가 같은 인스턴스 

인가?

참조가 같지 않다 ( !== )

A !== B

참조타입 A 와 B 가 다른 인스턴스 

인가?

패턴 매치 ( ~= )

A ~= B 

A 와 B 의 패턴이 일치하는가?




범위 연산자 (Range Operator)


값의 범위를 나타내는 연산자이다. 주로 배열이나 for 문에 쓰인다.


연산자 

사용법 

설명 

힌 연산자 ( ... )

 A...B

A 이상 ~ B 이하  

반만 열린 연산자 ( ..< )

A..<B 

A 이상 ~ B 미만 

한방향 연산자 ( ~... )

A... 

A 이상 

한방향 연산자 ( ...~ )

...A 

A 이하

한방향 연산자 ( ..< ~)

..< A

A 미만 




논리 연산자 (Logical Operator)


 논리 연산자는 true / false (boolean) 의 논리 연산 하는 연산자이다.


연산자 

사용법 

설명 

NOT 연산자 

 !A 

 A가 true 이면 false, false 이면 true

AND 연산자 

A && B 

 A 와 B 모두 해당 하는가?

OR  연산자

A || B 

A 나 B  둘 중 하나라도 해당 하는가?

 


복합 할당 연산자 (Compound Assignment Operator)


 복합 할당 연산자는 할당 연산자인 ( = ) 앞에 추가적으로 연산자를 붙이는 것으로 추가적 연산을 하고 할당까지 해준다.



연산자

사용법 

설명 

 ( += )

A += B 

A 값과 B 값을 더해서 A 에 할당 

 ( -= )

A -= B 

A 값에서 B 값을 뺀 값을 A 에 할당

 ( *= )

A *= B 

A 값과 B 값을 곱한 값을 A 에 할당

 ( /= )

A /= B 

A 값을 B값으로 나눈 값을 A 에 할당

 ( %=)

A %= B 

A 값을 B값으로 나눈 나머지 값을 A 에 할당

 









* 해당 포스팅은 스위프트(Swift)4  버전을 기준으로 하고 있습니다.

* 참고 : https://swift.org/ 


반응형
반응형

 기본적인 데이터 타입들을 공부하고 나면 다음으로 컬렉션 타입 (Collection Type) 을 공부하게 된다. 

컬렉션 타입은 보통 프로그래밍 언어마다 거의 비슷하거나 같은 형태를 하고 있다. 

그렇기 때문에 하나의 프로그래밍 언어를 익혀서 사용하고 있다면 금방 이해하고 사용하기 쉽다. 




컬렉션 타입 (Collection Type)이란?


 컬렉션 타입은 데이터들의 집합 이라 할 수 있다. 

컬렉션 타입의 이름에서도 알 수 있듯이 Collection 의 뜻 처럼 무리, 모음, 수집 등을 의미하는 것이다.

Swift 에서 컬렉션 타입이란 지정된 타입의 데이터들의 묶음이다.

굳이 지정된 (데이터) 타입이라고 하는 이유는 Swift에서는 컬렉션 타입들이 모두 제네릭 컬렉션 (Generic Collection) 으로 구현되어 있기 때문이다.


 그럼 제네릭(Generic)이란 무엇인가? 


제네릭이란 컬렉션 타입에 여러가지 데이터 타입들을 담을 수 있도록 지정할 수 있다는 의미이다. 

튜플 처럼 하나의 컬렉션 타입에 여러개의 데이터 타입들을 담을 수 있다는 건 아니고 하나의 컬렉션 타입은 하나의 데이터 타입만을 담을 수 있다. 

Generic 의 뜻처럼 포괄적인 데이터 타입을 담을 수 있도록 한다는 것 같다.

Swift 에서는 제네릭을 <T> 로 표현하는데 담고싶은 타입을 T 에 넣으면 된다. 자바랑 똑같다. :)


 그렇다면 컬렉션 타입은 왜? 필요할까.


여러 이유들이 존재하겠지만 같은 타입의 데이터들을 묶어서 사용하면 우리가 변수와 상수를 선언해서 사용하듯  하나 하나의 데이터들을 굳이 따로 선언해서 사용하지 않아도 되서 효율적이고 편리하기 때문이라 생각한다.

(결국은 개발자 좋으라고...)


 Swift에서는 배열(Array), , 세트(set), 딕셔너리 (Dictionary) 세 가지 컬렉션 타입이 있다. 

그리고 세 가지 컬렉션 타입은 변수(var) 로 생성하면 컬렉션에 데이터 구성을 변경할 수 있고, 상수(let) 으로 생성하면 데이터 구성을 변경할 수 없다.




배열(Array)


 Swift 에서 배열은 같은 데이터 타입의 값들을 순서대로 저장하는 리스트이다.

음식점에서 먼저 온 순서대로 번호와 이름을 적는  대기명단을 생각하면 쉽다.

그리고 배열은 똑같은 값(중복 값) 을 저장할 수 있는데 어차피 순서가 정해져 있어서 구분할 수 있기 때문이다. 

대기명단에서도 번호만 다르면 이름이 같더라도 구분되기 때문에 상관없는 것과 똑같다. 





그림 1 > 기본적인 배열 사용법 




세트(Set)


 Swift 에서 세트는 같은 데이터 타입의 값들을 순서없이 저장하는 리스트이다.  

순서가 없다는 점만 빼면 배열과 비슷한데, 세트에서는 순서가 없기 때문에 서로 같은 값들을 구분 할 수 없다. 

그래서 세트에서는 중복된 값은 허용되지 않는다. 

이러한 특징 때문에 스위프트 공식 문서에서도 세트는 순서가 중요하지 않거나, 세트에 저장된 각 값들이 유일한 값일 때

사용하라고 한다.

세트는 로또 번호가 적힌 공들을 담아 놓은 통이라고 생각하면 된다. 통에 들어간 공들은 통에 순서 없이 그냥 담겨있고, 

각각 유일한 숫자가 적혀있어 똑같은 공도 없다.

세트는 특별한 기능을 가지고 있는데 바로 우리가 수학시간에 배웠던 집합의 연산을 할 수 있다. 

요즘은 다를수 있겠지만 예전엔 다들 집합이 수학책에서 첫 번째 단원 이었기 때문에 바로 이해할거라고 생각한다 :)

(사람들이 공부하기로 결심하면 첫 번째 단원은 하고 포기하기 때문에 첫 번째 단원은 항상 너덜너덜하다는...)




그림 2 > 세트 집합연산 ( 출처 : https://docs.swift.org/swift-book/LanguageGuide/CollectionTypes.html# )




 * 배열과 세트가 비슷해서 주의할 점이 있는데 Swift의 타입추론 기능을 이용해서 

 var 이름 = ["값1","값2"]  ] 형태로 사용하면 Swift는 배열로 인식해 버린다. 그렇기 때문에 세트는 축약형이 없다.



그림 3 > 기본적인 세트 사용법





딕셔너리 (Dictionary)


 Swift에서 딕셔너리는 순서없이 키(Key) 와 값(Value) 한 쌍으로 데이터를 저장하는 컬렉션 타입이다. 

다른 컬렉션 타입과 마찬가지로 딕셔너리의 키(Key)와 값(Value)은 각각 데이터 타입을 지정하면 동일한 데이터 타입만 사용 가능하다.

이름을 잘 붙인것 같은데 이름그대로 사전을 생각해보면 쉽다.

예를들어 영한 사전이라고 하면 영어 단어(Key)를 입력하면 한글로 풀이된 뜻(Value) 가 나오는 것이다. 그리고 영한 사전에서 단어는 영어로만 입력이 가능하고 뜻은 한글로만 나오기 때문에 동일한 데이터 타입만 사용가능한 것과 똑같다.



그림 4 > 딕셔너리 기본 사용법




 <그림 1~4> 까지의 예제들은 https://docs.swift.org/swift-book/LanguageGuide/CollectionTypes.html 에 나와있는 

기초적인 예제들만 따라해본 것으로 실제로는 더 많은 기능들과 사용법들이 있다. 

굳이 많이 기능들과 사용법들을 찾아보진 않았다. (비효율적인 공부이기 때문에)

개념과 기본적인 사용법만 알고, 실제로 컬렉션 타입을 사용할 때 마다 필요한 기능들을 찾아서  익히면 된다. :)








* 해당 포스팅은 스위프트(Swift)4  버전을 기준으로 하고 있습니다.

* 참고 : https://swift.org/ 



반응형
반응형

Swift 의 기본적인 데이터 타입을 공부하고 나서 컬렉션 타입(Collection Type)에 대해 공부하려고 했으나

그 전에 Swift 에는 튜플(Tuple) 이라는 개념이 있어 먼저 공부해 보았다.

처음 접해보는 개념이라 Swift 만의 특징인가 했더니 그런건 아니고 파이썬 이라는 프로그래밍 언어에도 존재하는 것이고,

이미 있는 개념을 Swift 에 적용시킨 것이다. 

 위키백과에서 튜플을 검색해 보니 튜플(Tuple) 이란 유한 개의 사물의 순서있는 열거이다 라고 나온다. 

얼핏보면 배열(Array) 과 똑같은게 아닌가 싶지만 배열은 같은 타입의 데이터들을 한 곳에 담아 편리하게 이용하려고 사용하는 것이고, 튜플은 타입이 같을 필요가 없어서 배열과 비슷하지만 다른 개념이다.

비교하자면 구조체(Structure) 나 클래스(Class) 에a\서 변수만 담아서 사용하는거에 더 가깝다고 볼 수 있겠다 :)



튜플(Tuple) 이란?


 Swift 에서 튜플이란 다양한 값(데이터)들의 묶음 이라 할 수있다. 

튜플의 구성 요소들은 서로 같은 타입일 필요가 없다. 같은 타입을 여러개 사용해도 상관없고, 각각 다른 타입을 사용해도 상관없다는 의미이다. 또한 튜플 안에 들어갈 수 있는 값들의 개수도 사용하고 싶은 만큼 사용이 가능하다.




튜플 사용법


1.기본 사용법 :


  Swift 에서 튜플을 사용하고 싶으면 변수나 상수를 선언한 뒤 원하는 데이터 값들을 ( ) 에 묶어서 넣어 주면 된다.

 [ var 변수명 : (데이터 타입1, 데이터 타입2, 데이터 타입3) = ( 값1 , 값2 , 값3) ] 의 형태이다. 

튜플에서도 Swfit의 타입 추론이 적용되기 때문에 데이터 타입을 생략하여 [ var 변수명 = ( 값1 , 값2 , 값3) ] 처럼 

사용 하더라도 상관없다. 



그림 1 > 튜플의 기본적인 사용법



2. 튜플의 값들을 변수나 상수에 넣어주기 : 


 튜플의 값들을 변수나 상수에 넣어주는 방법도 있다. 변수나 상수도 ( ) 로 묶어서 선언한 뒤 튜플을 넣어주면 되는데 

여기서 주의할 점은 튜플의 구성요소 개수 만큼 변수나 상수도 똑같이 선언해줘야 한다는 것이다.



그림 2 > 튜플의 값들을 각 변수에 넣는 예제




3. 튜플의 값들 호출하기 : 


 튜플의 값들은 배열(Array) 와 마찬가지로 순서대로 0 부터 개수만큼 인덱스가 부여 되기 때문에 인덱스를 사용하여 원하는 값을 가져 올 수 있다. 하지만 인덱스를 사용하는 경우 자기가 어떤 데이터를 호출 하는지 구분하기 어렵다. 

이럴 때에는 튜플의 각  값 마다 이름을 붙여서 사용하면 된다. 타입을 생략하지 않고 굳이 써주는 것과 마찬가지로 튜플을 사용할거면 각 타입의 이름을 지정해서 사용하는게 좋을 것 같다.




그림 3 > 튜플의 각 값들을 인덱스를 통해 호출할 수 있다.






그림 4 > 튜플의 각 타입에 이름을 붙여서 해당 이름을 통해 값을 호출 할 수 있다.

  



 


 




* 해당 포스팅은 스위프트(Swift)4  버전을 기준으로 하고 있습니다.

* 참고 : https://swift.org/ 


 

 

반응형
반응형

Swift 의 기본 데이터 타입에 대해 이전 포스팅과 이어서  Any, AnyObject 대해서도 공부해보자.




2018/10/21 - [IT 정보 로그캣/Swift] - [Swift 공부]기본 데이터 타입 (자료형) #1




Swift 의 데이터 타입에 대해 공부할 때 참고로 공부해야하는 부분이 있는데 바로 nil 과 Type Aliases 이다.

그래서 이번 포스팅에서 nil과 Type Aliases 부분도 함께 살펴 보았다.



Any 타입


 Any 는 말 그대로 Swift 의 아무(모든) 데이터 타입을 사용할 수 있다는 의미이다. 

타입을 명시하지 않고 그냥 바로 선언해서 사용하는 타입 추론처럼 어떻게 보면 가장 편리할 것 같지만 Any 로 선언된 변수의 값을 가져다 쓰려면 매번 타입 확인과 형 변환을 해야하는 번거로움이 있다. 

그래서  특별한 경우가 아니면 사용하진 않을 것 같다.

 예를들어 < 그림 1 > 과 같이 Any 로 선언한 타입의 값을 아무 조치없이 사용하면 컴파일 에러가 발생한다.

컴파일 에러 내용은 Any 타입에 숫자 100을 넣고 if 문의 조건에 넣었는데 Any 타입과 숫자 100 (Int) 를 비교할 수 없다는 것이다. 

( * Any는 타입을 명시하지 않고 바로 사용하는 Swift 의 타입 추론 과는 다르다.)



그림 1 > Any 타입 사용 예제




AnyObject


 AnyObject 는 모든 클래스의 타입을 지칭할 수 있는 타입으로 클래스의 인스턴스를 지정해 줄 수 있다.  

마찬가지로 AnyObject 도 Any 처럼 사용하는데 있어서 번거로움이 존재하기 때문에 특별한 경우가 아니면 잘 사용하지 

않는게 좋겠다.





nil


  nil 은 변수 또는 상수 에 값이 없음을 의미한다. 자바로 치자면 null 이라고 볼 수 있겠다 :)

값이 없기 때문에 nil 인 변수나 상수를 호출하여 사용하려고 하면 우리가 흔히 겪는 널 포인트 익셉션이 발생한다. 





Type Aliases

 

 Type Aliases 는 우리가 변수에 이름을 지정해서 사용 하듯이 이미 존재하는 데이터 타입에 대해 따로 이름을 지정하여 사용할 수 있는 기능이다. Type Aliases 기능은 Swift 에서 제공하는 데이터 타입 뿐만 아니라 내가 임의로 만든 데이터 타입 등에도 사용할 수 있다.




그림 2 > typealias 를 통해 Int 명칭을 커스텀하여 사용하는 방법
















* 해당 포스팅은 스위프트(Swift)4  버전을 기준으로 하고 있습니다.

* 참고 : https://swift.org/ 


반응형
반응형


 변수와 상수는 데이터 타입공부와 직결되기 때문에 포스팅은 따로하지만 같이 봐야하는 내용이다.




2018/10/21 - [IT 정보 로그캣/Swift] - [Swift 공부] 변수와 상수




 대부분의 프로그래밍 언어를 처음에 공부할 때 변수와 상수 그리고 해당 프로그래밍 언어에서 지원하는 데이터 타입을 

함께 공부한다. 데이터 타입은 자료형 이라고도 부르며 말 그대로 자신이 표현하려고 하는 데이터의 타입이 무엇인지를 

나타내는 것이다. 




데이터 타입(자료형) 이란?


 데이터 타입(자료형) 이란 변수나 상수에 담을 수 있는 값의 종류라고 보면된다. 변수와 상수의 정의를 메모리 상에 값을 저장할 수 있는 공간이라고 했는데, 이 공간에 들어갈 수 있는 값에는 각각 종류가 존재하다. 

예를들어 여자 화장실에는 여자만 들어가고 남자 화장실에는 남자만 들어가듯 변수와 상수 공간에 들어 가는 값들도 

남,녀 성별 처럼 구분이 있는 것이다.




Swift의 데이터 타입의 종류


 Swift 에서 기본으로 제공하는 데이터 타입으로는 Int , UInt, Float, Double, Bool, Character, String 등과 

Any, AnyObject 등이 있다. Swift 에서 모든 데이터 타입의 이름은  첫 글자를 대문자로 입력한다. 

Swift 의 데이터 타입들은 모두 Struct (구조체)를 기반으로 구현되어 있다. 

쉽게 설명하자면 우리가 숫자를 표현하고 싶을 때 Int 라고 입력해서 바로 사용할 수 있도록 

Swift에 미리 구조체 라는 것으로 만들어져 있다는 의미이다. 

(애플 공식 개발문서인 https://developer.apple.com/documentation/swift/int 에 들어가면 확인할 수 있다.)


사용법은 [var 변수명 : 데이터타입 ] 에서 데이터타입 부분에 자신이 원하는 데이터 타입을 넣어주면 된다.




Integer 타입


 Swift 에서 Integer(정수) 는 Int 와 UInt 로 나누어 진다. Int는 양수 (+) , 음수(-), 0 을 표현하는 정수이다.

UInt 는 Unsigned Integer 의 약자로 말 그대로 부호가 없는 양의 정수(+)와 0 을 표현하는 정수이다.

사용법은 아래 <그림1> 과 같고, UInt 에다가 음의 정수 값을 넣으면 컴파일에러가 발생한다.



그림1 > Swift 의 Integer 타입 사용법




 Swift는 특이하게 사용하는 플랫폼이 지원하는 비트에 따라 Int 와 UInt 의 타입이 달라 지는데 지원하는 비트는

각각 8비트, 16비트, 32비트, 64비트로 사용법 또한 Int8, Int16, Int32, Int64 , UInt8, UInt16, UInt32, UInt64로

나뉘어 진다. 비트에 따라 무슨 차이점이 있냐고 하면 각 비트 별로 표현 가능한 정수 자릿수의 크기가 다르다. 

Int와 UInt의 경우 구조체 안에 ~.min 과 ~.max 가 구현되어 있어서 최소, 최대 표현 가능한 정수 범위를 알 수 있다.




그림2> 비트에 따른 Int 정수 표현 범위




그림3> 비트에 따른 UInt 정수 표현 범위



특별한 경우가 아니고, 그냥 잘 모르겠다면 Int 로 선언해서 사용하면 된다. :)


 


Floating-Point Numbers (부동 소수점 숫자) 타입


 Swift에서는 부동소수점을 사용하는 실수를 표현하기 위해 Float 과 Double 타입을 사용한다. 

쉽게 설명하면 우리가 흔히 말하는 소수점 자리를 표현하기 위한 타입이라고 생각하면 된다. 

Float 과 Double의 차이점은 Float은 32비트 부동 소수점 숫자를 나타내고, Double은 64비트 부동 소수점 숫자를 

나타내는데 Integer 에서 처럼 결국은 숫자를 표현하는 범위가 다르다고 볼 수 있다. 

즉, Float 은 소수점 이하 6자리 까지 표현이 가능하고 double은 소수점 이하 15차이 까지 표현이 가능한 정밀도를 가지고 있다는 것이다. 

  



그림 4 > 원주율(Pi) 값을 넣어보면 설명대로 Float 은 소수점 6자리 까지 Double 은  소수점 15자리 까지 표현이 가능하다.




Bool 타입

 

 Bool 타입은 불리언(Boolean) 으로 불리며 참(true) or 거짓(false) 만을 값으로 가지는 타입이다. 

그래서 논리 자료형 이라고도 불린다. 주로 참(true) 값은 1, 거짓(false) 값은 0 이라고 대응시키는 프로그래밍 언어가 

많은데 Swift 에서는 true , false 대신에 숫자값 1, 0 을 넣어서 사용할 수 없다.



그림 5 > Bool 타입 사용법 (조건문의 조건에 다른 프로그래밍 언어처럼 1 의 값을 넣어서 사용할 수 없다.)


  


Character 타입 


 Character 타입은 하나의 문자를 표현하는 타입이다. Swift 에서는 유니코드 9 문자를 사용하기 때문에 유니코드에서 지원하는 모든 언어와 특수기호까지 사용이 가능하다. 보통은 하나의 문자 보다는 문자열을 사용하는 경우가 많기 때문에 

Character 는 참고정도만 하면 되겠다.



그림 6 > Character 타입 사용법 (이모티콘까지 사용이 가능하다!)




String 타입 

 

 String 타입은 문자열을 표현할 때 사용하는 타입이다. String 은 ( " ) 로 묶인 Character 의 모음 이라고 할 수 있다. 

String 에는  다양한 기능들이 존재한다. ( + ) 연산자를 통해 문자열을 이어 붙일 수도 있고, 다양한 메소드들을 사용할 수도 있다. 필요한 기능들은 그때그때 찾아서 사용하면 되고, String 을 사용하면서 제일 중요한 부분인 문자열 비교는 Swift 에서는 ( == ) 을 통해 이루어진다는 것만 기억하면 되겠다.



그림 7 > ( + ) 연산자를 사용한 String 이어 붙이기와 문자열 비교 





특수문자


  Swift 에서 문자열 내에 사용할 수 있는 특수문자들은 모두 역슬래시와 문자를 조합하여 사용한다.


1. 문자열이 끝났을 때 사용하는 null 문자 :  \0

2. 역슬래시 : \\

3. 가로 탭 : \t

4. 줄바꿈 : \n

5. 큰 따옴표  : \"

6. 작은 따옴표 \' 












* 해당 포스팅은 스위프트(Swift)4  버전을 기준으로 하고 있습니다.

* 참고 : https://swift.org/ 



반응형
반응형

 스위프트(Swift) 공부를 시작하며 대부분의 프로그래밍 언어 공부를 처음 시작할 때 가장 먼저 확인하는 변수와 상수에 

대해서 공부해 보았다. 

Swift 공식 Reference 인  https://swift.org/ 에서도 가장 먼저 상수와 변수에 대해서 알려준다. 

단순히 변수와 상수의 사용법 정도만 익혀도 되지만 항상 내가 어떤걸 공부 하는지는 알아야한다고 생각하기 때문에 초심으로 돌아가 

변수와 상수가 무엇인지 부터 차근히 공부해 보았다.



변수(Variable)와 상수(Constants) 란?


 변수와 상수는 기본적으로 컴퓨터 메모리상에 값을 저장하는 공간이다.

우리가 어떠한 값을 메모리상에 저장하게 되면 컴퓨터는 해당 공간에 주소값을 부여하고, 우리는 우리 마음대로 변수나 

상수에 이름 붙여 사용하는것이다. 

다만 차이가 있다면 변수는 언제든지 변할 수 있는 값이고, 상수는 변하지 않는 고정값이라 할 수 있다.

그럼 그냥 변수로 다 사용하면되지 굳이 상수를 왜 사용하느냐하면, 다양한 이유가 있겠지만 주요한 이유는 가독성과 

편리성이라 할 수 있다.

상수로 선언한 값은 주석을 달거나 누가 설명해주지 않아도 코드 중간에서 값이 변하지 않는다 라는걸 알게 해준다.

따라서 상수로 지정된 값을 신경쓸 필요가 없다. 보통 최대값, 최소값 등을 사용할 때 상수를 선언하여 사용한다. 

상수를 사용하는건 결국 프로그래머의 선택이라고 할 수 있겠다.


 그렇다면 근본적으로 변수와 상수는 왜 필요한걸까?


답은 간단하다. 매번 필요한 위치에 값을 입력해서 사용할 수도 있지만 변수나 상수를 선언하여 사용하면 효율성이 좋고

편리하기 때문이다.

(대부분의 기능들도 마찬가지로 이러한 이유로 생겨난것 같다)


 예를들어 10 이라는 숫자 값을 변수로 선언 해놓고 코드에 10000번 정도 사용했다고 가정할 때, 나중에 10의 값이 아닌 11을 넣어야할 때 변수가 없으면 일일이 만 번 이나 숫자 10을 지우고 11로 바꾸는 번거로운 노가다를 해야하는 것이다.. 




Swift 의 변수 사용법 


 Swift 에서는 변수를 생성하기 위해 var 이라는 키워드를 사용한다. 

기본적으로 그림과 같이 [ var 변수명  =  ] 형태나 [ var 변수명 : 데이터타입 = ] 형태로 사용 한다. 

Swift 에서는 데이터 타입을 명시해 주지 않아도 타입 추론이라해서 컴파일러가 자동으로 데이터타입을 지정해 주는 기능이 있다.

데이터 타입을 적지 않는게 편리하긴 하겠지만  개인적으로 적는게 더 좋은 습관 같다.

(데이터 타입에 대한 포스팅은 따로 작성할 예정으로 이번 포스팅에서만 데이터 타입을 빼고 작성해 보았다.)


 변수를 한번에 여러개를 선언해서 사용할 때에는 그림2 와 같이 var 는 한번만 입력하고 "," 으로 구분하여 선언 해주면 된다.




그림1 > 변수를 하나씩 선언해서 사용하는 경우 





그림2 > 변수를 한번에 여러개를 선언해서 사용하는 경우 







Swift 의 상수 사용법


 Swift 에서 상수를 선언하기 위해서는 let 이라는 키워드를 사용한다.

let 이라는 키워드를 사용한다는 점과 값을 한번 지정해주면 변경할 수 없다는 점을 제외하고는 변수와 사용법이 똑같다.

마찬가지로 데이터 타입을 따로 명시하지 않아도 자동으로 지정되고,

그림과 같이 [ let 변수명  =  ] 형태나 [ let 변수명 : 데이터타입 = ] 형태로 사용하면 된다.

다만 상수를 선언만 해놓고 나중에 값을 지정해주려고 하면 반드시 데이터 타입을 명시해야 한다.





그림3> 상수를 하나씩 선언해서 사용하는 경우 






그림4 > 상수를 한번에 여러개를 선언해서 사용하는 경우 







* 해당 포스팅은 스위프트(Swift)4  버전을 기준으로 하고 있습니다.

* 참고 : https://swift.org/ 


반응형

+ Recent posts