반응형

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

이러한 작업들을 가능하게 해주는게 연산자(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/ 


반응형
반응형

아이폰 앱 개발을 하기위해서는 Objective-C 나 Swift 프로그래밍 언어 공부를 해야한다.

안드로이드 개발을 하기 위해서 자바(Java) 나 코틀린(Kotlin)을 공부해야하는 것과 마찬가지다 :)

그래서 Objective-C vs Swift  중 어떤 걸 선택해서 공부해야하나 고민 끝에 프로그래밍언어 트랜드와 실제 앱 개발이 가능할 정도의 공부 시간을 생각 했을 때 Swift가 우위에 있기 때문에 스위프트를 선택 하였다.

결론적으로 스위프트(Swift)를 선택 했지만 최소한 내가 공부하는 프래그래밍언어가 어떤 건지는 알고 공부를 해야한다고 생각하기 때문에 Swift 란 무엇인가 간단히 알아보았다.


스위프트(Swift) 란?


 스위프트(Swift)는 애플의 IOS와 macOS 개발을 위한 프로그래밍 언어로 2014년 6월 2일 WWDC (애플 세계 개발자 회의)에서 처음 소개 되었다. 기존에 애플 운영체제 개발을 위한 Objective-C 가 있었지만 같이 사용될 목적으로 만들어졌다. 위에서 언급한 자바와 코틀린의 관계랑 비슷하다고 볼수있다. 

 그렇다면 스위프트는 왜? 생겨났을까. 개인적인 생각으로는 스위프트 (Swift) 이름에 그 답이 있는게 아닌가 싶다.

 Swift 의 단어 뜻을 찾아보면 "신속한", "빠른", "칼새" 라고 나온다. 많은 경우에 이름에서 정체성이 드러나듯이 스위프트의 로고는 이름 그대로 칼새를 의미하는 것 같고, 스위프트의 철학 또는 목표는 "신속하고 빠르게" 를 의미하는 것 같다. 여기서의 빠름은 성능 상의 빠름을 의미할 수도 있지만 다른 한편으로 개발이나 학습의 측면에서도 빠름을 의미하는게 아닌가 싶다. 애플에서도 스위프트를 소개할 때 가장 먼저 배우기쉬운 강력한 프로그래밍 언어 라고 설명한다. 

이러한 설명을 뒷받침 하듯이 애플 홈페이지 (https://www.apple.com/kr/swift/) 에서도 교육과정에 Swift를 도입한 대학들을 자랑(?) 한다. 

아직 많은 부분들을 공부해보진 못했지만 스위프트를 사용해본 경험으로는 코드 표현이 직관적이며, 코드를 굉장히 간단하게 표현하려는 프로그래밍언어라는 느낌을 받았다. (다만 실제로 그렇게 사용하기 위해선 아직 많은 연습과 코드 표현의 습관이 필요해 보인다...  )
결국 스위프트는 애플의 차세대 그리고 현재의 개발자 생태계 확보를 위해 만들어진 언어라고 보여진다.

 성능 상으로도 Objective-C을 개발하면서 흔히 발생하는 에러를 줄일 수 있도록 보완해서 스위프트를 만들었다고 하고, 

스위프트로 만들어진 앱이 Objective-C 로 만들어진 앱 보다 성능이 더 좋다고 애플에서 직접 발표했다고 하니 애플에서도 개발 생태계의 흐름을 고려해 Objective-C 와 스위프트가 병행은 하지만 사실상 스위프트로 대체해 나가는 것 같다. 


기준에 따라 프로그래밍언어의 순위는 달라 질 수 있지만 다양한 기준의 여러가지 지표를 비교해봐도 이미 스위프트가 Objective-C 를 앞서나가고 있으며 대체해 나가고 있음을 보여준다.





지표1 ) Github 기준 프로그래밍 언어 통계 순위 (2018 / 2분기)

Github 에서 해당  프로그래밍 언어들이 얼마나 사용 되었는지 기준






지표 2) TIOBE Index for October 2018 

