Skip to content

Latest commit

 

History

History
165 lines (97 loc) · 10.5 KB

About Swift.md

File metadata and controls

165 lines (97 loc) · 10.5 KB

스위프트의 언어적 특성

  • 스위프트는 Python이나 JavaScript같이 dynamic binding(동적 바인딩)을 채용하지 않고 **static binding(정적 바인딩)**을 채용한다.

    • 정적 바인딩 : 컴파일 타임에 호출될 함수가 결정되는 것
    • 동적 바인딩 : 런타임에 호출될 함수가 결정되는 것
  • 애플이 최초에 스위프트를 발표했을 때 스위프트 언어의 특징을 Safe, Modern, Powerful이라고 발표했다.

    그러나 오픈소스로 전환되면서 특징을 Safe, Fast, Expressive 로 변경하여 발표했다.

    항목별로 알아보자.


1. Safe (안전성)

  • 스위프트는 안전한 프로그래밍을 지향한다. 소프트웨어가 배포되기 전, 즉 프로그래밍하는 중에 프로그래머가 저지를 수 있는 실수를 엄격한 문법을 적용해 미연에 방지하고자 노력한다. 때론 너무 강제적이라고 느껴질 수 있지만 문법적 제재는 실수를 줄이는 데 도움이 된다. 옵셔널이라는 기능을 비롯하여 guard구문, 오류처리, 강력한 타입 통제 등을 통해 안전한 프로그래밍을 구현한다.

2. Fast (신속성)

  • 스위프트는 C언어를 기반으로 한 C, C++, Objective-C와 같은 프로그래밍 언어를 대체하려는 목적으로 만들어졌다. 아직은 미흡한 부분도 있지만 스위프트는 C언어 수준과 동등한 성능을 일정한 수준으로 유지하는 데 초점을 맞춰 개발되었다. 실행 속도의 최적화뿐만 아니라 컴파일러를 지속적으로 개량해 더 빠른 컴파일 성능을 구현해 나가고 있다. 또한, 스위프트는 컴파일 언어이다.

3. Expressive (더 나은 표현성)

  • 컴퓨터 과학 분야의 발전과 함께 성장한 수많은 프로그래밍 언어 각각의 문법은 다양한 장단점이 있다. 스위프트는 이런 장단점을 참고해 좀 더 사용하기 편하고 보기 좋은 문법을 구현하려 노력했다. 덕분에 개발자들이 원하던 현대적이고 세련된 문법을 구사할 수 있었다. 지금의 스위프트가 끝이 아닌 계속된 업데이트를 통해 더욱 보기 좋고 쓰기 좋은 언어로 발전해 나갈 것이다.

애플이 발표한 세 가지 특징 외에도 스위프트는 많은 특징이 있다.



스위프트는 다ㅇ 패러다임 프로그래밍 언어이다.

특히 객체지향 프로그래밍 패러다임을 기반으로 한 함수형 프로그래밍 패러다임프로토콜 지향 프로그래밍 패러다임을 지향한다.

1. 객체 지향 프로그래밍 패러다임

객체지향 프로그래밍 패러다임은 객체지향 프로그래밍(Object-Oriented Programming, OOP)이라고도 불린다.

객제지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 기존의 명령형 프로그래밍 패러다임의 시각에서 벗어나 여러개의 독립된 단위인 **객체의 모임**으로 파악하고자 하는 시각이다. 각각의 객체는 서로 메시지를 주고 받고 데이터를 처리할 수 있다.

객체지향 프로그래밍은 프로그램을 유연하고 쉽게 변경 할 수 있도록 작성할 수 있다.

또한 유지보수를 간편하게 할 수 있고 직관적으로 코드를 분석할 수 있어 대규모 소프트웨어 개발에 많이 사용한다.

소프트웨어의 질을 향상하려면 강한 응집력약한 결합력을 지향해야 한다.

객체지향 프로그래밍은 클래스에 하나의 문제 해결을 위한 데이터와 메서드를 모아놓은 방식으로 응집력을 강화한다.

또, 각 클래스는 독립적이 되도록 디자인결합력을 약화한다.

객체지향 프로그래밍의 주요 특징으로는 자료 추상화, 상속, 다형성, 동적 바인딩 등이 있다.

클래스와 객체

  • 클래스(Class): 같은 종류(또는 문제 해결을 위한)의 집단에 속하는 속성과 행위를 정의한 것.
    • 객체지향 프로그램의 기본 사용자 정의 데이터 타입이라고 할 수 있음.
    • 클래스는 다른 클래스 또는 외부 요소와 독립적으로 디자인 되어야 함.
  • 객체(Object): 클래스의 인스턴스(실제로 메모리에 할당되어 동작하는 모양을 갖춘 것. instance)이다.
    • 객체는 자신 고유의 속성이 있으며 클래스에서 정의한 행위를 할 수 있다.
    • 스위프트에서는 ‘객체’라는 용어보다 ‘클래스의 인스턴스’라는 표현을 사용한다.
// 스위프트에서 객체지향 프로그래밍 페러다임의 사용

Class SomeClass {
		var someProperty: Any = 1
		func someMethod() {
				// some task ...
		}
}

let myInstance: SomeClass = SomeClass()
// SomeClass라는 이름의 클래스의 이니셜라이저를 호출하여
// myInstance라는 이름의 상수로 할당한다.
// 클래스의 이니셜라이저를 통해 메모리에 할당되고 초기화한 객체를 우리는 인스턴스라고 부른다. 🌟

myInstance.someProperty = 100 // 인스턴스의 프로퍼티에 값을 할당할 수도 있고
print(myInstance.someProperty) // 값을 가져올 수도 있고

