Swift 기초 문법 (1/2)

Swift 언어의 기본 문법을 설명하고, 예제 코드로 문법을 알아보겠습니다.

Playground를 실행하여 실습해 보면 좋겠습니다.
맥을 사용하지 않고 있다면 온라인에서 실습하는 방법도 있습니다.

https://online.swiftplayground.run/

https://swiftfiddle.com/

Swift는 애플에서 개발한 언어인데요. iOS, macOS, watchOS, tvOS 등의 애플 플랫폼에서 사용되는 객체 지향 프로그래밍 언어입니다. Swift는 Objective-C를 대체하기 위해 애플에서 개발했습니다. 과거의 Objective-C의 코드를 보셨던 분이라면, Swift 개발에 박수를 보낼 것이라고 생각합니다. Objective-C를 생각하면, 수많은 대괄호와 별표시가 떠오를 겁니다.

Swift의 철학은 3단어로 표현되는데요, Safe, Fast, Expressive 입니다. Swif를 사용하다보면 3가지 철학이 느껴집니다.

기본적으로 사용되는 데이터 타입

Swift에서 기본적으로 사용되는 데이터 타입에는 Int, Float, Double, Bool, String 등이 있습니다. 변수를 선언할 때는 var 키워드를 사용하며, 상수를 선언할 때는 let 키워드를 사용합니다. 변수와 상수를 선언할 때, 데이터 타입을 지정할 수 있지만, 지정하지 않아도 됩니다.

// Swift 기본 문법
var number = 10
var number2 : Int = 20
let constant = "Hello, world!"
let constant2 : String = "Hello, again!"
print(number) // 10
print(number2) // 20
print(constant) // Hello, world!
print(constant2) // Hello, again!

코드를 보셔서 아시겠지만, 문장 끝에 세미콜론을 생략해도 됩니다. 모던 언어들의 특징이죠.

함수 표현 방법

Swift에서는 함수를 정의할 때 func 키워드를 사용합니다. 일반적으로 많이 아시는 것처럼, 함수를 정의할 때는 매개변수를 받을 수 있고, 반환값을 가질 수 있습니다. 함수에서는 기본적으로 매개변수의 데이터 타입과 반환값의 데이터 타입을 지정해주어야 합니다.또한 함수를 정의할때 매개변수를 생략하거나, 기본값을 설정할 수도 있습니다.

// Swift 함수와 메소드
func addNumbers(_ num1: Int, _ num2: Int) -> Int {
    return num1 + num2
}

class Calculator {
    func multiplyNumbers(_ num1: Int, _ num2: Int) -> Int {
        return num1 * num2
    }
}

let result1 = addNumbers(5, 3)
let calc = Calculator()
let result2 = calc.multiplyNumbers(5, 3)
print(result1) // 8
print(result2) // 15

// 매개 변수 없는 함수 선언
func sayHello() {
    print("Hi!")
}

sayHello()  // "Hi!"

// 기본값이 있는 함수
func greeting(name: String = "Guest") {
    print("안녕하세요, \(name)님!")
}

// 함수 호출
greeting()          // "안녕하세요, Guest님!" 출력
greeting(name: "John")   // "안녕하세요, John님!" 출력

데이터 타입

Swift에서는 다양한 데이터 타입의 배열과 딕셔너리를 지원합니다. 배열을 사용할 때는 [] 안에 데이터를 쉼표로 구분하여 나열하며, 딕셔너리를 사용할 때는 [:] 안에 key-value 형태로 데이터를 나열합니다. 튜플은 여러 개의 데이터를 하나의 변수에 저장할 때 사용합니다. 튜플을 사용할 때는 () 안에 데이터를 쉼표로 구분하여 나열하며, 각각의 데이터는 .0, .1, .2 등의 인덱스로 접근할 수 있습니다.

// Swift 데이터 타입과 컬렉션
var names = ["John", "Mary", "Tom"]
var scores = [Int]()
scores.append(90)
scores.append(80)
scores.append(70)
var person = (name: "John", age: 30)
print(names) // ["John", "Mary", "Tom"]
print(scores) // [90, 80, 70]
print(person.name) // John

