Swift) Swift의 특징

Havi·2020년 11월 11일
0

Swift기초

목록 보기
1/19
post-custom-banner

Swift의 특징

  • python이나 javaScript같이 dynamic binding을 채용하지 않고 static binding을 채용한다.

정적 바인딩 : 컴파일 타임에 호출될 함수가 결정되는 것
동적 바인딩 : 런타임에 호출될 함수가 결정되는 것

  • 데이터 타입에 대한 구분이 엄격해서 컴파일 단계에서 데이터 타입이 정의되어 있어야한다. 따라서 안정성이 높다.

  • 네임스페이스를 사용하여 필요한 객체들을 참조한다. 따라서 Obj-C와 달리 헤더파일을 import해줄 필요가 없다.

Swift의 주요 기능

Swift또한 다른 언어에서 채택된 개념들을 새로운 이름으로 조합한 언어이다.

  • Dictionary(Hash Table)
var airports = [String:String?]()
airports["ICN"] = "Inchon"
  • Data type 추론 - 함수형 프로그래밍 언어
    변수를 특정 데이터 형식으로 강제할 경우, 컴파일러가 비호환성을 발견해 버그를 미리 잡을 수 있다.
    하지만 이는 귀찮기 때문에 컴파일러가 데이터로부터 형식을 추론해 지정할 수 있게되었다.

  • Data 구조체 타입 선언
    데이터 구조체에 어떤 타입의 데이터가 저장될 지 미리 컴파일러에게 알려준다.

var dict = Dictionary<Int, String>()
  • 문자열 템플릿
    역슬래쉬 안에 변수나 식을 넣어 깔끔한 탬플릿을 제공한다
let apple = 3
let appleSum = "I have \(apple) apples"
  • 세미콜론
    세미콜론을 쓰지 않아도 행의 구문이 끝났음을 구분 가능

  • Protocol
    정교한 객체지향 클래스를 만들기 위해서는 인터페이스를 먼저 설계해야 한다.

protocol ExampleProtocol{
	var simple: String { get }
    mutating func adjust()
}
  • Tuple
    N개의 변수를 명시적으로 구분하기 위해 제공한다.
func getPrices() -> (Int, Int) {
	return (3,2)
}
  • Auto Reference Counting
    초반에는 스위프트도 가비지 컬렉터가 도입될 뻔 했다.
    하지만 GC의 경우 프로그램이 잠깐 멈추는 현상때문에 프로세스가 원활한 진행이 안되므로 ARC를 사용하게되었다.

  • 부호 있는/없는 정수
    바이트 레벨에서의 동작을 위해 부호없는 정수를 제공한다.
    (자바는 없고 코틀린에는 존재함)

let pink: UInt32 = 0xCC6699
  • Closure
    소량의 코드를 묶어서 함수처럼 전달하는 클로저를 제공한다.
    이 뿐 아니라 함수를 1급 객체(클로저를 변수, 반환타입 등으로 취급할 수 있다.)로 간주, 인자값으로 함수 자체를 전달 가능하다.
let numbers = [Int]()

numbers.map{ 3 * $0 }

/*
 * 1급 객체 함수 -> 클로저 활용
 */
// 변수 저장
let add = { (num1: Int, num2: Int) -> Int in
    return num1 + num2
}

// 함수 인자로 사용
func addScore(math: Int, eng: Int, add: (Int, Int)->Int) {
    if add(math, eng) < 100 {
        print("보충 수업")
    } else {
        print("패스")
    }
}
  • 멀티 라인 쿼우팅
    여러 줄의 문자열을 간편하게 입력 가능
let query = """
SELECT member_id,member_name
FROM member
WHERE login_id = ?
"""

구조적 특징

  • 빠름
    고성능 앱을 만들기 위해 GCC 대신 LLVM컴파일러를 사용해 성능을 극대화 한다.

  • 설계의 안정성
    변수나 상수를 반드시 선언 후 사용
    타입을 정의함으로써 데이터 입력에 대한 안전성을 높임
    배열에서 오버플로우를 대비하고, 승인되지 않는값을 막는 Array bounds check기능 추가
    포인터에 직접적인 접근시도를 차단하고, 클래스를 통해 간접적으로 레퍼런스 참조
    ARC를 통한 메모리 누수현상 대비

  • Modern
    파이썬 언어에 기반을 둔 읽고 쓰기 쉬운 문법 채택
    Optional, Generics, Closure, Tuple같은 현대 프로그래밍 언어의 특성 포함

  • Interactive
    플레이그라운드 제공 - 코드 작성, 메모리스택등 확인

  • Complete Platform
    코코아 프레임워크나 코코아 터치 프레임워크의 모든 API를 스위프트로 호출가능
    Obj-C로 작성되어있던 핵심 프레임워크를 모두 스위프트로 재작성했기 때문에 Obj-C코드에 의존하지 않고 프로그램 작성 가능

  • Unifided
    Obj-C언어를 완전히 대체 가능
    하나의 프로젝트에 Obj-C와 Swift를 동시에 사용할 수 있음

Obj-C vs Swift

  • 파일 통합
    .h와 .m으로 구분되던 헤더파일과 소스파일이 .swift로 통합된다.

  • 클래스의 정의와 구현
    Obj-C에서는 아무것도 상속받지 않더라도 NSObject를 상속받아야하지만 Swift는 interface의 정의 없이 바로 클래스 구현이 가능하다.

  • 상속
    다중 상속을 지원하지 않으며 프로토콜을 정의할 수 있다.
    Extenstion또한 제공되는데 Obj-C에서는 클래스에만 확장 가능했지만,
    Swift에서는 클래스, 구조체, 프로토콜등 대부분의 객체에서 사용가능

  • 범용 타입
    모든 데이터 타입을 저장할 수 있는 범용 타입 객체가 필요하다.
    obj-C에서 id 는 swift에서 Any이다.
    AnyObject는 클래스에 한해 사용가능하고, Any는 구조체, 클래스, 열거형, 함수등 모든 타입의 값 저장 가능

  • 메소드 호출
    Obj-C에서는 스몰토크 객체지향 방식 []로 호출했지만 Swift에서는 . Operation을 사용한다.

  • nil의 의미
    Obj-C에서 nil은 객체의 빈 참조에 사용되고 NULL(예외처리가 필요함)은 포인터 자료형의 빈 참조에 사용되었지만, Swift에서 nil은 값이 존재하지 않음을 의미하고 NULL은 정의되어 있지 않다.

  • 포인터 사용
    Obj-C에서는 객체에 대한 인스턴스 변수 정의 시 항상 포인터를 사용하는 레퍼런스 참조를 기본으로 사용했지만,
    Swift는 포인터 개념을 제거하여 직접 레퍼런스 참조를 하지않아도 되는 대신 객체의 종류에 따라 직접 레퍼런스를 참조할 것인지 객체를 복사할 지 결정

  • 객체지향 타입
    객체 타입은 모두 인스턴스를 만들 수 있으며 인스턴스와 관련된 변수, 상수를 Property로 선언하여 사용 가능

class SampleClass {
}

struct SampleStruct {
}

enum SampleEnum {
}
  • 익명함수
    람다 함수는 함수 기반으로 정의되는 코드 내에서 한번만 사용하면 되는 코드마저 함수로 선언해서 사용해야하는 번거로움을 피하게 해준다.
    Obj-C : Block -> Swift : Closure

  • 오류처리
    Try ~ Catch구문을 통해 오류로 프로그램의 중단을 막아주고 효율적으로 오류에 대응이 가능하다.

profile
iOS Developer
post-custom-banner

0개의 댓글