본문 바로가기
iOS

[Swift] 스위프트 프로그래밍 - Part1 - 1 : 스위프트? / 스위프트 장점 / 특징 / 명명 규칙 / 콘솔 로그 / 주석

by 건복치 2020. 11. 5.
반응형
야곰님의 스위프트 프로그래밍 책으로 공부한 내용을 잊어버리지 않게 간단하게 정리한 글입니다.

관련 포스트

[Swift] 스위프트 프로그래밍 - Part1 - 1 : 스위프트? / 스위프트 장점 / 특징 / 명명 규칙 / 콘솔 로그 / 주석
[Swift] 스위프트 프로그래밍 - Part1 - 2 : 변수 / 상수 / 데이터 타입 기본 (Int, Bool, Float, Character, String, Any, AnyObject, nil)
[Swift] 스위프트 프로그래밍 - Part1 - 3 - 1 : 데이터 타입 고급 (Tuple, Array, Dictionary, Set)
[Swift] 스위프트 프로그래밍 - Part1 - 3 - 2 : 데이터 타입 고급(열거형 enum)

책 범위 : Part 1. 스위프트 기초 1 (1. 스위프트 / 2. 스위프트 처음 시작하기)

1. 스위프트

iOS, macOS, WatchOS, tvOS 등 애플이 자사 제품 개발을 위해 만든 프로그래밍 언어

 

1-1. 간단한 장점

  • ARC(Automatic Reference Counting - 자동 참조 횟수 계산)를 지원해 쉽게 메모리 관리 가능

  • 프로그램을 빌드하고 실행하는 등의 수고 없이 플레이그라운드를 사용해 스위프트 코드 결과를 바로 확인 가능

  • 거의 소괄호, 세미콜론 생략 가능

  • 언어의 자유도가 높아 작성자의 스타일에 따라 다양한 방식으로 코딩 가능 (가독성 떨어짐 주의)

1-2. 애플이 발표한 스위프트 언어적 특성 - Safe, Fast, Expressive

Safe - 안전성

엄격한 문법을 적용해 프로그래머의 실수를 미연에 방지

옵셔널, guard, 오류처리, 강력한 타입 통제 등을 통해 안전한 프로그래밍 구현

 

Fast - 신속성

C 기반 언어 대체를 목적으로 C언어 수준과 같은 성능을 일정하게 유지하는데 초점을 맞춰 개발됨

지속적으로 실행 속도 최적화, 컴파일러 개량을 통해 더 빠른 컴파일 성능을 구현해 나가는 중

 

Expressive - 더 나은 표현성

다양한 언어의 장단점을 참고해 좀 더 사용하기 편하고 보기 좋은 문법을 구현하려 함(위의 장점에서 처럼 소괄호나 세미콜론 생략 등)

 

공식적인 세 가지 특징 외에도 많은 특징이 있다.

 

1-3. 프로그래밍 패러다임 

스위프트는 여러 가지 프로그래밍 패러다임을 차용한 다중 패러다임 프로그래밍 언어

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

 

ex) C - 명령형( 절차적)

      C++, Java - 명령형 + 객체지향

      Swift - 명령형 + 객체지향 + 함수형 + 프로토콜 지향

 

명령형 프로그래밍 패러다임

컴퓨터 프로그램을 명령어의 목록으로 보는 시각을 가진 프로그래밍 패러다임

프로퍼티, 변수의 값을 할당하고 가져오면서 메모리 값의 변화(상태 변화)가 있다.

 

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

명령형에서 벗어나 여러 개의 독립된 단위인 객체의 모임으로 파악하고자 하는 시각

스위프트에선 객체를 클래스의 인스턴스라는 표현을 사용

 

자세히 보려면 더보기 클릭

더보기

각각의 객체는 서로 메시지를 주고받고 데이터를 처리함

프로퍼티, 변수의 값을 할당하고 가져오면서 메모리 값의 변화(상태 변화)가 있다.

 

