[Swift] Ch1.스위프트 / Ch2. 스위프트 처음 시작하기

JJUDEV·2024년 2월 19일
0

Swift

목록 보기
7/21
post-thumbnail

본 글은 야곰의 스위프트 프로그래밍: Swift5 교재를 토대로 공부한 내용을 요약한 것입니다.

1. 스위프트

1.1 스위프트의 역사

Swift는 2010년 크리스 라트너(Chris Lattner)를 필두로 애플의 프로그래머들이 개발을 시작했습니다. Objective-C, 루비, 파이썬 등 많은 프로그래밍 언어의 콘셉트를 참고하여 만들었으며 2014년 9월 정식 발표된 이후 현재까지 계속 발전하고 있습니다.

  • 2024년 2월 19일 기준 Swift 5.9가 가장 최신 버전입니다. 버전 히스토리는 스위프트 공식 블로그인 https://www.swift.org/blog/ 에서 확인 가능합니다.

1.2 스위프트의 언어적 특성

1) 안정성(Safe)

Optional, guard, 오류처리, 타입 통제 등의 엄격한 문법의 통제를 통해 프로그래머가 저지를 수 있는 실수를 방지한다.

  • Optional: 값이 nil일 수 있는 상황을 명시적으로 처리함으로 (Unwrapping 과정이 필요하므로) 런타임에 null pointer exception을 피하는데 도움이 된다.
  • guard: Optional 값의 바인딩 처리 시 유용하며 특정 조건이 충족되지 않을 경우 빠르게 함수에서 벗어날 수 있다. guard를 사용함으로써 개발자는 복잡한 if let 구조를 피할 수 있다.
  • 오류처리: throw, try, catch 키워드를 사용하여 오류를 발생시키고 이를 처리할 수 있다. 이는 개발자가 예상치 못한 상황을 명시적으로 처리하고 앱의 안정성을 유지할 수 있도록 한다.
  • 타입 통제: Swift는 컴파일 타임에 타입을 체크하며 이를 통해 다양한 타입의 오류를 사전에 방지할 수 있다. 타입 추론과 타입 체크 기능은 개발자가 타입 관련 실수를 줄이고, 더 안전한 코드를 작성할 수 있도록 한다.
2) 신속성(Fast)

스위프트는 C언어 기반의 C, C++, Objective-C를 대체하고자 만들어졌으며 C언어 수준과 동등한 성능을 일정 수준 유지하고자 초점을 맞춰 개발되어 실행 속도 최적화 뿐 아니라 지속적인 컴파일러 개량을 통해 더 빠른 컴파일 성능을 구현해 나간다.

  • LLVM(Low Level Virtual Machine) 기반의 Swift Compiler 사용

또한, ARC(Auto Reference Counting)로 메모리 관리를 효율적으로 하며 컴파일 시간에 타입추론을 하여 런타임 오버헤드를 줄일 수 있다.

3) 표현성(Expressive)

프로그래밍 언어의 문접은 각각 장단점이 있는데, 스위프트는 이러한 장단점을 참고해 현대적이고 세련된 분법을 구사하면서 좀 더 사용하기 편하고 보기 좋은 문법을 구현하려 노력한다.
또한, 스위프트는 표현력이 좋은 언어라 문법 표현의 다양성이 높은데, 아래의 예시 좌우는 같은 의미를 다르게 표현한 것이다.

Dictionary<String, Any>								[Sring: Any]
Array<Int>											[Int]
Optional<bool>										Bool?
func foo() -> Void { }								func foo() { }
func boo(closure: (Void) -> Void) -> Void { }		func boo(Closure: () -> Void { }

스위프트는 명령형 프로그래밍과 객체지향 프로그래밍 패러다임을 기반으로 한 함수형 프로그래밍 패러다임, 프로토콜 지향 패러다임을 지향한다.

1) 명령형 프로그래밍

프로그램의 상태를 변경하는 명령(명령문)을 사용하여 문제를 해결하는 패러다임이다. 변수, 할당, 조건문, 반복문 등이 주 요소이다.

	var sum = 0
    for num in 1...5 { sum += number }
    print(sum)
2) 객체지향 프로그래밍

프로그램을 명령어의 목록으로 보는 기존의 명령형 프로그래밍 패러다임의 시각에서 벗어나 여러 개의 독립된 단위인 객체의 모임으로 파악하고자 하는 시각이다. 객체를 중심으로 코드를 구조화하며, 캠슐화, 상속, 다형성 등의 개념을 활용한다.

	class Dog
    {
    	var name: String
        init(name: String) 
        {
        	self.name = name
        }
        func bark()
        {
        	print("Woof!")
        }
    }
    let myDog = Dog(name: "Buddy")
    myDog.bark()
3) 함수형 프로그래밍

명령형 프로그래밍 패러다임에서는 프로그램에서 값이나 상태의 변화를 중요하게 여기지만 함수형 프로그래밍 패러다임은 함수 자체의 응용을 중요하게 여긴다. 순수하게 함수에 전달된 인자 값만 결과에 영향을 주므로 상태 값을 갖지 않고 순수하게 함수만으로 동작한다.
함수형 프로그래밍의 큰 특징은 함수를 일급 객체로 다룬다는 점이다. 일급 객체의 가장 큰 특징은 함수의 전달인자나 반환값으로 사용할 수 있다는 것이다.

	let numbers = [1, 2, 3, 4, 5]
	let squaredNumbers = numbers.map { $0 * $0 }.filter { $0 > 10 }.reduce(0, +)

