[Swift] Problem Solving with Swift

Swift for 코딩테스트


본 포스팅은 Swift로 코딩 테스트를 볼 때 활용할 메서드, 팁 등을 정리해 놓은 포스트입니다.
제가 코딩 테스트를 볼 때 참고하려 작성했지만, 다른 분들에게도 도움이 되면 좋겠다는 마음에 블로그에 정리해서 올리게 되었습니다.

문자열 String

joined

let strArray = ["hello", "world", "!!"]
let str1 = strArray.joined() // "helloworld!!"
let str2 = strArray.joined(separator: " ") // "hello world !!"

Continue reading

[Swift] Access Control

Access Control


접근 제어

  • 코드의 세부 구현 내용을 숨기는 것이 가능하도록 만드는 개념
    • 객체지향 -> 은닉화가 가능해짐
    • 언어마다 약간씩의 차이가 있음

접근 제어가 필요한 이유

  • 원하는 코드를 감춰 놓을 수 있음
  • 코드의 영역을 분리시켜서, 효율적 관리 가능
  • 컴파일 시간이 줄어듦
    (컴파일러가 어느 범위에서만 해당 변수가 쓰이는지를 인지 가능)

접근 제어의 수준

키워드접근 수준에 대한 범위특징제한 정도
open다른 모듈에서 접근 가능
(상속/재정의 가능)
클래스의 가장 넓은 수준
(클래스에서만 사용 가능)
개방적
public다른 모듈에서 접근 가능
(상속 재정의 불가)
구조체/열거형의 가장 넓은 수준
(구조체는 상속 불가)
기본 타입의 설정 수준(Int, String 등)
internal같은 모듈에서만 접근 가능
(디폴트 설정)
따로 명시하지 않는 경우의 기본 수준
fileprivate같은 파일 내에서만 접근 가능 
private같은 scope 내에서만 접근 가능 폐쇄적
  • 모듈(module) : 프레임워크, 라이브러리, 앱 등 import해서 사용할 수 있는 외부의 코드
  • 모듈을 만들어서 배포하려면, public이상으로 선언해야 함

접근 제어를 가질 수 있는 요소

  • 타입 (클래스/구조체/열거형/스위프트 기본타입 등)
  • 변수 / 속성
  • 함수 / 메서드 (생성자, 서브스크립트 포함)
  • 프로토콜도 특정 영역으로 제한될 수 있음

Continue reading

[Swift] Result Type

Result Type


Result 타입

  • 에러가 발생하는 경우, 에러를 따로 외부로 던지는 것이 아니라
  • 리턴 타입 자체를 Result Type(2가지를 다 담을 수 있는)으로 구현해서
  • 함수 실행의 성공과 실패의 정보를 함께 담아서 리턴

Continue reading

[Swift] Generic

Generic


제네릭

  • 제네릭이 없다면 단순히 타입만 다르고 구현 내용이 같은 함수(클래스, 구조체, 열거형)마다 모든 경우를 다 정의해야하기 때문에 개발자의 할 일이 늘어남
  • 제네릭을 통해 타입(형식)에 관계없이 한번의 구현으로 모든 타입을 처리하여 유연함(유지보수 쉽고, 재사용성 높은) 함수 / 구조체 / 클래스 / 열거형 등을 일반화 가능한 코드로 작성 가능

Continue reading

[Swift] ARC

Automatic Reference Counting


메모리 관리

메모리
코드(프로그램)데이터스택
명령어 / 프로그램
앱(프로그램)의 모든 코드(Text)
전역 번수
타입(static/class) 변수
동적할당
(일반적으로 오랫동안 긴 시간 동안 저장)
함수 실행을 위한 임시적 공간
 공통으로 공유하기 위한 데이터
앱이 실행되는 동안 불변
크기가 크고, 관리할 필요가 있는 데이터
개발자가 잘 관리해야함
크기가 작고 빠르게 사용하기 위한 데이터
알아서 자동 관리됨
앱 실행시, 모든 코드가 일단 코드 영역에 올라감 그리고, 순차적으로 한줄 씩 실행됨전역변수 및 타입속성이 저장
(어디서도 접근 가능한 데이터)
참조타입
(클래스의 객체, 클로저)
함수의 실행 시 필요 데이터가 생성, 사용 완료 후 사라짐
(value 타입)
  • 힙 영역에 할당되는 데이터는 관리를 해야지만, 메모리에서 해제가 됨
  • 할당이 해제되지 않으면 메모리 누수(Memory Leak) 현상이 발생

