Coding Log

스위프트 찔러보기 - (1) Simple Values

Hello, Swift!

모든 프로그래밍 언어를 배울 때 제일 처음 예제는 Hello, World를 출력해보는 것이다.

Swift는 아래와 같이 Hello, World를 찍는다.

print("Hello, World!")
print("Hello, Swift!")

C언어를 다뤄본 사람이라면 아래와 같이 Hello, World를 찍었을 것이다.

#include <stdio.h>
 
int main(void) {
  printf("Hello, World!");
  return 0;
}

하지만 Swift는 위의 include나 import 없이 print문 하나로 Hello, World를 찍는 완전한 프로그램으로 동작한다.

이는 input/output이나 문자열을 사용하기 위해 별다른 라이브러리가 필요없다는 것을 뜻한다.

또한 세미콜론도 없고, main함수도 없는데 이는 entry point(프로그램의 진입점)이 따로 필요없는 Swift의 특성을 잘 보여준다.

이번 포스팅에서는 Swift로 어떻게 프로그램을 작성해야 하는지 간단하게 몇몇 예제를 찔러볼 예정이다.

물론 자세한 내용은 후에 게시할 포스팅에서도 확인할 수 있다.

본 블로그에 올라가는 포스팅은 애플의 공식 사이트를 대강 번역해서 작성하는 것이기 때문에 아래 링크에서 찔러보기 포스팅에서 쓸 예제 코드를 받을 수 있다.

참고 애플의 Playground를 이용한 Swift Example 다운로드 링크

단순한 값 선언

let 키워드를 사용하면 상수를, var 키워드를 사용하면 변수를 선언할 수 있다.

여기서 상수는 컴파일 중필요가 없으니 단 한 번만 값을 저장할 수 있으며, 이는 프로그램이 실행되고 있는 내내 상수에 저장된 동일한 값을 많은 곳에서 동시에 쓸 수 있다는 것을 뜻한다.

아래는 변수와 상수의 예제 코드이다.

var myVariable = 42 // 변수 myVariable에 값 42를 저장한다. 
myVariable = 50 // 변수 myVariable에 저장된 값을 50으로 변경한다. 
let myConstant = 42 // 상수 myConstant에 42를 저장한다. 

위의 예제 코드에서 할 수 있듯 42를 저장하기 위하여 정수를 담을 수 있는 Integer형태의 변수를 선언할 필요가 없다.
상수나 변수를 선언하고 값을 저장하는 과정에서 컴파일러가 각 변수 및 상수에 저장되는 해당 값을 보고 타입을 추측하기 때문이다.

이를 타입 추론(Type Inference) 이라 하는 데, 이는 Swift의 특징 중 하나이기도 하다.

하지만 반대로 선언과 동시에 저장된 값이 없으면 컴파일러는 타입 추론을 할 수 없다.

아래의 예제를 보자

var myVariable1 = 10
var myVariable2 = 20
 
print(myVariable1)
print(myVariable2)

위의 코드를 실행하면

10
20

위와 같이 출력된다. 이는 myVariable1는 10이, myVariable2는 20이 저장됨으로써 정수라는 것을 컴파일러가 추측하고 있다고 볼 수 있다.

하지만 아래와 같이 코드를 변경하게 되면

var myVariable1 = 10
var myVariable2
 
print(myVariable1)
print(myVariable2)

오류가 나게 된다.

myVariable2에 저장된 값이 없는데 print함수로 출력해서 그런걸까?

다시 고쳐보자.

var myVariable1 = 10
var myVariable2
 
print(myVariable1)

위의 코드에선 myVariable2를 출력하지 않아도 오류가 나게된다.

이는 myVariable2의 타입을 컴파일러가 추론하지 못하기 때문이다.

만약 변수 중 저장할 값이 정해지지않고, 추후에 실행과정에서 값을 저장하게 된다면 아래와 같이 작성하면 된다.

var myVariable1 = 10
var myVariable2 : Int
 
print(myVariable1)

myVariable2에 어떤 값이 저장될지는 모르겠지만 추후에 저장될 값이 정수(Integer)라고 명시함으로써 컴파일러의 추론에서 발생하는 오류를 제거할 수 있게 되는 것이다.

또 다른 코드를 보면서 타입에 대해 더 자세히 알아보자

let implicitInteger = 70 // 컴파일러가 정수 타입의 상수임을 추론한다. 
let implicitDouble = 70.0 // 컴파일러가 실수 타입의 상수임을 추론한다. 
let explicitDouble: Double = 70 // 실수 타입의 상수임을 명시한다. 

위에 예제에 작성된 주석을 보면 타입을 명시하느냐 안 하느냐의 차이를 알 수 있다.

한 번 타입이 결정된 값은 절대로 다른 타입의 값으로 저장 할 수 없다.

만약에 다른 타입의 값으로 변환해야 한다면 원하는 형태의 인스턴스를 생성해 타입을 명시해야 한다.

let label = "The width is "
let width = 94
let widthLabel = label + String(width)

위에서 상수 widthLabel에 저장하는 값을 보면 label은 문자열, width는 정수임을 알 수 있다.

즉 타입이 다른 값을 widthLabel에 저장하려는 것이다.

오류를 방지하기 위해 String(width)를 이용해 정수 94를 문자열 94로 명시적 형변환을 한 것이다.

let apples = 3
let oranges = 5
let appleSummary = "I have \(apples) apples."
let fruitSummary = "I have \(apples + oranges) pieces of fruit."

문자열 안에 문자열 타입이 아닌 값들을 쉽게 넣으려면 \(VALUE_NAME)를 쓴다.

appleSummary는 "I have 3 apples." 가 저장되고,

fruitSummary는 "I have 8 pieces of fruit." 가 저장된다.

자료구조인 배열(Array)과 딕셔너리(Dictionary)는 대괄호 [ ]를 이용해서 만들 수 있다.

대괄호 안에 특정 요소(element)에 접근할 수 있는 값(index or key)을 넣어 각각의 요소에 접근한다.

기존 언어들의 배열 구조와는 다르게 제일 마지막에도 ,를 쓸 수 있다.

아래의 코드를 통해 배열과 딕셔너리의 선언을 확인해보자.

var shoppingList = ["catfish", "water", "tulips", "blue paint"]
shoppingList[1] = "bottle of water"
 
var occupations = [
    "Malcolm": "Captain",
    "Kaylee": "Mechanic",
]
occupations["Jayne"] = "Public Relations"

만약 요소가 없는 배열이나 딕셔너리를 만들고 싶으면 아래와 같이 initializer syntax를 사용한다.

let emptyArray = [String]()
let emptyDictionary = [String: Float]()

만약에 요소가 없는 배열이나 딕셔너리에 들어갈 요소들의 값이 정해지지 않았다면 배열을 []을 사용하고 딕셔너리는 [:]를 사용한다.

emptyArray = []
emptyDictionary = [:]

보면 알겠지만 위의 initializer syntax에서 value type와 괄호만 빠진 형태다.


DISQUS 로드 중…
댓글 로드 중…

트랙백을 확인할 수 있습니다

URL을 배껴둬서 트랙백을 보낼 수 있습니다