해당 프로그래밍 언어를 이용하는 엔지니어 및 업체 수와 구글, 야후 등의 검색 엔진을 통해 검색되는 결과물 수 기준







지표3 ) The RedMonk Programming Language Rankings : January 2018 

GitHub 와 Stack Overflow 에서 해당 프로그래밍 언어의 이용 기준

 






스위프트(Swift) 의 역사


이 글을 작성하는 기준 ( 2018. 10 ) 스위프트의 버전은 4.2 이다. 이는 스위프트 버전이 1,2,3 ~ 4.1 이 있었다는 의미이다.

2014년 스위프트가 처음 공개되고 2015년 스위프트2, 2016년 스위프트3, 2017년 스위프트 4 가 차례대로 나왔지만 2018년에는 스위프트 5가 나오지 않았다. 대신 스위프트 4.2가 공개되었다. 버전이 바뀐다는 것은 프로그래밍 언어에 큰 변화가 있음을 의미한다. 매년 버전이 새롭게 나오다가 올해만 스위프트5가 나오지 않았다는 것은 활발하게 업데이트 되던 스위프트가 스위프트4에서 아직까지 큰 변화가 필요하기 보다 기존 걸 개선하고 보완하는 정도가 필요하다는 의미에 가까운것 같다. 이제는 어느정도 안정권에 들어선게 아닌게 싶다. 


스위프트1~ 4까지 많은 변화가 있었겠지만 

어차피 이제까지의 변화 내용은 스위프트 4.2에 모두 담겨져 있으므로 스위프트4.2 의 특징을 알아보았다.




스위프트 공식 문서를 참고하다 보니 다 영어로 되어있지만 잘 이해했다고 믿는다. 

클로저 부터 시작해 오류 처리까지 아직 제대로 기능들을 사용해보지 못해 앞으로 공부 하면서이해해 나가야 할 부분들이다.

다만 인상깊은 특징으로는 메모리가 자동으로 관리된다는 점과 세미콜론을 입력할 필요가 없다는 것이다!!

GC 야 이미 자바에서도 충분히 체감한 부분이라 하더라도 세미콜론이 없다는 부분은 정말 새로웠다.

세미콜론을 사용하지 못하는 건 아닌데 한줄에 구분없이 코드를 입력하는게 아니면 따로 입력할 필요가 없다.





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

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

* Swift 공부가 필요한 사람이 있으면 함께 공부해 나가면 좋겠습니다 :)



반응형
반응형

우리가 보통 컴퓨터(노트북) 이나 스마트폰을 구매할 때 아마 가장 많이 듣는게 램(RAM) 사양이 아닐까 합니다.

보통 다다익램 이라고 램 용량이 높을수록 좋다는 말이 있죠!

도대체 램이란 무엇이길래 높으면 좋은지, 나에게 알맞은 램은 무엇인지 선택하기 위해서라도 

램에 대해 알아보도록 하겠습니다,




1. 램(RAM)이란?

 

 램의 사전적 의미부터 살펴보겠습니다. 

램은 Random Access memory 의 줄임말로 데이터를 읽거나 기억시킬 수 있는 메모리 입니다. 

컴퓨터의 주기억장치라고도 하죠.  일종의 저장소라고 생각하시면 될 것 같습니다.

그런데 왜 Random Access 라는 이름이 붙었을까요? 

결론부터 알려드리자면 램에 저장된 어느 데이터든 접근 시간이 동일하기 때문입니다. 

예를들어 아래 그림과 같이 램(RAM)이 마을( 데이터를 저장할 수 있는 공간)이라면 각 집은 데이터라고 볼 수 있습니다. 

그리고 각 집마다는 중복되지 않는 고유한 주소값을 가지고 있어 언제든지 집을 찾아 갈 수 있습니다. 

( 실제로 컴퓨터가 어떠한 내용을 저장하고 찾을 때는 주소 값이라는 것을 사용합니다. )

램이라는 마을은 공간이 허용하는 한 얼마든지 집을 지을 수 있고, 집을 지을 때 마다 주소 값이 생성 됩니다. 