특징

  • 프로그램을 유연하고 쉽게 변경할 수 있어 대규모 SW 개발에 많이 사용

  • SW 개발 유지보수 간편하게 할 수 있음

  • 직관적으로 코드 분석 가능

  • 클래스에 데이터와 메서드를 모아놓은 방식으로 응집력 강화↑ + 각 클래스는 독립적으로 디자인되어 결합력 약화↓ -> 소프트웨어 질 향상

  • 실세계를 모델링해 프로그램 안에 구현하고자 했으나, 지나친 객체화 경향으로 실세계를 그대로 반영하기 어렵다는 비판도 받음

  • ex) Objefctive-C, C++, C#, Java, Swift 등

 

클래스와 객체

 

클래스(Class)

  • 같은 종류(또는 문제 해결을 위한)의 집단에 속하는 속성(field)과 행위(method)를 정의한 것

  • 기본 사용자 정의 데이터 타입

  • 다른 클래스 또는 외부 요소와 독립적으로 디자인되어야 함

 

객체(Object)

  • 클래스의 인스턴스(실제로 메로리에 할당되어 동작하는 모양을 갖춘 것, Instance)

  • 고유 속성이 있으며 클래스에서 정의한 행위를 할 수 있음

  • 스위프트에선 객체보다는 클래스의 인스턴스라는 표현을 사용

    • 객체 == 클래스의 인스턴스

    • 객체 != 인스턴스

    • 인스턴스는 구조체의 인스턴스, 열거형의 인스턴스도 있을 수 있기 때문에 객체는 인스턴스 중에도 클래스의 인스턴스만 딱 가리키는 말

 

메서드(Method) 또는 메시지(Message)

  • 객체가 클래스에 정의된 행위를 실질적으로 하는 함수

  • 메서드 또는 메시지를 통해 객체에 명령 및 데이터를 전달할 수 있음

  • 이를 '메서드를 호출한다(전달한다)'라고 표현

즉 클래스는 실제 메모리에 객체를 할당에 인스턴스를 만들기 위한 설계코드

클래스에 구현된 코드대로 실제 객체가 메모리에 올라가 활동을 하게 됨

클래스에 정의된 모양대로 객체가 생성되고, 객체간의 메시지를 통해 프로그램의 각 명령이 실행됨

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

프로그램 상태의 변화 없이 데이터 처리를 수학적 함수 계산으로 취급하고자 하는 패러다임

대규모 병렬 처리가 굉장히 쉽다.

함수를 일급 객체로 다룬다.

 

자세히 보려면 더보기 클릭

더보기

명령형, 객체지향 프로그래밍 패러다임과의 차이점

명령형과 객체지향과 달리 프로그램에서 값이나 상태의 변화를 중요하게 여기지 않고, 함수 자체의 응용을 중요하게 여긴다.

 

명령형과 객체지향 프로그래밍 - 명령형 함수 이용

함수 실행 시 함수가 전달받은 전달 인자, 포인터, 레퍼런스 값 등 객체의 상태 값(프로퍼티 값) 또는 메모리 참조 값 등이 변경될 수 있으며,

함수 내부의 처리에도 영향을 미칠 수 있다.

 

함수형 프로그래밍 - 수학적 함수 이용

순수하게 함수에 전달된 인자 값만 결과에 영향을 주므로 상태 값을 갖지 않고 순수하게 함수만으로 동작

따라서 어떤 상황에서 프로그램을 실행하더라도 일정하게 같은 결과를 도출할 수 있다.

 

함수형 프로그래밍의 특징

프로그램이 동작하는 흐름에서 상태(값)가 변하지 않으면 함수 호출이 각각 상호 간섭 없이 배타적으로 실행되므로 병렬 처리할 때 부작용이 거의 없다.

프로세스 혹은 스레드 별로 특정 값을 참조하기 위해 락을 걸거나 대기할 필요가 없기 때문이다.

또한 필요한 만큼 함수를 나누어 처리할 수 있도록 스케일 업할 수 있기 때문에 대규모 병렬 처리에 큰 강점이 있다.

 

함수를 일급 객체로 다룸

 

