Swift for 코딩테스트
본 포스팅은 Swift로 코딩 테스트를 볼 때 활용할 메서드, 팁 등을 정리해 놓은 포스트입니다.
제가 코딩 테스트를 볼 때 참고하려 작성했지만, 다른 분들에게도 도움이 되면 좋겠다는 마음에 블로그에 정리해서 올리게 되었습니다.
문자열 String
joined
let strArray = ["hello", "world", "!!"]
let str1 = strArray.joined() // "helloworld!!"
let str2 = strArray.joined(separator: " ") // "hello world !!"
Continue reading
Grand Central Dispatch
본 포스팅에 대한 내용은 이전 Concurrency Programing 포스팅 내용의 연장된 심화 내용 입니다.
Continue reading
Advanced Operators
정수 타입 / 숫자 리터럴
Continue reading
Access Control
접근 제어
- 코드의 세부 구현 내용을 숨기는 것이 가능하도록 만드는 개념
- 객체지향 -> 은닉화가 가능해짐
- 언어마다 약간씩의 차이가 있음
접근 제어가 필요한 이유
- 원하는 코드를 감춰 놓을 수 있음
- 코드의 영역을 분리시켜서, 효율적 관리 가능
- 컴파일 시간이 줄어듦
(컴파일러가 어느 범위에서만 해당 변수가 쓰이는지를 인지 가능)
접근 제어의 수준
키워드 | 접근 수준에 대한 범위 | 특징 | 제한 정도 |
---|
open | 다른 모듈에서 접근 가능 (상속/재정의 가능) | 클래스의 가장 넓은 수준 (클래스에서만 사용 가능) | 개방적 |
public | 다른 모듈에서 접근 가능 (상속 재정의 불가) | 구조체/열거형의 가장 넓은 수준 (구조체는 상속 불가) 기본 타입의 설정 수준(Int, String 등) | ↑ |
internal | 같은 모듈에서만 접근 가능 (디폴트 설정) | 따로 명시하지 않는 경우의 기본 수준 | ↕ |
fileprivate | 같은 파일 내에서만 접근 가능 | | ↓ |
private | 같은 scope 내에서만 접근 가능 | | 폐쇄적 |
- 모듈(module) : 프레임워크, 라이브러리, 앱 등 import해서 사용할 수 있는 외부의 코드
- 모듈을 만들어서 배포하려면,
public
이상으로 선언해야 함
접근 제어를 가질 수 있는 요소
- 타입 (클래스/구조체/열거형/스위프트 기본타입 등)
- 변수 / 속성
- 함수 / 메서드 (생성자, 서브스크립트 포함)
- 프로토콜도 특정 영역으로 제한될 수 있음
Continue reading
Result Type
Result 타입
- 에러가 발생하는 경우, 에러를 따로 외부로 던지는 것이 아니라
- 리턴 타입 자체를 Result Type(2가지를 다 담을 수 있는)으로 구현해서
- 함수 실행의 성공과 실패의 정보를 함께 담아서 리턴
Continue reading
Generic
제네릭
- 제네릭이 없다면 단순히 타입만 다르고 구현 내용이 같은 함수(클래스, 구조체, 열거형)마다 모든 경우를 다 정의해야하기 때문에 개발자의 할 일이 늘어남
- 제네릭을 통해 타입(형식)에 관계없이 한번의 구현으로 모든 타입을 처리하여 유연함(유지보수 쉽고, 재사용성 높은) 함수 / 구조체 / 클래스 / 열거형 등을 일반화 가능한 코드로 작성 가능
Continue reading
Concurrency Programing in iOS
동시성 프로그래밍
Continue reading
Higher-order Function
고차 함수
Continue reading
Networking in iOS
iOS에서 네트워킹
Continue reading
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
Error Handling
에러 처리
Continue reading
Nested Type
중첩 타입
Continue reading
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
Closure
클로저
클로저와 함수는 기능은 완전히 동일한데, 형태만 다르다고 생각하면 됨
(파이썬의 lambda / C언어의 Block)
- 함수 : 이름이 있는 코드 묶음 -> 다른 코드가 함수 이름으로 호출하기 위함
func myFunction() -> Int {
// function
return ...
}
- 클로저 : 이름이 없는 코드 묶음 -> 굳이 이름이 없어도 호출할 수 있는 형태로 사용 가능
{() -> Int in
// closer
return ...
}
// 보통 컴파일러의 타입 추론이 가능한 경우 리턴형에 대한 표기를 생략하여 많이 사용한다.
스위프트는 함수를 일급 객체로 취급 (함수는 타입의 형태)
- 함수를 변수에 할당할 수 있음
- 함수를 호출할 때, 함수를 파라미터로 전달할 수 있음
- 함수에서 함수를 반환할 수 있음
Continue reading
self vs Self
self 키워드
Continue reading
Protocol
프로토콜
- 특정 기능에 필요한 메소드, 프로퍼티 등을 정의만 해놓은 것
- 클래스와 상속의 단점
- 하나의 클래스만 상속 가능 (스위프트에서는 다중 상속 불가능)
- 기본적인 상위 클래스의 메모리 구조를 따라갈 수 밖에 없음 (필요하지 않은 속성/메서드도 상속)
- 클래스(레퍼런스 타입)에서만 가능
- 스위프트는 프로토콜 지향 언어 (Protocol-Oriented Language)
- 스위프트 표준 라이브러리를 보면 대부분 구조체로 기본 타입이 구현되어있음
- 클래스와는 달리 상속이 불가능한 구조체로 다양한 공통 기능을 가질 수 있는 이유는
Protocol
, Extension
, Generic
때문
```swift class Bird { var isFemale = true func layEgg() { if isFemale { print(“새가 알을 낳는다.”) } } func fly() { print(“새가 하늘로 날아간다.”) } }
Continue reading
Date
Date
Continue reading
Extension
확장
Continue reading
Type Casting
타입 캐스팅
- 인스턴스 사용시에 어떤 타입으로 사용할지(속성/메서드) 메모리구조에 대한 힌트를 변경하는 것
- 메모리의 값을 수정하는 것이 아니라 단순히 해당 타입의 인스턴스인 것처럼 취급하려는 목적
is 연산자 : 인스턴스 타입을 검사
as 연산자 : 클래스 계층 상의 타입 변환
is 연산자 (type check operator)
Continue reading
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
Inheritance
Continue reading
Property & Method
속성
- 구조체 / 클래스의 변수
- 저장 속성 (stored)
- 지연 저장 속성 (lazy stored)
- 계산 속성 (computed)
- 타입 속성 (type)
- 속성 감시자 (property observer)
Continue reading
Swift Class & Struct
Class & Struct 클래스와 구조체
클래스와 구조체의 개념이 나오고부터 프로그래밍의 패러다임이 바뀌었음
Continue reading
Swift Function
Function 함수
- 함수 정의
- 함수 호출(실행)
- 반복되는 동작을 단순화해서 재사용 가능
- 코드를 논리적 단위로 구분 가능
- 코드 길이가 긴 것을 단순화해서 사용 가능
- 미리 함수를 잘 만들어 놓으면, 개발자는 사용만 하면 됨 (내부적 내용을 몰라도 사용 가능)
함수의 기본 포맷
```swift func doSomething(name: String /파라미터/) -> String { // 함수 정의 var comment = “(name)! do something!” return comment }
Continue reading
Swift Enumeration
Enumeration 열거형
연관된 상수(케이스)들을 하나의 이름으로 묶은 자료형 (클래스)
케이스가 선택가능한 (한정된) 가지 수로 정해져 있을 때 정의
Continue reading
Swift Collection
컬렉션
데이터를 효율적으로 관리하기 위한 자료형(타입)
- Array (배열)
- 데이터를 순서대로 저장하는 컬렉션
- 앱, 웹에서 데이터를 저장, 표시하는 형태
- Dictionary (딕셔너리)
- 데이터를 키와 값으로 하나의 쌍으로 만들어 관리하는 순서가 없는 컬렉션
- 데이터가 서버에 저장되어 있는 데이터를 받아오는 형태
- Set (집합)
- 수학에서 집합과 비슷한 연산을 제공하는 순서가 없는 컬렉션
스위프트 함수 이름 규칙
- Mutating : 컬렉션을 직접적으로 변경할 때는 동사 원형으로 사용
- (
sort()
, reverse()
, shuffle()
)
- Non-Mutating : 컬렉션을 변경하지 않고, 리턴형으로 다른 컬렉션을 반환할 때는 분사 형태(-ing, -ed)로 사용
- (
sorted()
,reversed()
, shuffled()
)
Continue reading
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 기본 문법 정리
이번 포스팅은 인프런의 Ellen Swift Class를 보고 스위프트의 기본적인 문법 부분을 정리 기록하기 위해 한 포스팅이다.
나를 포함해서 Swift 이외의 다른 언어로 알고리즘 문제를 푼 경험이 있다면 그냥 모든 언어에 존재하는 문법이지만 스위프트에서는 이렇게 표현했구나 정도로만 가볍게 보고 넘어가도 될 내용이다.
문자열 보간법
Continue reading
Pagination