[Swift 문법] - 변수,상수,타입, 연산자, 문자열 보간

sun02·2021년 7월 22일
0

100 days of Swift 

목록 보기
12/40

1. Variables and constants

모든 유용한 프로그램은 어떤 지점에서 데이터를 저장할 필요가 있고 스위프트에는 두 가지 방법이 있다 : 변수와 상수 이다. 변수는 네가 원할 때 값을 변화시킬 수 있는 데이터 저장소이고 상수는 한번 설정하면 변화할 수 없는 데이터 저장소이다. 따라서, 변수에는 변할 수 있는 값이 있고 상수에는 변하지 않는 값이 있다 – 쉽죠?

이 두 가지 옵션이 무의미해 보일 수 있다, 변수를 만들고 난 후에 변경하지 않아도 된다 – 왜 상수로 만들어야 할까? 글쎼, 많은 프로그래머들이 프로그래밍에 완벽하지 않고 우리는 실수를 하기 때문이다.

변수와 상수를 분리하는 이점 중 하나는 우리가 실수를 한다면 Xcode가 우리에게 알려줄 것이라는 것이다. 만약 우리가 “이것은 변화하지 않을 것이기 때문에 이 날짜를 상수로 만들어라”라고 하고 열 줄 뒤에 변화시키려고 한다면, Xcode는 빌드를 거절할 것이다.

상수는 Xcode가 앱을 빌드하는 방식을 결정할 수 있게 해주기 때문에 중요하다. 만약 값이 절대 바뀌지 않는다는 것을 안다면 최적화를 적용하여 코드를 더 빠르게 실행할 수 있다.

스위프트에서, var 키워드를 사용하여 변수를 만들 수 있다.

var name = “Tim McGraw”

피드백을 받을 수 있도록 플레이그라운드에 작성해보자. Import UIKit을 제외하고 모든 줄을 지우고 변수를 추가해보자. 아래와 같은 사진을 볼 수 있을 것이다

이것은 변수이기 때문에 네가 원할 때 바꿀 수 있지만 바꿀 때마다 var 키워드를 사용하지는 않는다 – 새로운 변수를 선언할 때만 사용된다

var name = “Tim McGraw”
name = “Romeo”

따라서 첫번째 줄에서 Name 변수를 만들고 초기 값을 준 후 두 번째 줄에서 name변수를 업데이트하여 이제 그 값은 “Romeo”이다. 너는 두 가지 값 둘 다 플레이그라운드의 결과 창에 출력되는 것을 볼 것이다.

만약 우리가 name을 변수가 아니라 상수로 만든다면? 글쎄, 상수는 var 이 아니라 let 키워드를 사용하기 때문에 첫번째 줄을 var name 이 아니라 let name 로 바꾸어야한다.

import UIKit
let name = “Tim McGraw”
name = “Romeo”

하지만 여기에 문제가 있다 : Xcode는 세 번째 줄 옆에서 빨간 경고 기호를 표시하고 네 코드 아래에 구불구불한 밑줄을 그을 것이다. 빨간 경고 기호를 클릭하면, Xcode는 문제를 알려줄 것이다 : ” ‘let’ 값인 ‘name’에 할당할 수 없음” 이것은 Xcode가 “너는 상수를 변화시키려 하고 있고 너는 그것을 할 수 없다”라고 말하는 것이다.

따라서 상수는 스위프트와 너 스스로에게 그 값이 변화하지 않는다고 약속하는 훌륭한 방법이다. 만약 네가 바꾸려한다면 Xcode가 실행을 거부할 것이기 때문이다. 스위프트 개발자들은 가능하면 상수를 사용하려는 강한 선호를 가진다 이것이 코드를 더 이해하기 쉽게 만들기 때문이다. 사실, 스위프트의 가장 최근 버전에서, Xcode는 네가 변수를 만들고 그것을 변화시키지 않는다면 너에게 알려줄 것이다.

중요한 참고 : 변수와 상수 이름은 코드 상에서 유일해야한다. 다음과 같이 같은 변수 이름을 두 번 사용한다면 에러를 받을 것이다.

var name = “Tim McGraw”
var name = “Romeo”

플레이그라운드가 네 코드의 에러를 발견하면 빨간색 상자에 경고를 표시하거나 실행을 거부할 것이다. 후자가 발생하면 결과 창의 텍스트가 일반적인 검정이 아닌 회색으로 바뀌기 때문에 너는 알아차릴 수 있을 것이다.

2. Types of Data

데이터의 종류는 아주 많고 스위프트는 이것들을 각각 다룬다. 변수에 텍스트를 할당할 때 너는 이미 가장 중요한 타입 중의 하나를 봤을 것이다, 스위프트에서 이것은 String이라 불린다 – 말 그대로 문자들의 열이다.