다양한 언어에서의 메모리 관리 모델

  • java -> GC (Garbage Collector) : 런타임에 메모리 감시하는 기법
  • Objective-C -> MRC (Manual RC) / ARC (Automatic RC)
  • Swift -> ARC (Automatic RC)

Continue reading

[Swift] Method Dispatch

Method Dispatch


매서드 디스패치

  • 클래스, 프로토콜의 메서드가 실행되는 방식

Direct Dispatch (직접 / Static)

  • 컴파일 시점에 코드 자체에 함수의 메모리 주소 삽입 또는 함수의 명령 코드를 해당 위치에 코드를 심음 (in-line)
  • 가장 빠른 속도 (0.0 - 2.13ns)
  • 밸류 타입(구조체/열거형)에 사용
  • 상속 / 다형성의 장점을 누릴 수 없음

```swift struct MyStruct { func method1() { print(“Struct - Direct method1”) } // 90~99 메모리 주소에 저장 func method2() { print(“Struct - Direct method2”) } // 100~109 메모리 주소에 저장 }

Continue reading

[Swift] Closure

Closure


클로저

클로저와 함수는 기능은 완전히 동일한데, 형태만 다르다고 생각하면 됨
(파이썬의 lambda / C언어의 Block)

  • 함수 : 이름이 있는 코드 묶음 -> 다른 코드가 함수 이름으로 호출하기 위함
    func myFunction() -> Int {
      // function
      return ...
    }
    
  • 클로저 : 이름이 없는 코드 묶음 -> 굳이 이름이 없어도 호출할 수 있는 형태로 사용 가능
    {() -> Int in
      // closer
      return ...
    }
    // 보통 컴파일러의 타입 추론이 가능한 경우 리턴형에 대한 표기를 생략하여 많이 사용한다.
    

스위프트는 함수를 일급 객체로 취급 (함수는 타입의 형태)

  • 함수를 변수에 할당할 수 있음
  • 함수를 호출할 때, 함수를 파라미터로 전달할 수 있음
  • 함수에서 함수를 반환할 수 있음

Continue reading

[Swift] Protocol

Protocol


프로토콜

  • 특정 기능에 필요한 메소드, 프로퍼티 등을 정의만 해놓은 것
  • 클래스와 상속의 단점
    • 하나의 클래스만 상속 가능 (스위프트에서는 다중 상속 불가능)
    • 기본적인 상위 클래스의 메모리 구조를 따라갈 수 밖에 없음 (필요하지 않은 속성/메서드도 상속)
    • 클래스(레퍼런스 타입)에서만 가능
  • 스위프트는 프로토콜 지향 언어 (Protocol-Oriented Language)
    • 스위프트 표준 라이브러리를 보면 대부분 구조체로 기본 타입이 구현되어있음
    • 클래스와는 달리 상속이 불가능한 구조체로 다양한 공통 기능을 가질 수 있는 이유는 Protocol, Extension, Generic 때문

```swift class Bird { var isFemale = true func layEgg() { if isFemale { print(“새가 알을 낳는다.”) } } func fly() { print(“새가 하늘로 날아간다.”) } }

Continue reading

[Swift] Type Casting

Type Casting


타입 캐스팅

  • 인스턴스 사용시에 어떤 타입으로 사용할지(속성/메서드) 메모리구조에 대한 힌트를 변경하는 것
  • 메모리의 값을 수정하는 것이 아니라 단순히 해당 타입의 인스턴스인 것처럼 취급하려는 목적

is 연산자 : 인스턴스 타입을 검사
as 연산자 : 클래스 계층 상의 타입 변환

is 연산자 (type check operator)

Continue reading

[Swift] Initialization

Initialization


초기화

  • 초기화는 클래스, 구조체, 열거형의 인스턴스를 생성하는 과정
  • 저장속성에 대한 초기값을 설정하여 인스턴스를 사용가능한 상태로 만드는 것
    (열거형은 저장속성이 존재하지 않으므로, case중에 한가지를 선택 및 생성)
  • 생성자 메서드 실행의 목적은, 모든 저장속성 초기화를 통한 인스턴스 생성
    생성자 실행의 종료시점에는 모든 저장 속성에 값이 저장되어 있어야 함
  • 이니셜라이저의 실행이 완료되었을 때, 인스턴스의 모든 저장속성이 초기값을 가지는 것이 생성자의 역할
    • 생성자의 반대개념인 소멸자
      인스턴스가 해제되기 전에 해야할 기능을 정의하는 부분