그런데 이 마을은 특이한 점이 있습니다. 내가 주소 값을 가지고 어느 집(Random) 을 찾아가든 출발부터 도착(Access) 시간이 똑같다는 겁니다. 

그래서 이름이 Random Access 라고 지어졌습니다. 이해가 되시나요? 

우리가 흔히 생각하는 Random 이란 단어의 의미 때문에 헷갈리실 수 있습니다. 

 한글로 표현하자면 오히려 anywhere 에 더 가까울 것 같네요 :)







2. 램의 역할


 이제 램이 왜 RAM 으로 불리는지도 알았고, 데이터를 저장하는 곳이라는 것도 알고 있습니다. 

그런데 여기서 의문점이 있습니다. 

흔히 알기로 HDD 라고 불리는 하드디스크라는 저장소가 있는 걸로 아는데 왜 램이라는 저장소가 또 필요한 걸까요?

그 이유는 우리가 항상 중요시 여기는 속도에 답이 있습니다. 

CPU가 연산을 해주는 역할을 한다고 이전 포스팅에서 설명해 드렸는데요!





2018/09/04 - [IT 정보/하드웨어] - [하드웨어] CPU 란?





1초에 몇십억 번의 연산을 하는 CPU가 필요한 데이터를 찾기엔 하드디스크가 너무 느리기 때문입니다. 

그래서 하드디스크에 저장된 자주 사용하는 데이터(프로그램) 등을 램으로 옮겨 사용합니다.  

쉽게 설명 드리자면 CPU가 치킨집 사장님이라고 생각하면 램은 조리된 치킨들이 쌓여 있는 쟁반이고, 하드디스크는 

살아 있는 닭들이 있는 양계장에 가깝습니다.

치킨 주문이 들어와서 치킨을 배달 해야하는데 매번 양계장에 가서 살아 있는 닭을 도축하고 손질하여 튀김 옷을 입혀 

튀긴 다음 치킨으로 만들기엔 엄청나게 비효율적인 것이죠. 그래서 치킨집에서 미리 조리해놓은 치킨처럼 램에서 빠르게 

사용해야할 데이터들을 저장해놓고 사용합니다. 

치킨집 사장님이 치킨가게에서 치킨을 팔듯 실제로 CPU가 데이터를 찾아오는 곳은 램인 것이죠.

즉, 램은 CPU가 데이터를 빠르게 처리하는 것을 도와주는 역할을 합니다.




* 참고로 램은 휘발성 메모리로 전원이 꺼지면 데이터가 모두 사라집니다. 마치 치킨집에서 하루 장사가 모두 끝나면 치킨을 모두 

폐기(?) 처분 혹은 정리 하듯이 말이죠 :) 

반대로 하드디스크는 비휘발성 메모리로 전원이 꺼져도 데이터가 보존됩니다.

양계장에서는 하루가 지나도 닭들이 계속 살아있는 것과 동일한 것이죠.




반응형

'IT 정보 로그캣 > 하드웨어' 카테고리의 다른 글

[라즈베리 파이] 라즈베리 파이 란?  (0) 2019.01.05
[하드웨어] CPU란?  (0) 2018.09.04
반응형

 모든 컴퓨터(노트북 포함)나 스마트폰은 CPU를 탑재하고 있습니다. 

그래서 우리는 매번 컴퓨터와 스마트폰을 구매할 때 CPU의 사양에 대해 접하게 됩니다.

보통 많은 사람들이 제조사에서 탑재해준 CPU를 그냥 사용하지만 때로는 다른 차이는 없고 CPU 클럭만 0.2~0.4 차이가 

나는데 금액은 엄청나게 차이가 나 우리를 혼란스럽게 하기도 합니다. 그렇기 때문에 나의 필요성에 맞게 제품을 구입하고 

선택하기 위해서라도 CPU란 무엇인지 알고 있어야 겠네요 :)