문자열은 길거나 짧거나 비어있을 수도 있고 이것은 중요하지 않다 : 이것들은 스위프트의 관점에서 모두 문자열이고 똑같이 작동한다. 네가 name을 만들 때 문자열을 할당했기 때문에 스위프트는 name이 문자열을 가진다는 것을 안다 : “Tim McGraw”. 만약 코드를 아래와 같이 재작성한다면 작동을 멈출 것이다

var name
name = “Tim McGraw”

이번에 Xcode는 아직 이해가 되지 않는 에러 메세지를 보여줄 것이다 : “타입 주석(type annotation)이 없습니다.” 이는 “네가 충분한 정보를 제공하지 않아서 나는 name의 데이터 타입을 알아낼 수가 없어.” 라는 의미이다.

이 지점에서 너는 두 가지 선택권이 있다 : 변수를 작성하고 초기값을 주거나 type annotation이라 불리는 것을 사용하는 것이다. 이는 스위프트에게 네가 당장 값을 주가 않더라도 그 변수가 추후에 갖게 될 데이터 타입을 알려주는 것이다.

첫 번째 옵션은 어떻게 되느지 알기 때문에 두 번째를 살펴보자 : type annotations(유형 주석). 우리는 name이 문자열이라는 것을 알기 때문에 우리는 콜론과 String을 작성함으로써 스위프트에게 알려줄 수 있다.

var name: String
name = “Tim McGraw”

참고 : 어떤 사람들은 콜론 앞뒤로 공간을 주어 var name : String 로 만들기도 하지만 이것은 틀렸다.

여기서 배운 것은 스위프트는 항상 모든 변수나 상수가 가지는 데이터의 타입을 알고 싶어한다는 것이다. 항상. 너는 그것을 피할 수 없으며 이것은 타입 안전성이라는 것을 제공하기 때문에 좋다 – 만약 “이것은 문자열을 가진다”라고 말한 뒤에 토끼를 넣으려 한다면 스위프트는 이것을 거절할 것이다.

우리는 Int라고 불리는 또다른 중요한 데이터 타입을 시도해볼 수 있다. 이것은 “integer”의 축약이다. 정수는 3, 30, 300 -16777216과 같은 반올림숫자이다.

var name: String
name = “Tim McGraw”

var age: Int
age = 25

이것은 한 변수는 문자열로, 한 변수는 정수로 선언한다. String 과 Int 둘 다 대문자로 시작하지만 name과 age는 그렇지 않다는 것을 주목해라 – 이것은 스위프트의 표준 코딩 공식이다. 이 코딩 공식은 스위프트에 중요한 것은 아니지만(네가 원하는 대로 이름을 써도 된다!) 다른 개발자들에게 중요한 것이다. 이 경우, 데이터타입은 대문자로 시작하지만 변수와 상수는 대문자로 시작하지 않는다.

이제 두 가지 다른 타입의 변수를 가지므로 타입 안전성이 작동하는 것을 볼 수 있다. 이것을 작성해봐라

name = 25
age = “Tim McGraw”

이 코드에서, 너는 문자열 변수에 정수를 넣고 정수 변수에 문자열을 넣으려 한다. – 그리고 감사하게도 Xcode는 오류를 던질 것이다. 너는 이것이 지나치게 규칙적이라고 할 수 있지만 실제로 꽤 유용하다 : 너는 변수가 한 가지 타입의 데이터만 가진다고 약속하고 Xcode는 너의 작업 전반에서 이것을 적용한다.

- Float and Double

Float 과 Double이라 불리는 두 가지 데이터 타입을 더 살펴보자. 이것은 3.1, 3.141, 3.1415925 과 같은 분수 구성요소로 숫자를 저장하는 스위프트의 방식이다. 원하는 정확도를 선택하기 위해 이를 위한 두 가지 데이터타입이 있지만 대부분의 경우 중요하지 않으므로 Apple은 가장 높은 정확도를 가지는 double을 사용하길 권장한다.

이것을 플레이그라운드에 작성해 보아라

var latitude: Double
latitude = 36.1667

var longitude: Float
longitude = -86.783333

두 숫자 모두 오른쪽에 표시되는 것을 볼 수 있지만 자세히 보면 작은 차이가 있다. 우리는 Longitude를 -86.783333으로 지정하였지만 결과창에서는 -86.7333을 볼 것이다 – 끝에 마지막 3이 빠졌다. 너는 이렇게 말할지도 모른다. “0.000003이 중요해?” 그러나 이것은 내가 정확성에 대해 말한 것을 보여준다.