```swift class Color { //let red, green, blue: Double // 동일한 타입일때, 한줄에 작성가능 let red: Double let green: Double let blue: Double

// 생성자도 오버로딩(Overloading)을 지원 (파리미터의 수, 아규먼트 레이블, 자료형으로 구분)
// 오버로딩을 통해 파라미터 활용의 자유도가 높아짐

init() {  // "init()" -> 기본 생성자. 저장 속성의 기본값을 설정하면 "자동" 구현이 제공됨
    red = 0.0
    green = 0.0
    blue = 0.0
}

Continue reading

[Swift] Property & Method

Property & Method


속성

  • 구조체 / 클래스의 변수
    • 저장 속성 (stored)
    • 지연 저장 속성 (lazy stored)
    • 계산 속성 (computed)
    • 타입 속성 (type)
    • 속성 감시자 (property observer)

Continue reading

[Swift] Function

Swift Function


Function 함수

  1. 함수 정의
  2. 함수 호출(실행)
    • 반복되는 동작을 단순화해서 재사용 가능
    • 코드를 논리적 단위로 구분 가능
    • 코드 길이가 긴 것을 단순화해서 사용 가능
    • 미리 함수를 잘 만들어 놓으면, 개발자는 사용만 하면 됨 (내부적 내용을 몰라도 사용 가능)

함수의 기본 포맷

```swift func doSomething(name: String /파라미터/) -> String { // 함수 정의 var comment = “(name)! do something!” return comment }

Continue reading

[Swift] Enumeration

Swift Enumeration


Enumeration 열거형

연관된 상수(케이스)들을 하나의 이름으로 묶은 자료형 (클래스)
케이스가 선택가능한 (한정된) 가지 수로 정해져 있을 때 정의

Continue reading

[Swift] Collection

Swift Collection


컬렉션

데이터를 효율적으로 관리하기 위한 자료형(타입)

  • Array (배열)
    • 데이터를 순서대로 저장하는 컬렉션
    • 앱, 웹에서 데이터를 저장, 표시하는 형태
  • Dictionary (딕셔너리)
    • 데이터를 키와 값으로 하나의 쌍으로 만들어 관리하는 순서가 없는 컬렉션
    • 데이터가 서버에 저장되어 있는 데이터를 받아오는 형태
  • Set (집합)
    • 수학에서 집합과 비슷한 연산을 제공하는 순서가 없는 컬렉션

스위프트 함수 이름 규칙

  • Mutating : 컬렉션을 직접적으로 변경할 때는 동사 원형으로 사용
    • (sort() , reverse() , shuffle())
  • Non-Mutating : 컬렉션을 변경하지 않고, 리턴형으로 다른 컬렉션을 반환할 때는 분사 형태(-ing, -ed)로 사용
    • (sorted() ,reversed() , shuffled())

Continue reading

[Swift] Optional

Swift Optional Type


옵셔널

  • 스위프트의 특징 중 하나인 안정성을 문법으로 담보하는 기능
  • 타입을 선언하고 값이 없으면 에러가 나는데 옵셔널 타입은 값을 넣지 않아도 nil이라는 임시 값이 들어가기 때문에 자주 활용

옵셔널 타입

let num1: Int? = 2  // 간편 표기
let num2: Optional<Int> = 2  // 정식  문법

옵셔널은 nil이거나 nil이 아닌 값만 가질 수 있다.

  • nil : 값이 할당되지 않아 오류가 발생했을 때
  • nil 아닌 값 : 오류가 발생하지 않았을 때 반환하려는 값이 옵셔널로 래핑된 형태의 값

Int (정수형 타입) / Int? (옵셔널 정수형 타입) / Double (실수형) / Double? (옵셔널 실수형 타입)

-> 각각 서로 다른 타입이다.

nil은 실제로 값이 없는 것은 아니고 값이 없음을 표현하는 키워드
실제로 값이 없는 다른 언어의 null과는 실제로 값이 없는 것이 아니라서 다른 것

Continue reading

[Swift] Swift Basic

Swift 기본 문법 정리


이번 포스팅은 인프런의 Ellen Swift Class를 보고 스위프트의 기본적인 문법 부분을 정리 기록하기 위해 한 포스팅이다.
나를 포함해서 Swift 이외의 다른 언어로 알고리즘 문제를 푼 경험이 있다면 그냥 모든 언어에 존재하는 문법이지만 스위프트에서는 이렇게 표현했구나 정도로만 가볍게 보고 넘어가도 될 내용이다.

문자열 보간법

Continue reading

Pagination


© 2021. by hminkim