일급 객체의 조건

  • 전달 인자(Argument)로 전달할 수 있다.

  • 동적 프로퍼티 할당이 가능하다.

  • 변수나 데이터 구조 안에 담을 수 있다.

  • 반환 값으로 사용할 수 있다.

  • 할당할 때 사용된 이름과 관계없이 고유한 객체로 구별할 수 있다.

기존의 스칼라 타입인 정수, 실수 등은 거의 모든 언어에서 일급 객체의 조건을 갖출 수 있지만, 대부분의 함수는 그렇지 않다.

하지만 스위프트의 함수는 이 조건을 모두 충족할 수 있기에 함수를 일급 객체로 취급한다.

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

(파트 3에서 자세히)

 

명령형 프로그래밍과 함수형 프로그래밍의 비교

  명령형 프로그래밍 함수형 프로그래밍
프로그래머가 초점을 두는 곳 작업 수행 알고리즘
상태의 변경 추적
원하는 정보
필요한 변환
상태 변경 중요 없음
실행 순서 중요 낮은 중요도
주요 흐름 제어 제어 구문(반복문, 조건문 등)
함수(메서드) 호출
순환(재귀) 함수 호출 등의 함수 호출로 제어
주요 조작 단위 클래스나 구조체의 인스턴스 함수

 

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

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

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

  • 여러 가지 연산 처리 작업이 동시에 일어나는 프로그램을 만들기 쉽다.

  • 멀티 코어 혹은 여러 개 연산 프로세서를 사용하는 시스템에서 효율적인 프로그램을 만들기 쉽다.

  • 상태 변화에 따른 부작용에서 자유로워지므로 순수하게 기능 구현에 초점을 맞추어 설계할 수 있다.

프로토콜 지향 프로그래밍 패러다임 

참조 타입인 클래스의 인스턴스보다 값 타입을 더욱 효율적으로 사용하며, 오류를 줄일 방안

 

자세히 보려면 더보기 클릭

더보기

스위프트에서는 구조체와 열거형, 기존 클래스에서 구현할 수 있었던 캡슐화, 추상화, 접근 제어 등의 기능을 모두 구현할 수 있음

더불어 프로토콜 익스텐션을 활용할 수 있기 때문에 프로토콜 지향 프로그래밍이 가능하다.

 

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

(프로토콜 지향 프로그래밍(23) 장에서 자세히)

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

2-1. 기본 명명 규칙

스위프트 언어 자체에 명시된 명명 규칙은 없음.

아래는 스위프트 <API 디자인 가이드라인> 중 꼭 알아야 할 기본 명명 규칙

 

  1. 변수, 상수, 함수, 메서드 타입 등의 이름은 유니코드에서 지원하는 어떤 문자라도 사용할 수 있음. 

    • 예외 - 스위프트에서 미리 정한 *예약어 또는 *키워드

    • 예외 - 해당 코드 범위 내에서 이미 사용된 동일한 이름

    • 예외 - 연산자로 사용될 수 있는 기호 (+, -, *, /)

    • 예외 - 숫자로 시작하는 이름

    •  예외 - 공백이 포함된 이름

  2. 함수, 메서드, 인스턴스 이름은 첫 글자를 소문자로 사용하는 소문자 카멜 케이스 사용

  3. 클래스, 구조체, 익스텐션, 프로토콜, 열거형의 이름은 첫 그자를 대문자로 사용하는 대문자 카멜케이스

  4. 대소문자 구별

- 세미콜론(;)은 선택이지만 안 붙이길 권장 

 

*예약어 : 프로그래밍 언어에서 미리 사용하기로 약속한 단어, 식별자로 사용할 수 없음

*키워드 : 프로그래밍 언어 문법의 일부, 특별한 의미가 있는 단어. 스위프트의 키워드는 대부분 예약어

 

2-2. 콘솔 로그

프로그램에서 로그란 앱의 상태, 내부 로직의 흐름을 관찰할 수 있도록 출력한 정보를 의미

콘솔 로그는 디버깅 중 디버깅 콘솔에 보여줄 로그를 의미

print(), dump() 함수를 사용해 콘솔 로그 출력

 

print() 

  • print("hello Swift")

  • 줄 바꿈(\n) 자동 삽입되어 있음

 