위 코드에서 알 수 있듯이 함수형 프로그래밍이 코딩 스타일에 영향을 미치는데, 이는 메서드 체이닝(Method Chaining) 형식으로 나타나게 된다.
메서드 체이닝은 여러 함수 호출을 연속적으로 연결하는 방식을 말한다. 이 방식은 함수형 프로그래밍에서 데이터 변환 과정을 명확하고 간결하게 표현할 수 있도록 해주며, 중간 결과를 임시 변수에 저장할 필요 없이 최종 결과를 효율적으로 도출할 수 있도록 한다.

4) 프로토콜 지향 프로그래밍

프로토콜을 사용하여 코드를 구조화하며, 타입 간의 공통된 기능을 정의한다. 이는 다중상속이 불가능한 한계를 뛰어넘을 수 있게 한다.

	protocol Sound { func makeSound() } 
    class Dog: Sound 
    {
    	func makeSound() 
        	{           
            	print("Woof!")
            } 
    } 
    class Cat: Sound 
    { 
    	func makeSound() 
     	{ 
        	print("Meow!") 
        } 
    } 
    let dog = Dog() 
    let cat = Cat() 
    dog.makeSound()  
    cat.makeSound()

1.3 스위프트 실행 환경

  • Xcode - Playground: Xcode는 macOS에서 동작하는 애플의 통합 개발 환경(IDE)로 맥용 애플리케이션 제작부터 iOS, watchOS, tvOS 등의 애플리케이션 제작, 프레임워크 및 라이브러리 제작 등 다양한 프로그래밍을 할 수 있다. 플레이그라운드는 별도의 프로젝트 생성 없이 스위프트 코드를 실행할 수 있는 스위프트 코딩 환경이다.
  • REPL: 스위프트는 인터프리터 언어에서 주로 사용되는 REPL(Read-eval-print loop)로도 코드를 실행할 수 있다. 스위프트는 인터프리터 언어가 아닌 컴파일 언어지만 기존의 인터프리터 언어의 REPL과 거의 비슷하게 사용할 수 있다.
  • 웹: 여러 웹 사이트에서 macOS가 아닌 다른 환경에서도 쉽게 테스트할 수 있도록 플레이그라운드와 유사한 환경을 제공한다.
    http://online.swiftplayground.run
    https://ide.goorm.io/
  • 모바일: 아이패드용 플레이그라운드
    https://goo.gl/gUugXe

2. 스위프트 처음 시작하기

2.1 기본 명명 규칙

  • 변수, 상수, 함수, 메서드, 타입 등의 이름은 유니코드에서 제원하는 어떤 문자도 사용할 수 있지만 아래의 예외 경우는 사용할 수 없다.

    스위프트에서 미리 정한 예약어나 키워드
    해당 코드 범위 내에서 미리 사용되는 이름
    연산자로 사용될 수 있는 기호(+, -, *, /)
    숫자로 시작하는 이름
    공백이 포함된 이름

  • 함수, 메서드, 인턴스 이름은 Lower Camel Case를 사용
  • 클래스, 구조체, 익슽텐션, 프로토콜, 열거형 이름은 Upper Camel Case를 사용
  • 대소문자 구별

2.2 콘솔 로그

  • print()
    : 디버깅 콘솔에 간략한 정보 출력
  • dump()
    : 조금 더 제세한 정보 출력
	class User {
      	var name: String
      	var age: Int

      	init(name: String, age: Int) {
            self.name = name
            self.age = age
    	}
	}

    let user = User(name: "John Doe", age: 30)
    
    print(user)
    // User
    dump(user)
    /*
    ▿ User
	- name: "John Doe"
	- age: 30
    */
    

2.3 주석

	// 한 줄 주석
    /*
    여러 줄 주석
    // 그 안에 중첩으로 주석 추가해도 무방
    */
    /// 이렇게 주석을 달면 퀵헬프에 설명 문구가 노출된다.
    /**
    여러 줄도 마찬가지
    **/

2.4 변수와 상수

변수나 상수를 이용해 데이터를 메모리에 임시 저장한다. 변수는 생성 후 데이터 값을 변경할 수 있지만, 상수는 한번 값을 설정하면 변경할 수 없다.

  • 변수

    var [변수명]: [데이터 타입] = [값]

	var name: String = "jjudev"
    name = "jjudev92" // 변경 가능
  • 상수

    let [상수명]: [데이터 타입] = 값

	let name: String = "jjudev"
    name = "jjudev92" // 변경 불가능. 오류 발생

참고자료

  • 스위프트 프로그래밍 3판(지은이: 야곰, 출판사: 한빛미디어(주))
profile
4년차 앱개발자입니다.

2개의 댓글

comment-user-thumbnail
2024년 2월 19일

참고하신 책 얼마인가요?

1개의 답글