// 딕셔너리
var fruits = [String: Int]()
fruits["apple"] = 3
fruits["banana"] = 2
fruits["orange"] = 5
// 값 변경
fruits["banana"] = 4
// 값 삭제
fruits.removeValue(forKey: "orange")
// 출력
print(fruits) // ["apple": 3, "banana": 4]

// 튜플
let student = ("John", 18, "male")
// 튜플 요소 접근
let name = student.0
let age = student.1
let gender = student.2
// 튜플 분해 할당
let (studentName, studentAge, studentGender) = student
// 출력
print(student) // ("John", 18, "male")

조건문

Swift에서 조건문으로 if, switch가 있습니다. if문은 다른 언어와 마찬가지로 조건이 참일 때 코드를 실행하고, switch문은 여러 개의 경우(case)를 비교하여 해당하는 코드를 실행합니다. Swift에는 guard 라는 독특한 문법도 있습니다. guard는 조건이 참이 아닐 경우 코드를 종료시킬때 사용합니다. if-else 의 else 에 해당되는 반대 경우를 수행하는 블럭이 없으므로, 반대 경우 수행하는 블럭을 이후에 작성합니다. (말그대로 가드를 치고 조건문이 아닌 경우 자기 영역으로 끌고 와서 처리한다고 생각하면 외우기 쉽습니다. 혹은 가드를 치고 조건문이 맞으면 통과 다음 문장으로 진행이라고 생각하셔도 됩니다. 그래서 guard 문장에는 return이 들어가는 경우가 많습니다.)

//if 문
var age = 20
if age >= 19 {
    print("You are an adult.")
} else {
    print("You are a minor.")
}

//guard 예시
func checkAge(age: Int?) {
  guard let age = age, age >= 18 else {
    print("You are not old enough to vote.")
    return
  }
  print("Welcome to the voting booth!")
} // 18세 이상이면 guard 를 지나침. 

반복문

반복문으로는 for-in, while, repeat-while이 있습니다. for-in은 배열의 요소나 딕셔너리의 key-value 쌍을 순차적으로 탐색하며, while문과 repeat-while문은 조건이 참인 동안 코드를 반복 실행합니다.

// 반복문
var sum = 0
for i in 1...5 {
    sum += i
}
print(sum) // 15

var i = 1
while i <= 5 {
    print(i)
    i += 1
}

repeat {
    print(i)
    i += 1
} while i <= 10

옵셔널

Swift에서는 옵셔널이라는 개념을 제공합니다. 옵셔널은 값이 있을 수도 있고 없을 수도 있는 변수를 선언할 때 사용합니다. nil 값을 할당할 수 있는 데이터 타입 뒤에 ?를 붙여서 옵셔널을 사용할 수 있습니다. 옵셔널을 사용할 때는 optional binding을 통해 값이 존재할 때와 nil일 때 각각의 처리를 할 수 있습니다. 옵셔널 값을 사용할 때는 강제 추출(forced unwrapping)을 사용하여 값이 있을 때만 처리할 수도 있습니다. 아래 예시 보겠습니다.

// Swift 옵셔널
var optionalValue: Int? = 5
if let value = optionalValue {
    print("optionalValue is \(value)")
} else {
    print("optionalValue is nil")
}

var optionalString: String? = "Hello, world!"
print(optionalString!) // Hello, world!

구조체와 클래스

Swift에서는 구조체와 클래스가 있다. 구조체는 단순한 값을 다룰 때 사용하며, 클래스는 객체를 다룰 때 사용된다. 구조체와 클래스는 프로퍼티와 메소드를 가질 수 있으며, 상속과 다형성도 지원된다.

// Swift 구조체와 클래스
struct Person {
    var name: String
    var age: Int
}

class Animal {
    var name: String
    init(name: String) {
        self.name = name
    }
}

var person = Person(name: "John", age: 30)
var animal = Animal(name: "Dog")
print(person.name) // John
print(animal.name) // Dog

본 글은 여기서 마무리 하고, 2번째 시간에는 프로토콜, 클로져, 에러처리등을 살펴보겠습니다.

감사합니다.

https://iothingsmaker.com/swift-%ea%b8%b0%ec%b4%88-%eb%ac%b8%eb%b2%95-2-2/

Leave a Comment