플레이그라운드는 네가 작성한대로 보여주기 때문에 Float 과 Double의 차이를 알기 위해 몇 가지를 시도해볼 수 있다.

var longitude: Float
longitude = -86.73333
longitude = -186.73333
longitude = -1286.73333
longitude = -12386.73333
longitude = -123486.73333
longitude = -1234586.73333

이것은 소수점 앞의 숫자를 증가시키고 뒤의 숫자는 그대로 유지한다. 그러나 결과창을 보면 네가 소수점 앞에 숫자를 추가할 수록 스위프트는 뒤의 숫자를 제거한다는 것을 볼 수 있다. 이것은 숫자를 저장하기엔 한정된 공간이 있기 때문에 가장 주용한 부분먼저 저장하기 때문이다 – 1000000만큼 떨어져 있는 것은 크지만 0.000003은 덜 중요하다.

이제 Float을 Double로 바꾸면 스위프트가 항상 정확한 숫자를 출력하는 것을 볼 수 있을 것이다.

var longitude: Double

이것은 왜냐하면, Double 은 Float에 비해 두 배의 정확성을 가지기 때문에 숫자를 잘라낼 필요가 없기 때문이다. 그러나 Double도 제한이 있다 – 123456789.123456789와 같이 거대한 숫자를 사용하려한다면 123456789.1234567로 잘리는 것을 볼 것이다.

- Boolean

스위프트는 참인지 거짓인지를 저장하는 내장 데이터 타입을 가진다, 이것은 Boolean의 줄임말로 Bool이라 불린다. Bool은 “아마도”를 위한 공간이 없으면 오로지 절대값만 가진다 : 참 또는 거짓

var stayOutTooLate: Bool
stayOutTooLate = true

var nothingInBrain: Bool
nothingInBrain = true

var missABeat: Bool
missABeat = false

팁 : 이러한 변수들은 특정한 방법으로 작성되는 것을 알 것이다 : 우리는 MissABeat, missabeat 와 같이 작성하지 않고 첫 문자는 소문자로, 다음 두 번째 단어와 그 다음 단어의 첫 문자를 대문자로 작성한다. 이것은 낙타의 혹처럼 생겼다고 해서 “camel case”라고 불리고 변수 이름의 단어를 읽기 쉽게 하기 위해 사용된다.

- Using Type annotations wisely

배웠듯이 변수가 어떤 데이터 타입을 가지는지 스위프트에 말해주는 두 가지 방식이 있다 : 변수를 만들 때 값을 할당하거나 타입 주석을 사용하는 것이다. 선택 할 수 있다면 첫 번째가 더 명확하기 때문에 항상 더 선호된다.

var name = “Tim McGraw”

이것이 아래

var name: String
name = “Tim McGraw”

보다 선호된다.

이것은 모든 데이터 타입에 적용된다.

var age = 25
var longitude = -86.783333
var nothingInBrain = true

이것은 타입 추론이라 불리는 기술이다. 네가 변수에 넣고 싶어하는 데이터의 타입을 보고 스위프트는 변수에 사용될 데이터의 타입을 추론할 수 있다. -86.783333과 같은 숫자의 경우 스위프트는 항상 Float 보다 Double을 추론한다.

완전성을 위해 다음과 같이 동시에 데이터 타입을 구체화하고 값을 제공하는 것도 가능하다.

var name : String = “Tim McGraw”

3. Operators

연산자들은 네가 수학 수업에서 처음 배운 작은 기호들이다 : + 더하기, - 빼기, * 곱하기, / 나누기, = 값 할당 등등. 이것들은 모두 몇 가지 추가 기능과 함께 스위프트 안에 있다.

몇 가지 기본을 시도해보자 – 플레이그라운드에서 작성해 봐라

var a = 10
a = a + 1
a = a – 1
a = a * a

결과 창에서, 너는 10, 11, 10, 100 을 볼 것이다
이제 이걸 해보자

var b = 10
b += 10
b -= 10

+= 는 “더하고 할당해라”라는 연산자이다. 우리의 경우 이것은 “b의 값을 가져와 10을 더하고 그 값을다시 b에 넣어라”라는 의미이다. 네가 상상했듯이, -=도 같은 것을 의미하지만 더하지않고 뺀다. 따라서 저 코드는 10, 20, 10을 결과창에서 보여줄 것이다.

이 연사자들은 다른 데이터 타입에도 직용 가능하다. 네가 상상했듯이, 너는 두 개의 실수(Double)를 다음과 같이 더할 수 있다.

var a = 1.1
var b = 2.2
var c = a + b

문자열의 경우 +는 문자열을 결합한다.

var name1 = “Tim McGraw”
var name2 = “Romeo”
var both = name1 + “and” + name2

