[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