1.CPU란?


 CPU란 Central Processing Unit 의 줄임말로 한글로 하면 중앙 처리 장치라고 합니다. 흔히 사람의 뇌에 비유하며 

컴퓨터의 다른 부품들과 신호를 주고 받으면서 시스템 전체를 제어하는 역할을 합니다. 

여기까지는 누구나 한번쯤 들어봤을 설명이죠 :) 

쉽게 설명하자면 CPU는 사용자와 소통하는 역할을 합니다. 사람들이 서로 소통 하기 위해서는 언어가 필요 하듯이 

컴퓨터도 소통하기 위해서는 언어가 필요합니다. 그리고 컴퓨터가 사용하는 언어는 영화 매트릭스에서 많이 나오는 0 과 1로 이루어진 이진수 입니다. 

컴퓨터는 기본적으로 input & output 구조로 대화합니다. 먼저 말을 걸어주어야 대답을 해주는 친구죠. 

그런데 우리는 CPU에게 이진수로 직접 말을 걸 수 없기 때문에 중간에 매개체가 필요합니다. 바로 키보드와 마우스죠.

예를들어 아래의 그림과 같이 사용자가 키보드나 마우스를 통해 대화(input)를 걸면 우리가 건넨 말은 이진수로 변환되어 CPU에 전달되고, CPU는 input에 맞는 대답(output)을 사용자가 이해할 수 있는 표현으로 다시 변환하여 모니터 등을 통해 

보여주는 것입니다.










2. CPU 성능

 

 이제 CPU가 무슨 역할을 하는지 알았으니 CPU를 고르기 위한 기본적인 CPU 성능 정보에 대해서 알아보겠습니다.

CPU를 구입하려고 성능표를 보면 아래와 같은 설명을 볼 수 있습니다. 


출처 ) 다나와 인텔 코어 i7-8세대 8700K 커피레이크 제품 


우리가 CPU의 사양을 보거나 CPU를 선택할 때 접하는 정보를 바탕으로 CPU의 성능에 대해서 알아보겠습니다.


  •  코어 : 코어(core)는 말그대로 CPU의 핵심으로 이진수 연산 역할을 합니다. 실질적인 소통처리를 하는 친구네요! 코어는 개수에 따라 크게 싱글코어와 멀티코어로 구분됩니다. 싱글코어는 CPU안에 코어가 한 개 있다는 의미고 멀티코어는  코어가 여러개라는 의미 입니다. 멀티코어는 듀얼(2개) 코어, 쿼드(4개) 코어, 핵사(6개) 코어, 옥타(8개) 코어 등 개수에 따라 나뉘어 집니다. 코어가 많다는 건 차들이 지나갈 수 있는 터널을 많이 뚫어 놓았다고 생각하시면 됩니다. (쓰레드를 설명하기 위해 차선보다는 터널이라고 비유 하겠습니다.) 터널이 한 개 일 때 보다 두 개 일 때 더 많은 차들이 지나갈 수 있듯이 코어가 더 많을 수록 컴퓨터의 처리속도가 더 빠릅니다.


  •  클럭 : 클럭(Clock) 은 CPU의 초당 명령어를 처리할 수 있는 속도를 의미합니다. 단위는 GHz (기가 헤르츠)를 사용하며      1 GHz 는 1 초당 10억 번의 명령어를 처리하는 것을 의미합니다. 비유하자면 차선에서 차들이 낼 수 있는 제한속도와 같은 개념이라고 생각하시면 됩니다. 제한 속도가 높을 수록 차들이 빨리 지나 갈 것이고, 마찬가지로 클럭이 높을수록 더 많은 일들을 처리할 수 있습니다. 위에 CPU 성능 표에서 보면 동작 속도가 클럭을 의미 합니다.

 터보부스트 속도라는 것도 있는데 이는 오버클럭 이라는 개념으로 순간적으로 CPU가 자신의 클럭속도를 끌어올리는 것을 의미합니다. 

예를들면 도로에서 제한속도를 넘기면 단속에 걸리는데 +5 정도는 봐주듯이 CPU도 필요할 때만 잠깐 속도를 