myInstance.someMethod() // 인스턴스의 메서드를 호출하여 작업을 수행하도록 할 수도 있다.

스위프트뿐만 아니라 객체지향 프로그래밍 패러다임을 차용한 언어(Objective-C, C++, 자바, 파이썬 등)는 필수로 명령형 프로그래밍 패러다임을 사용한다. 프로퍼티, 변수 등에 해당하는 메모리 값의 상태변화가 있기 때문이다.

클래스는 객체가 만들어지기 위한 청사진으로 비유하면 된다. 클래스는 실제 메모리에 객체를 할당해 인스턴스를 만들기 위한 청사진이다.

클래스에 구현된 코드대로 실제로 객체가 메모리에 올라가 활동하게 된다. 클래스에 정의된 모양대로 객체가 생성되고 객체간의 메시지를 통해 프로그램의 각 명령이 실행된다.


2. 함수형 프로그래밍 패러다임

함수형 프로그래밍 패러다임의 가장 큰 장점은 대규모 병렬처리가 굉장히 쉽다는 점이다.

함수형 프로그래밍 패러다임은 프로그램이 상태의 변화 없이 데이터 처리를 수학적 함수 계산으로 취급하고자 하는 패러다임이다. 기존의 객체지향 프로그래밍 패러다임이나 명령형 프로그래밍 패러다임은 프로그램에서 값이나 상태의 변화를 중요하게 여기지만 함수형 프로그래밍 패러다임은 함수 자체의 응용을 중요하게 여긴다.

즉, 순수하게 함수에 전달된 인자 값만 결과에 영향을 주므로 상태 값을 갖지 않고 순수하게 함수만으로 동작하게 되고 어떤 상황에서 프로그램을 실행하더라도 일정하게 같은 결과를 도출할 수 있다.

그래서 프로그램이 동작하는 흐름에서 상태(값)가 변하지 않으면 함수 호출이 각각 상호 간섭 없이 배타적으로 실행되므로 병렬처리할 때 부작용(Side-effect)이 거의 없다. 또한 프로세스 혹은 스레드별로 특정 값을 참조하기 위해 락을 걸거나 대기할 필요도 없고, 필요한만큼 함수를 나누어 처리할 수 있도록 스케일업할 수 있어 대규모 병렬처리에 큰 강점이 있다.

또 다른 함수형 프로그래밍의 큰 특징은 함수를 일급 객체(First-Class Citizen)로 다룬다는 점이다.

여기서 함수가 일급객체가 된다는 의미는 다양한 종류의 함수를 호출하고, 전달하고, 반환하는 등의 동작만으로도 프로그램을 구현할 수 있다는 뜻이다.

일급객체 조건

  • 전달인자(Argument)로 전달할 수 있다.
  • 동적 프로퍼티 할당이 가능하다.
  • 변수나 데이터 구조 안에 담을 수 있다.
  • 반환 값으로 사용할 수 있다.
  • 할당할 때 사용된 이름과 관계없이 고유한 객체로 구별할 수 있다.
func sum(first: Int) -> (Int) -> Int {
		return { second in
				return first+second // 커링 기법 (전달인자를 하나만 두고 반환하면서 ssecond in first _ second 처럼 전달인자를 사용
    }
}

sum(first: 10)(5)

해당 메소드처럼 하나의 매개변수만 담을 수 있게 하는 기법을 **커링**이라 한다.

함수형 프로그래밍 패러다임은 위에 있던 차이 외에도 모낟, 함수객체, 필터, 맵, 리듀스 등의 기능을 사용할 수 있다.

스위프트가 함수형 프로그래밍 패러다임을 차용한 의의

애플의 프래임워크를 벗어나 다른 영역(예를 들어 서버용 프레임워크 등)에서 스위프트를 사용했을 때 순수하게 함수형 프로그래밍 패러다임만으로 프로그램을 작성할 수 있기 때문 ?? …

순수하게 함수형 프로그래밍 패러다임으로 프로그램을 작성하면 얻는 장점

  • 여러 가지 연산 처리 작업이 동시에 일어나는 프로그램을 만들기 쉬움
  • 멀티 코어 혹은 여러 개 연산 프로세서를 사용하는 시스템에서 효율적인 프로그램을 만들기 쉬움
  • 상태 변화에 따른 부작용에서 자유로워지므로 순수하게 기능 구현에 초점을 맞추어 설계할 수 있음

3. 프로토콜 지향

2015년 WWDC에서 Swift 2.0 버전의 발표와 함께 Swift에 프로토콜과 익스텐션이 추가되어 프로토콜 지향 프로그래밍 언어가 되었다. Swift는 대부분의 타입이 클래스(참조 타입)가 아닌 구조체(값 타입)로 구현되어 있다. 이 상속이 불가능한 구조체로 공통 기능을 가질 수 있게 하는 방법이 프로토콜과 익스텐션이다.

기존 클래스에서 구현할 수 있었던 캡슐화, 추상화, 접근 제어등의 기능들을 구조체와 열거형에서 구현할 수 있게되었고 클래스의 인스턴스보다 값 타입을 사용함으로서 더 나은 효율성과 오류 최소화, 참조로 부터 자유로움, 더 나은 추상화 메커니즘을 추구한다는 것이다.

이는 참조 타입의 참조 문제에서 조금 더 자유로울 수 있고, 다중 상속이 불가능한 하녜를 뛰어넘을 수 있으며, 더 나은 추상화 메커니즘을 구현할 수 있다.

프로토콜에 관련한 부분은 프로토콜 페이지 참고



참고 자료

About Swift

Designed for safty