[Swift] 스위프트의 특성과 기초 문법

@inup· 7 min read

이번 해커톤을 통해 macOS 앱 개발을 시작하며 Swift라는 언어를 처음 접했다. Swift는 Apple이 2014년 WWDC에서 처음 발표한 언어로, 기존의 Objective-C가 가진 한계를 극복하고 더 안전하고 빠르며 현대적인 개발 환경을 제공하기 위해 만들어졌다. 직접 학습하고 사용해 보며 느낀 Swift의 가장 큰 특징은 설계 단계에서부터 '안전성(Safety)'을 강제한다는 점과, 코드가 간결해지는 '표현력(Expressiveness)'이었다.

Swift의 주요 특징: 안전성(Safety)

Swift는 개발자가 저지를 수 있는 실수를 문법적 제약을 통해 원천적으로 차단하려고 노력한다. 대표적인 예가 엄격한 타입 시스템과 초기화 규칙이다.

  1. 엄격한 타입 통제: Swift는 데이터 타입에 매우 민감하다. 예를 들어, 정수(Int)와 실수(Double)를 연산하려고 하면, 암시적 변환을 허용하지 않고 컴파일 에러를 발생시킨다. 이는 런타임에 발생할 수 있는 예기치 못한 데이터 손실이나 버그를 코드를 작성하는 시점에 미리 방지해 준다.
  2. 필수 초기화: 모든 변수와 상수는 사용되기 전에 반드시 초기화되어야 한다. 초기화되지 않은 메모리 공간에 접근하여 발생할 수 있는 쓰레기 값 문제를 방지하기 위함이다.
  3. 배열 인덱스 검사: 배열의 범위를 벗어나는 접근을 시도하면, Swift는 런타임 에러를 통해 즉시 프로그램을 중단시켜 메모리 오염이 확산되는 것을 막는다.

상수와 변수 (let과 var)

Swift에서는 값을 저장하는 공간을 정의할 때 상수(let)와 변수(var)를 명확히 구분한다. 문법적으로는 단순한 키워드 차이처럼 보이지만, 여기에는 코드의 의도를 명확히 하려는 철학이 담겨 있다.

  • let (상수): 한 번 값이 할당되면 이후 변경할 수 없다.
  • var (변수): 값을 언제든지 다시 할당할 수 있다.

Swift를 다루는 개발자들은 기본적으로 let을 사용하고, 값이 변해야만 하는 필연적인 이유가 있을 때만 var로 변경하는 것을 권장한다. 이는 코드의 불변성(Immutability)을 높여주는데, 불변성이 보장된 데이터는 멀티 스레드 환경에서도 동기화 문제없이 안전하게 공유될 수 있으며, 코드를 읽는 사람에게 "이 값은 변하지 않는다"는 확신을 주어 로직 파악을 돕는다.

// 상수로 선언 (변경 불가)
// 최대 로그인 시도 횟수는 변하면 안 되는 설정값이므로 let이 적합하다.
let maxLoginAttempts = 10

// maxLoginAttempts = 11  // 컴파일 에러 발생: 'let' 상수는 변경할 수 없음

// 변수로 선언 (변경 가능)
// 현재 로그인 시도 횟수는 계속 증가해야 하므로 var가 적합하다.
var currentLoginAttempt = 0
currentLoginAttempt = 1 

타입 추론 (Type Inference)

Swift는 정적 타이핑 언어이므로 컴파일 시점에 모든 변수의 타입이 결정되어야 한다. 하지만 매번 타입을 명시적으로 적어야 하는 것은 아니다. 컴파일러가 할당된 초기값을 분석하여 적절한 타입을 자동으로 지정해 주는 타입 추론 기능을 제공하기 때문이다.

// 타입을 명시한 경우 (Type Annotation)
let explicitDouble: Double = 70.0

// 타입을 생략한 경우 (Type Inference)
// 컴파일러가 70.0을 보고 자동으로 Double 타입으로 추론한다.
let implicitDouble = 70.0 

// 정수의 경우
let meaningOfLife = 42 // Int로 추론됨

이 기능 덕분에 Swift 코드는 정적 언어의 안전성을 유지하면서도, 동적 언어처럼 간결한 문법을 가질 수 있다.

문자열 보간 (String Interpolation)

문자열 안에 변수나 상수, 혹은 표현식의 결과를 삽입하는 과정도 매우 직관적이다. 백슬래시와 괄호 \() 조합을 사용하면, 데이터를 문자열로 변환하는 별도의 함수 호출 없이도 자연스럽게 문장을 구성할 수 있다.

let apples = 3
let oranges = 5

// 변수 삽입
let appleSummary = "I have \(apples) apples." 

// 표현식(연산) 삽입
let fruitSummary = "I have \(apples + oranges) pieces of fruit."
// 결과: "I have 8 pieces of fruit."

기본 문법을 학습하며 느낀 점은, Swift가 단순히 코드를 짧게 줄이는 것에만 집중한 것이 아니라 '안전하게 코드를 작성하는 습관'을 문법적으로 유도하고 있다는 것이다. let을 기본으로 사용하는 습관이나 엄격한 타입 검사는 처음에는 번거로울 수 있지만, 결과적으로 견고한 애플리케이션을 만드는 기반이 될 것으로 보인다.

@inup
언제나 감사합니다 👨‍💻