끌어 올리는 것입니다. 그리고 차들이 속도를 높일 수록 도로와의 마찰에 의해 더 뜨거운 열이 발생 하듯이 클럭이 높을 수록 CPU의 발열과 

전력소비가 높습니다.  

노트북의 경우 발열은 노트북의 수명과 전력소비는 베터리 사용시간과 직결되는 문제이기 때문에 참고하시면 좋으실 것 같습니다 








  •  쓰레드 : 쓰레드 (Thread)와 코어의 개념에 대해 혼동하시는 분이 많습니다. 쉽게 설명 하자면 쓰레드는 코어의
    멀티테스킹 능력이라고 볼 수 있습니다. 일반적으로 코어 한 개당 스레드가 두 개씩이고, 위에서 CPU 성능 그림을 보면
    핵사(6개)코어이기 때문에 6x2 해서 쓰레드가 12가 됩니다. 단순하게 보면 우리가 흔히 노래를 들으며 공부를 하듯이 (?) 코어도 동시에 두 개씩 작업을 할 수 있다는 것입니다.
    코어와 쓰레드 설명에서 혼동을 피하기 위해 위에서 코어는 터널이라고 비유를 했고, 쓰레드는 한 터널(코어) 당 차선을
    나누어 차가 2대 씩 지나갈 수 있도록 한 것이라고 생각하시면 됩니다. 이론적으로 보면  코어 개수가 늘어난 것과 똑같은 것으로 보이지만 실직적으로는 코어의 일처리 효율을 높인수준으로 코어 개수가 늘어난 만큼의 속도 향상을 보이지는 않습니다. 




  •  L3 캐시 메모리 : L3 캐시 메모리에서 L은 Level을 의마힙니다. L3가 있으니 당연히 L1, L2 도 있습니다. 캐시메모리는 CPU 내에서 빠르게 일을 처리하려고 자체적으로 필요한 내용들을 기억하는 역할을 합니다. 예를들어 CPU에게 사용자가 대화를 걸어 자신의 집 주소를 알려달라고 질문을 합니다.  그러면 CPU는 RAM이라는 주소록을 꺼내 주소를 찾은 뒤
    알려줄 수도 있습니다. 그런데 사용자의 집 주소는 자주 사용되거나 빨리 처리 해줘야 해서 매번 RAM이라는 주소록을
    꺼내서 찾은 뒤 말해주면 늦고 귀찮습니다. 그래서 CPU는 그냥 사용자의 집 주소를 외워 사용자가 물어보면 바로바로
    답을 해줍니다.  이렇듯 CPU는 RAM이라는 메모리에 접근하여 일을 처리하면 속도가 느리기 때문에 일처리 속도를
    올리기 위해 자체적으로 기억할 수 있는 캐시 메모리를 사용합니다. 캐시 메모리가 클수록 CPU가 자체적으로 많은 내용을 기억할 수 있고 속도도 더 빠르게 됩니다.  물론 가격도 같이 올라갑니다 :)
    하지만 코어나 클럭에 비해 체감 속도에 미치는 영향은 작습니다.



  • 연산체계 : CPU의 연산쳬계는 32비트와 64비트로 이루어져 있고, CPU의 연산 능력을 의미합니다. CPU가 사용하는 언어가 이진수이기 때문에 연산쳬계가 32비트면 2의 32제곱까지, 연산체계가 64비트면 2의 64제곱까지 연산할 수 있습니다. 속도는 64비트가 더 빠르며, 사람으로 생각하자면 암산을 더 잘한다든가, 표현할 수 있는 단어나 문장이 더 많아서 빨리 대답할 수 있는 정도로 생각하시면 될 것 같습니다.






반응형

'IT 정보 로그캣 > 하드웨어' 카테고리의 다른 글

[라즈베리 파이] 라즈베리 파이 란?  (0) 2019.01.05
[하드웨어] 램(RAM)이란?  (0) 2018.09.06

+ Recent posts