이것은 결과창에 “Tim McGraw and Romeo”를 작성할 것이다.

또 하나의 일반적인 연산자는 퍼센트 기호로 작성되는 모듈러스 라는 것이다. : % 이것은 “왼쪽 숫자를 오른쪽 숫자로 나누고 그 나머지를 반환해라”라는 의미이다. 따라서, 9 % 3 은 3이 9를 균등하게 나누기 때문에 0을 반환한다. 반면에 10 % 3은 1을 반환한다.

- Comparison operators

스위프트는 값의 비교를 수행하는 일련의 연산자를 가진다.
예를 들어,

var a = 1.1
var b = 2.2
var c = a + b

c > 3
c >= 3
c > 4
c < 4

이것은 크다(>), 크거나 같다(>=), 작다(<) 를 표시한다. 결과 창에서, 너는 참,참, 거짓, 참을 볼 것이다 – 각 문항에 대한 답은 참 이나 거짓밖에 없기 때문에 이들은 Boolean이다.

같은지 확인하고 싶을 때, = 를 사용할 수는 없다. 왜냐하면 이미 다른 의미가 있기 때문이다 : 이것은 변수에 값을 줄 때 사용된다. 따라서, 스위프트는 == 형식의 대안을 가진다, 이는 “~와 같다”라는 의미를 가진다.

var name = “Tim McGraw”
name == “Tim McGraw”

이것은 결과 창에서 “참”을 보여줄 것이다. 이제 네가 알아차릴 수 있는 한 가지는 스위프트 문자열은 대소문자를 구분한다는 것이다. “Tim McGraw” 와 “TIM MCGRAW”, “TiM mCgRaW”는 모두 다른 것으로 고려된다. 만약 네가 두 가지 문자열을 비교하기 위해 ==를 사용한다면. 너는 이들이 모두 같은 대소문자를 가지는지 알아야한다.
내가 소개하고 싶은 연산자가 한 가지 더 있다. 이것은 “not”연산자 이다. : !. 맞아, 이건 그냥 느낌표이다. 이것은 네 문항이 실제로 한 일의 반대를 의미하도록 한다. 예를 들어,

var stayOutTooLate = tru
stayOutTooLate
!stayOutTooLate

이것은 참, 참, 거짓을 출력할 것이다 – 마지막 값은 이전 true를 뒤집은 값이기 때문에 거짓이다.

너는 ! 와 = 를 함께 사용해서 != “같지 않음”을 만들 수 있다. 예를 들어,

var name = “Tim McGraw”
name == “Tim McGraw”
name != “Tim McGraw”

4. String interpolation

사실 이건 매우 간단한 것임에 비해 화려한 이름이다 : 변수와 상수를 문자열 안에 넣는 것이다.

작성한 모든 코드를 지우고 이것만 남겨라

var name = “Tim McGraw”

만약 이름을 포함한 메세지를 사용자에게 보여주고 싶다면, 문자열 보간(string interpolation)이 적절하다 : 백슬래쉬를 적고, 괄호를 열고, 코드를 작성하고 괄호를 닫아주면 된다. 다음과 같이

var name = “Tim McGraw”
“Your name is \(name)”

결과 창에는 모두 하나의 문자열처럼 “Your name is Tim McGraw”가 나타날 것이다. 문자열 보간이 두 가지를 결합하였기 때문이다.

이제 + 연산자를 사용해서 작성할 수도 있다.

var name = “Tim McGraw”
“Your name is “ + name

하지만 이것은 여러 변수를 함께 결합할 때는 효율적이지 않다. 게다가, 스위프트의 문자열 보간은 다양한 데이터 타입을 자동으로 다루는데에 충분히 똑똑하다. 예를 들어,

var name = “Tim McGraw”
var age = 25
var latitude = 36.166667

“Your name is \(name), your age is \(age), and your latitude is \(latitude)”

이것을 +를 사용해서 한다면 훨씬 복잡할 것이다. 왜냐하면 스위프트에서는 정수와 실수는 문자열에 더해질 수 없기 때문이다.

이 시점에서는 결과가 결과 창에 더 이상 맞지 않을 수 있으므로 결과창을 조정하거나 결과 위로 마우스를 가져간 다음 인라인으로 표시되도록 하는 + 버튼을 클릭해라

문자열 보간의 강력할 특징 중 하나는 (과 ) 사이의 모든 것이 스위프트의 표현이 될 수 있다는 것이다. 예를 들어, 너는 연산자를 사용해서 그 안에서 수학을 할 수도 있다.

var age = 25
“You are \(age) years old. In another\(age) years you will be \(age * 2).”

출처

0개의 댓글