본문 바로가기
안드로이드, IOS

[IOS] 기초 내용 정리 - Swift 문법의 개략적인 이해

by dwoi 2023. 3. 30.

본 글은 iOS라는 운영체제에 대해서 기본적으로 학습하고

Swift 문법에 대해 개략적으로 이해한 내용을 정리하는 글임을 밝힘.

본문은 전체적인 흐름을 이해하는 방향으로 작성하고

생소한 용어들은 말미에 정리해둠.

 

목차

     


    iOS(운영체제)


    1. iOS란?

    사용자 이벤트 발생과 처리과정

    1.1. iOS 운영체제

    • 아이폰, 아이패드, 아이팟에 설치되는 모바일 운영체제

    1.2. iOS 프로그래밍이란

    아이폰 : Swift, Objective-C

    1.3. Xcode

    Apple의 macOS, iOS, watchOS 및 tvOS용 소프트웨어 개발을 위한 IDE

    Mac이 없으면?

    Online Swift Playground

     

    Online Swift Playground

    Self hosted and embeddable Swift Playground solution with a third-party module support baked in.

    swiftplayground.run


     

    2. Swift 기본 문법 이해

    변수/상수, 함수, 클래스와 같은 다른 언어에서 쓰이는 기본적인 개념은 동일

    ※ var : Swift의 변수 선언

    ※ let : Swift의 상수 선언

     

    2.1. 조건문

    다른 언어와 마찬가지로 if문Switch문이 사용되는 것을 확인.

    if문 예시코드)

    if 조건 {
      do something
    } else {
      do something
    }

    Switch문 예시코드)

    switch 평가대상 {
    case 케이스1:
    case 케이스2:
    default:
    }

     

    ※ if문과 Switch문의 활용

    Switch문은 해당하는 인자값에 대해 맞는 명령으로 실행

    즉 갯수가 한정된, 정해진 타입들에 대해서 실행할 때 활용

    if문은 그외

     

    2.2. 반복문

    마찬가지로 for문과 while문이 사용됨

    배열과 상성이 좋은 for문의 활용도가 더 높다는 것을 인지

    for문 예시 1) 

    let name : [String] = ["song", "kim", "park", "chang" ]
    
    for stat in name {
        print("name is \(stat)")
    }

    while 문 예시 1)

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

     

    2.3. 컬렉션 타입(Collection Type)

    2.3.1. 배열(Array)

    var evenNumberArray = [2, 4, 6, 8, 10]

    전통적인 프로그래밍 언어의 배열과 Swift 배열의 차이점

    • 연속적인 메모리에 저장하지 않음
    • 배열 중간의 값 추가 및 삭제 수정 용이

    배열에 접근하기 위해 여러 함수들도 마찬가지로 활용 가능

    • .append()
    • .insert()
    • .remove()
    • 등등

     

    2.3.2. 딕셔너리(Dictionary)

    var toDoDic = [1: "청소하기", 8: "빨래하기", 15: "장 보러 가기"]

    key와 value값이 존재하는 배열 

     

    2.3.3. Array, Dictionary 비교

    배열은 중간에 삽입, 삭제에 의해 해당 인덱스의 값이 변경될 수 있음
    따라서 이 경우에는 딕셔너리를 사용함


    반면 딕셔너리는 저장한 항목의 순서 보장이 안 됨.
    따라서 이 경우에는 배열을 사용함

    ※ Set 타입
    우리가 어렸을 때 배웠던 집합의 개념
    같은 값 반복 삽입 안 되고, 순서 무시 저장됨

     

    2.4. 함수(Function)

    Swift 함수의 기본 형태

    func setName(name:String) -> String{
        return name
       }
    1. func로 함수를 선언
    2. setName이라는 함수명을 지정
    3. ()안에 매개변수와 그에 해당하는 자료형 까지 지정
      • Argument label : 함수를 호출할때 매개변수의 역할을 좀 더 명확하게 식별해주기 위해서 사용할 수도 있음.
      • 생략 가능
    4. return으로 반환

    다른 언어와 형태 자체는 유사하다는 것을 인지하되 Argument label 이 다른 언어에서 없는 요소니 주의!

     

    ◆ 다른 언어와 유사하게 함수의 형태도 아래 4가지 형태로 존재한다는 것을 인지

    1. 입력 X 반환 X
    2. 입력 O 반환 X
    3. 입력 X 반환 O
    4. 입력 O 반환 O

     

    2.5. 클래스(Class)

    클래스 : 변수/상수, 함수의 묶음

    클래스는 일종의 설계도임으로 이를 생성자인스턴스로 만들어서 활용해야한다는 것을 절대 까먹지 말자

    let circle = Circle()

    → 이렇게 해야 메모리에 올라가야 인스턴스가 생성된다.

     

    생성자 : init() 함수

    2.5.1. 클래스의 특징

    ⓐ. 상속(Inheritance)

    쉽게 말해 부모 클래스(상위 클래스)와 자식 클래스(하위 클래스)가 있으며, 자식 클래스는 부모 클래스를 선택해서,          그 부모의 멤버를 상속받아 그대로 쓸 수 있게 하는 것

    ⓑ. 재정의(override)

    부모 클래스로부터 상속받은 특정 메서드를 자식 클래스에서 재정의하는 작업

    2.6. 열거형(Enumeration)

    • 비슷한 값들을 그룹으로 묶어서 정의를 하고 미리 정의한 값만을 한정해서 사용하도록 할 때 유용
    enum AppleOS {
    	case iOS
    	case macOS
    	case tvOS
    	case watchOS
    }

    Swtich문과의 호환성 좋음

     

    2.7. 프레임워크

    비슷한 종류의 클래스 묶음

    클래스뿐만 아니라 이미지 같은 리소스, 라이브러리, 문서 등 다양한 파일들도 포함

     


     

    3. Swift 심화 문법 이해

    3.1. 옵셔널(Optional)

    3.1.1. 등장 배경 및 개념

    • 크래시(Crash) 현상


    NullPointerException
    Null: 값이 존재하지 않는다


    인스턴스(객체)가 제대로 생성이 안 된 상태에서
    인스턴스(객체)에 접근할 경우 메모리에 존재하지 않아 발생하는 에러

    Objective-C와 Swift에서는 Null 대신 nil 사용

     

    • 옵셔널의 개념
      •  값이 있을 수도 있고 없을 수도 있는 것
      • ?만 붙이면 됨.
    var nickname:String? = nil

    String?

    → Optional<String>

    ※ Swift 에서는 자료형이 같은 타입만 연산 가능

     

     

    3.1.2. 언래핑(Unwrapping)

    • 옵셔널로 감싸진 옵셔널이 아닌 값을 추출하는 작업
    1. 강제 언래핑(Forced Unwrapping)
      • 옵셔널 변수인 !를 붙이면 됨.
      • 편하지만 nil이면 앱이 죽어버린다. 즉 nil이 아니라는 확신이 있어야만 한다.
    2. 옵셔닐 바인딩(Optional Binding)
      • 조건문을 쓰는 것처럼 보임
        • if let(var) 구문 이용
          • 정상적인 값이 있으면 if 문에 해당하는 코드 실행
          • nil이면 else문에 해당하는 코드 실행
        • gurad let(var) 구문 사용
          • guard let nick = nickname else {return}
      • 스코프에 따라 코드 가독성을 높이기 위해 작성.
    3. nil 병합 연산자 ?? 이용
    var nicknmae: String? = "hi"
    
    print(nickname ?? "nil이면 이 문구가 출력됨.")

    3.1.3. 옵셔널 체이닝

    옵셔널 변수에 ?를 붙여서 사용

    → 사용하면 확인해야 할 것들을 한 번에 연결해서 쓸 수 있다.

    class Person {
    var name = “dwoi”
    }
    class Car {
    var owner: Person?
    }
    let myCar = Car()
    myCar.owner = Person()
    print(myCar.owner?.name)

    3.2. 클로저(Closure)

    3.2.1. 개념 및 기본 형태

    함수 키워드(func)와 함수명이 빠진 코드의 블록

    람다(Lambda)
    익명 함수(Anonymous function)

    이 코드의 블록을 전달 인자로 보낼 수도 있고
    상수/변수 등으로 저장하거나 전달할 수도 있고
    함수의 리턴값이 될 수도 있음

    ex. 클로저의 기본 형태

    { (매개변수목록) -> 리턴타입 in
    실행코드
    }

    in을 통해서 구분!

    {(num1: Int, num2: Int) -> Int in
    	return num1 + num2
    }

    1. 매개변수 타입과 리턴타입, 소괄호를 생략 가능!

     

    2. in, return 키워드 생략하고 축약된 전달 인자 이름을 사용할 수 있음

    {$0+$1}

     

    3.2.2. 그럼 왜 쓰냐?

    ①. 함수명이 선언되지 않아서 메모리를 아낄 수 있음

    ②. 함수를 값으로 다룰 수 있다는 점에서 매우 강력함.

    • 예를 들어, 함수를 인자로 받아 실행하는 고차 함수를 만들 수 있어 이를 통해 함수의 동작을 다양하게 조합할 수 있음
    • 이를 통해 코드의 가독성과 유지보수성의 향상

     

    3.2.3. 다양한 형태 및 용도

    ⓐ. 후행 클로저(Tailing Closure)

    함수 호출 시 마지막 파라미터가 클로저일 경우 간결한 형태로 변형 가능

     


     

    마무리

    Swift 문법에 대해 인지를 하고 어떻게 의사코드를 짜야할 지에 대해 궁리하는 것을 목표로 공부

    추후에 이 점이 필요해졌을 경우 추가로 공부하기 위한 기반을 쌓는 작업

     

    옵셔널과 클로저 자체의 용도는 알겠는데 어떻게 사용하는지에 대해 이해는 잘 안 가는 점.

     

     

    용어 정리

    1. iOS

    Queue : 자료구조 중 하나

    FIFO(First In First Out) 선입선출 구조

     

    프로세스 : 프로그램을 실행해서 운영체제에 의해 메모리에 올라간 상태 운영체제로부터 CPU시간,                                                       메모리 등의 시스템 자원을 할당 받는 단위
                         독립된 메모리 공간

    스레드: 프로세스 내에서 실행되는 더 작은 실행 단위(흐름)
                     CPU의 최소 작업 단위
                     메인 스레드, 백그라운드 스레드

    메인 스레드: 프로세스가 기본적으로 가지고 시작하는 스레드
                              UI 화면 갱신, 터치, 제스처 등의 UI 관련 이벤트 등 처리
                              항상 하나만 존재

    백그라운드 스레드: 필요에 따라 추가로 생성 가능
                                         UI와 상관없이 시간이 오래 걸리는 작업 처리

    동기 처리 방식(Synchronous) : 작업을 순서대로 하나씩 처리

    비동기 처리 방식(Asynchronous) : 하나의 작업이 끝나는 것을 기다리지 않고 순서 상관없이 처리

    싱글 스레딩과 멀티스레딩

    출처 : https://velog.io/@gil0127/

    ※ 동기화(Synchronization)

    멀티 스레딩은 기본적으로 비동기 처리 방식

    공유 자원을 동시에 접근해서 변경 가능하기에 예상치 못한 결과 가능

    공유 자원을 사용하기 위해 다투거나 한 없이 기다리는 등의 문제

    → 크리티컬 섹션(Critical Section), 락(Lock) 등의 방법으로 동기화

    →  디버깅이 힘든 경우도 있어 성능보다 안정성을 중요시 할 땐 싱글스레드


    2. Swift 기초 문법

     

    댓글