dump() 

  • print()보다 조금 더 자세히 출력

  • 출력하려는 인스턴스의 자세한 내부 콘텐츠까지 출력해 줌

 

문자열 보간법(String Interpolation)

  • 변수나 상수 등의 값을 문자열에 나타내고 싶을 때 사용

  • \( 변수나 상수)

  • ex) print("hello \(변수나 상수)")

입력

var str = "minha"
print(str)
dump(str)
print("Hello \(str)")

 

출력

minha
- "minha"
Hello minha

2-3. 주석

프로그램 소스 코드에 정보를 남기는 목적으로 사용 (중요 메모, 설명 메모 등)

//한 줄 주석

/*
 여러 줄 주석
 */

 

퀵 헬프

키보드 option키를 누른 상태로 변수, 상수, 함수, 메서드 등등 위에 마우스 커서를 올리면 레퍼런스 문서의 요약된 내용을 보여줌

마크업 문법에 따라 주석을 작성하면 퀵 헬프를 통해 그 내용을 확인할 수 있음

 

예제 - 자세히 보려면 더보기 클릭

더보기
///마크업 문법을 활용한 주석 예제 (퀵헬프로 볼 수 있음)
///오류 타입의 열거형
///
///- noName: 이름을 전달받지 못했을 때 발생하는 오류
///- incorrectAge(age: Int) : 나이 오류
///- unknown: 알 수 없는 오류
enum HelloError: Error {
    case noName
    case incorrectAge(age: Int)
    case unknown
}

/**
 Summary 부분에 표기될 문서화 주석
 
 제목
 
 텍스트 간 한 줄을 비워놓으면 줄 바꿈
 
 - 글머리 기호 1
 + 글머리 기호 2
 * 글머리 기호 3
 
 1. 1번
 2. 2번
 6. 3번 - 앞에 붙는 번호는 크게 중요하지 않음, 자동으로 번호 매김
 
 ---
 문단 바꿈 - 바를 3개 이상 사용
 
 ----
 
 텍스트 기울기기 *강조* 사용
 
 텍스트 굵게 **굵게** 사용
 
 링크
 [Blog](https://minhamina.tistory.com)
 
 큰 제목 표시 아래에 =을 붙여줌
 =
 
 # 큰 제목 표시 #으로
 
 중간 크기 제목 표시 아래에 -를 붙여줌
 -
 
 ## 중간 크기 제목 표시 ##으로

 다른 텍스트보다 4칸 이상 들여쓰기하면 코드 블록 생성
 
     let myName: String = "minha"
     print(myName)
 
 
 `을 3개 이상 묶어도 코드 블록 생성
 
 ```
 let myName2: String = "mina"
 print(myName2)
 ```
 
 Attention, Author, Authors, Bug, Complexity, Copyright, Custom Callout, Date, Example, Experiment, Important, Invariant, Note, Precondition, Postcondition, Remark, Requires, See Also, Since, Version, Warning
 
 위와 같은 키워드를 이용하면 부가적인 섹션이 추가되어 추가 정보를 작성할 수 있다.
 
 - note: 강조하고싶은 메모 노트로 남길 수 있음
 - author: 작성자
 - warning: 주의사항
 - Version : 10.2
 - Date : 20/11/11
 
 ---
 
 매개 변수와 반환 값도 표기 가능
 
 - parameters:
     - yourName: 당신의 이름(앞에 4칸 이상 들여쓰기)
     - yourAge: 당신의 나이
- Throws: 오류가 발생하면 HelloError의 한 케이스를 throw
- returns: Hello String
 */
func helloSwift(yourName: String?, yourAge age: Int = 0) throws -> String {
    guard let name: String = yourName else {
        throw HelloError.noName
    }
    
    if age > 150 {
        throw HelloError.incorrectAge(age: age)
    }
    
    return "Hello Swift! My name is \(name)" + (age > 0 ? " I'm \(age) years old" : "")
}

 

 

참고

아래를 참고해 정리한 내용입니다.

 

스위프트 프로그래밍 3판(야곰) - 한빛미디어
반응형

댓글