Swift 6주차 - 기본 문법 알아보기

2024. 4. 13. 14:53swift

Swift 6주차 - 기본 문법 알아보기

 

이번 주차에서는 Swift의 기본 문법에 대해서 알아보려고 한다.

 

목차

     

     

    데이터 타입(자료형)

     

    Swift에서 사용할 수 있는 테이터 타입은 Int(정수), Double(부동소수점), Float(부동소수점), Bool(부울), String(문자열), Character(문자), Void(값 없음) 등이 있다.

     

     

    Int는 정수(소수점이 없는 수)를 저장하는데 사용한다.

     

    특정 크기 8비트, 16비트, 32비트, 64비트도 지정해 줄 수 있다.

    • Int8, Int16, Int32, Int64

     

    부호없는 정수도 지원한다.

    • UInt8, UInt16, UInt32, UInt64

     

    이렇게 특정 크기의 데이터 타입을 지원하지만 애플에서는 그냥 Int 타입을 권장하고 있다.

     

    Int 타입은 해당 코드가 실행되는 플랫폼에 맞는 정수 크기를 사용한다.

     

    var num: Int = 15

     

    (초기값 15가 있으므로 Int 타입명시는 일반적으로 생략한다.)

     

     

     

    Double과 Float은 부동 소수점을 나타내는데 사용한다.

     

    Double 타입

    • 64비트로 부동 소수점 수를 저장, 소수점 15자리 정확도

     

    Float 타입

    • 32비트로 부동 소수점 수를 저장, 소수점 6자리 정확도

     

    var num: Double = 3.14

     

    (초기값 3.14가 있으므로 Double 타입명시는 일반적으로 생략한다.)

     

     

     

    Bool은 참 또는 거짓(1 또는 0) 조건을 처리할 때 사용한다.

     

    두개의 불리언 상수값 true/false를 사용한다.

     

    var existUser: Bool = true

     

    (초기값 true가 있으므로 Bool 타입명시는 일반적으로 생략한다.)

     

     

     

    String은 문자열을 나타내는데 사용한다.

     

    저장, 검색, 비교, 문자열 연결, 수정 등의 기능을 포함한다.

     

    문자열 보간을 사용하여 문자열과 변수, 상수, 표현식, 함수 호출의 조합으로 만들 수도 있다.

    var userName: String = "Kim"
    var age = 20
    var message = "\(userName)의 나이는 \(age)입니다."
    print(message) // Kim의 나이는 20입니다.

     

     

     

    var 변수

     

    기본적으로 변수(variable)는 프로그램에서 사용할 데이터를 저장하기 위한 메모리 공간이다.

     

    변수에 할당된 값은 변경 가능하다.

     

    var myVariable = 10
    var x = 0.0, y = 0.0, z = 0.0

     

     

    let 상수

     

    상수(constant)는 데이터 값을 저장하기 위하여 메모리 내의 명명된 공간을 제공한다는 점에서 변수와 비슷하다.

     

    하지만 상수는 어떤 값이 한번 할당되면 이후에 그 값을 변경할 수 없다.

     

    상수는 코드 내에서 반복적으로 사용되는 값이 있을 때 유용하다.

     

    let maxNumber = 100
    let π = 3.14
    let 😀 = "smile"

     

     

    변수나 상수 명은 영문자, 숫자, Unicode(이모티콘, 한글, 중국어 •••) 도 가능하다.

     

     

     

    타입 추론

     

    var myNumber = 10

     

    위 예시에서 myNumber라는 변수를 생성하고 숫자 10을 할당하였다.

     

    변수를 생성할 때 타입을 지정해주지 않았지만 초기값이 있을 경우에는 컴파일러가 타입 추론을 하므로 데이터 타입을 명시해 주지 않아도 된다.

     

    var message: String

     

    위 예시에서는 초기값이 없으므로 String으로 타입을 지정해 줬다.

     

     

    아래와 같은 경우에는 자동으로 타입을 추론해준다.

     

    let number = 10 // Int
    let pi = 3.141592 // Double
    let anotherPi = 3 + 0.141592 // Double

     

     

     

    튜플 (Tuple)

     

    튜플은 여러 값을 하나의 개체에 일시적으로 묶는 방법을 말한다.

     

    튜플에 저장되는 항목들은 어떤 타입도 될 수 있으며 저장된 값들의 타입이 달라도 상관없다.

     

    let myTuple = (10, 12.1, "Hi")

     

     

    튜플의 요소들은 여러가지 다른 방법들을 사용하여 접근할 수 있다.

     

    특정 튜플 값은 인덱스 위치를 참조하면 간단하게 접근 가능하다.

     

    let myTuple = (10, 12.1, "Hi")
    var myString = myTuple.2
    print(myString) // Hi

     

    위 예시에서 myString 변수에 myTuple의 2번값인 Hi가 들어가서 출력된다.

     

    튜플에서 인덱스값은 왼쪽값 0번부터 시작한다.

     

     

     

    튜플을 생성할 때 각 값에 이름을 할당할 수도 있다.

     

    let myTuple = (count: 10, length: 12.1, message: "Hi")

     

     

    옵셔널 타입

     

    옵셔널(Optional) 데이터 타입은 다른 프로그래밍 언어에는 없는 새로운 개념이다.

     

    값을 반환할 때 오류가 발생할 가능성이 있는 값(ex: nil)은 옵셔널 타입이라는 객체로 감싸서 반환한다.

     

     

    Swift에서 기본 자료형(Int, Double, String 등)은 nil값을 저장할 수 없다.

    따라서 nil도 저장하려면 옵셔널 타입으로 선언해야 한다.

     

     

    옵셔널 타입은 변수 또는 상수에 아무런 값이 할당되지 않는 상황을 안전하게 처리하기 위한 방법을 제공해준다.

     

    옵셔널 타입 변수를 선언하기 위해서는 타입 선언부 뒤에 '?' 문자를 쓰면 된다.

     

    var index: Int?

     

    위 예시에선 index라는 이름의 옵셔널 Int 변수를 선언했다.

     

    index 변수는 정수 값을 갖거나 아무 값도 갖지 않을 수 있다.

     

     

     

    옵셔널 변수에 값이 있으면 옵셔널로 래핑되었다(wrapped)라고 한다.

     

    옵셔널에 래핑된 값은 강제 언래핑(forced unwrapping)으로 풀어줘야 한다.

     

    var x: Int?
    x = 10
    print(x) // Optional(10)
    print(x!) // 10

     

    위 예시처럼 변수명 뒤에 '!'를 붙여 언래핑 할 수 있다.

     

     

    ?는 자료형 뒤

    !는 변수명 뒤

     

     

    함수

     

    함수는 특정 작업을 수행하는 코드 블록이다.

     

    수행하기 위하여 데이터가 제공될 수 있으며 함수를 호출한 코드에 작업한 결과를 반환할 수도 있다.

     

     

    함수 정의부 값을 매개변수(parameter, 인자), 호출시의 값은 아규먼트(argument, 인수)라고 부른다.

     

     

     

    함수를 부르는 또 다른 말이 있는데 바로 메서드(method)이다.

     

    메서드는 특정 클래스, 구조체, 열거형 내의 함수를 의미한다.

     

    함수를 스위프트 클래스 내에 선언하면 메서드라고 부른다.

     

     

    func add(first x: Int, second y: Int) -> {
    	return (x+y)
    }
    
    add(first:10, second:20)

     

    스위프트에서는 내부 매개변수 이름과 외부 매개변수 이름이라는 개념이 존재한다.

     

    함수를 선언할 때 내부 매개변수인 x 앞에 외부 매개변수 이름으로 first를 지정하면 외부에서 add함수를 사용할 때 반드시 first를 사용하여 아규먼트를 전달해야 한다.

     

    만약 외부 매개변수명을 생략하면 내부 매개변수명이 외부 매개변수명으로 지정된다.

     

     

    func add(x: Int, y: Int) -> Int { // 1
    	return (x+y)
    }
    
    add(x:10, y:20)
    
    func add(first x: Int, second y: Int) -> Int { // 2
    	return (x+y)
    }
    
    add(first:10, second:20)
    
    func add(_ x: Int, _ y: Int) -> Int { // 3
    	return (x+y)
    }
    
    add(10, 20)
    
    func add(_ x: Int, with y: Int) -> Int { // 4
    	return (x+y)
    }
    
    add(10, with:20)

     

    1번 함수는 외부 매개변수명을 생략하여 내부 매개변수명이 외부 매개변수명이 되었다.

     

    2번 함수는 외부 매개변수명과 내부 매개변수명을 각각 정의해주었다.

     

    3번 함수는 '_'를 사용하여 외부 매개변수명을 생략했다. 다른 언어처럼 함수를 호출할 수 있지만 추천하는 방법은 아니다.

     

    4번 함수는 첫번째 외부 매개변수명만 생략하였다. Objective-C 언어의 호출 방식과 비슷하기 때문에 많이 사용하는 방식이다.

     

     

    익명 함수, 클로저(Closure)

     

    Swift에서 익명 함수는 클로저(Closure)라고 불린다.

     

    클로저는 이름이 없는 코드 블록으로, 일반적으로 다른 함수에 전달되거나 변수에 할당되어 사용된다.

     

     

    클로저의 기본 형태는 다음과 같다.

     

    { (parameters) -> ReturnType in
        // 클로저의 실행 코드
    }

     

    여기서 parameters 클로저가 받는 인자들을 나타내며, ReturnType 클로저가 반환하는 값의 타입을 나타낸다.

     

    in 키워드는 매개변수와 반환 타입 선언과 실행 코드를 분리하는 역할을 한다.

     

     

    let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
    
    // 오름차순으로 정렬
    let sortedNames = names.sorted(by: { (name1: String, name2: String) -> Bool in
        return name1 < name2
    })
    
    print(sortedNames) // 출력: ["Alex", "Barry", "Chris", "Daniella", "Ewa"]

     

    위 예시에서는 sorted(by:) 메서드에 클로저를 전달하여 배열을 정렬한다.

     

    클로저는 name1 name2라는 개의 문자열을 인자로 받아서 문자열을 비교하여 정렬 순서를 결정하게 된다.