[Swift] The Basic 문법

728x90

print(“Hello, world!, Hello Swift”)

Objective-C를 가지고 iOS 개발을 진행하고 있다가도, 마음 한구석에 Swift라는 놈이 신경이 쓰여 이제라도 Swift를 공부하면서 문법에 대해 정리해보려고 합니다.

애플에서 최초에 스위프트를 발표했을 때 스위프트 언어의 특징을 Safe, Modern, Powerful이라고 발표했습니다.

하지만 오픈소스로 전환되면서 특징을Safe, Fast, Expressive라고 변경되었습니다.
이 특징에 걸맞게 정말 멋지게 변하고 있는 언어입니다.

많은 분들이 접해봤을 C++, JAVA등의 언어는 명령형 프로그래밍(절자치향) 객체지향 프로그래밍 패러다임을 동시에 차용한 다중 프로그래밍 패러다임 언어입니다.

하지만Swift는여기에 더해서함수형 프로그래밍 패러다임프로토콜 지향 프로그래밍 패러다임을 더한 언어이고, 스크립트 언어가 아닌컴파일 언어입니다.

# Semicolon (;)

Objective-C를 하다가 혹은, 다른 언어를 하다가 Swift를 처음 접할때 쉽게 적응되지 않는 부분이 Semicolon(;) 녀석입니다.
Swift에선 각 라인의 마지막에 붙는 세미콜론은옵션이고,
한 라인에 여러 구문(다중 명령)을 사용하고 싶을 경우는 세미콜론 필수

print(1); print(2); print(3);
//print(1);
//print(2);
//print(3);

# 주석(Comment)

주석이란 쉽게 말해 소스코드에 메모를 작성하는것 입니다.
주석을 자세히 적어주는게 중요하다는데 먼저 사용하는 이유는

  1. 빠르게 특정 부분의 코드를 비활성화
  2. 협업 또는 인계 시 이해를 돕기 위해
  3. 자기 자신을 위해
  4. 문서화

사용법

// : 한 줄 주석

/// : 한 줄 주석 + Quick Help Markup

/* 
    : 멀티 라인 주석 (Nested 가능)
*/

사실 주석이 없이도 쉽게 이해할 수 있을 만한 코드를 짜는 것이 베스트이긴
하지만, 이것 또한 쉽지 않으니 주석을 다는 습관을 들이시는 게 중요합니다.


# 변수와 상수 (Variables And Constants)

상수와 변수는 현재 어떤 데이터에 대한 상태 값, 속성 정보 등을 담고 있는 컨테이너

  • 상수 (Constants) : 한 번 설정되면 값 변경 불가
  • 변수 (Variables) : 설정한 값을 변경 가능
let maximumNumberOfLoginAttepmts = 10
maximumNumberOfLoginAttepmts = 20 // 불가

var maximumNumberOfLoginAttepmts = 10
maximumNumberOfLoginAttepmts = 20 // 변경 가능

 

Declare multiple constants or variables

: 한 줄에 다중으로 변수 선언 가능

var x = 0.0, y = 0.0, z = 0.0
x = 1
y = 2
z = 3

 

Naming

: 영어 외에도 유니코드 문자를 포함한 대부분의 문자를 사용해 네이밍 가능

let π = 3.14159
let 你好 = "你好世界"
let 🐶🐮 = "dogcow"
let 한글 = "세종대왕"
let `let` = 1   // Swift 에서 사용되는 키워드일 경우 backquote(`) 를 이용해 사용 가능

print(π)
print(你好)
print(한글)
print(🐶🐮)
print(`let`)

 

변수로 사용할 수 없는 이름

  1. 같은 스코프 범위 내에서 중복되는 이름
  2. 공백 문자
  3. 수학 기호 (√, ∑ 등)
  4. 화살표 (→, ← 등)
  5. 숫자로 시작하는 이름 (시작 부분 외에는 사용 가능)
// let 공 백 = "X"
// let √ = "root"
// let → = "arrow"
// let 369게임 = "12짝45짝..."

# 타입 명시(Type Annotation)와 타입 추론 Type Inference)

Swift 에는 2가지의 타입이 존재합니다.

 

Type Annotation

  • 변수 선언 시 사용될 자료의 타입을 명확하게 지정하는 것.
let year: Int = 10

let language: String
language = “Swift 4”

var red, green, blue: Double
red = 255.0
green = 150.123
blue = 75

Type Inference

  • 변수 선언 시 초기화로 사용되는 값의 타입을 통해 변수의 타입을 추론하여 적용하는 것.
/*
주의
let language
language = "Swift 4"  // 이런식으로 타입추론을 쓰게 되면 var로 바꿔줘야 한다. (Type Annotation참고)
*/

let name: String = “Tori”
// type(of: name) -> String

let age: Int = 4
// type(of: age) -> Int

var weight = 6.4
// type(of: weight) -> Double 추론

var spelling = [“T”, “O”, “R”, “I”]
// type(of: spelling) -> Array<String> 타입 추론

type(of:)를 이용해 타입을 확인할 수 있습니다.

# 리터럴(Literals)

  • 상수 : 고정된 값(메모리 주소)을 가지는 심벌/식별자
  • 리터럴: 변수에 넣는 변하지 않는 데이터를 의미하는 것이다.
    • 소스코드에서 고정된 값으로 표현되는 문자(데이터) 그 자체
    • 정수/실수/문자/문자열/불리언 리터럴 등
var signedInteger: Int = 123

let decimalInteger = 17
let binaryInteger = 0b1001
//0b로 시작하면 2진법으로 사용가능
let octalInteger = 0o21
//0o로 시작하면 8진법 사용가능
let hexadecimalInteger = 0x11
//0x로 시작하면 16진법 사용가능

var bigNumber = 1_000_000_000
// 숫자가 크면 끊어서 사용할수 있게 Swift에서 제공
bigNumber = 000_001_000_000_000
bigNumber = 0b1000_100_000_000_000
bigNumber = 0o1000_100_000_000_000
bigNumber = 0x1000_100_000_000_000

0b로 시작하면2진법
0o로 시작하면8진법
0x로 시작하면16진법


# Type

Swift의 기본 데이터 타입들

  • Bool
  • Int, Uint
  • Float, Double
  • Character, String
Swift는 다른 데이터 타입과 자료 교환은 불가능!

 

Bool

  • Swift에선 1,0으로 true, false를 표현을 할 수 없다.
  • 앞에 is가 붙으면 Bool타입인걸 알 수 있다.
//Bool
var someBool : Bool = true;
someBool = false;

//에러를 발생 (C언어라고 생각하면 안됨, Bool타입에 INT형이 들어간 상황)
//someBool = 0
//someBool = 1

 

Int, Uint

  • 8-bit : Int8, UInt8
  • 16-bit : Int16, UInt16
  • 32-bit : Int32, UInt32
  • 64-bit : Int64, UInt64
  • Platform dependent : Int, UInt (64-bit on modern devices)

메모리 사이즈

: MemoryLayout<타입>.size를 사용

 

타입 범위를 알고 싶을 때

* 타입.max
* 타입.min

MemoryLayout<Int>.size     // 8
Int.max                    // 9223372036854775807
Int.min                    // -9223372036854775808

MemoryLayout<UInt>.size    // 8
UInt.max                    // 9223372036854775807
UInt.min                    // 0

MemoryLayout<Int8>.size    // 1
Int8.max                    // 127
Int8.min                    // -128

MemoryLayout<UInt8>.size    // 1
UInt8.max                    // 255
UInt8.min                    // 0

 

Float, Double

  • Double - 최소 소수점 이하15 자릿수 이하의 정밀도(Default Type)
  • Float - 최소 소수점 이하6 자리수 이하의 정밀도
    부동 소수점이므로 소수점 이하의 정밀도는 변경될 수 있음
// 기본타입으로 Double 입니다!

var floatingPointValue = 1.23
type(of: floatingPointValue) // Double

var floatValue: Float = 1.23
type(of: floatValue) // Float

 

String

  • String :문자열타입. 유니코드 사용. 큰따옴표("") 사용.
var str = " " // 이렇게 선언하면 기본으로 String 타입.
var language: String = "Swift4"

 

Character

  • Character :문자타입. 유니코드 사용. 큰따옴표("") 사용.
var nonCharacter = "C"
print(type(of: nonCharacter)) // String타입으로 나온다 (기본 타입이 String이기 때문에)

var character: Character = "C"
print(type(of: character)) // Character타입

character = " "
print(type(of: character)) // Character타입

character = "" 
// Character타입이기떄문에 에러가 난다
// ""은 String 표현이고, Charter는 하나의 문자를 사용

# Typealias (별칭)

  • 문맥상 더 적절한 이름으로 기존 타입의 이름을 참조하여 사용하고 싶을 경우 사용
  • typealias =
  • typealias를 쓸 때 이름은 대문자로 시작한다.
typealias MyInt: Int
typealias YourInt: Int
typealias MyDouble: Double

let age: MyInt = 100 // MyInt는 Int의 또 다른 이름
let year: MyDouble = 55.2 // 다른 자료형도 모두 별칭 가능

# Tuple(튜플)

튜플은 타입의 이름이 따로 지정되어 있지 않은, 프로그래머 마음대로 만드는 타입니다.
지정된 데이터의 묶음이라고 표현할 수 있습니다.

var person: (String, Int, Double) = ("jinTonics", 10, 888.5)
// String, Int, Double 타입을 갖는 튜플

print("이름: \(person.0), 나이: \(person.1), 신장: \(person.2)")
// 인덱스를 통해서 값을 가져올 수 있습니다.

//인덱스를 통해 값을 할당할 수 있습니다.
person.1 = 50
person.2 = 111.5

위의 예제를 보면 이름 대신 숫자를 표현하기 때문에 간편해 보일 수 있지만, 차후에 다른 프로그래머가 코드를 볼 때 각 요소가 어떤 의미를 갖는지 유추하기가 쉽지 않고, 이름 없이 인덱스만으로 각 요소의 데이터가 무엇을 나타내는지도 파악하기 쉽지 않습니다.
그래서 튜플의 요소마다 이름을 붙여줄 수도 있습니다.

//String, Int, Double 타입을 갖는 튜플
var person: (name: String, age: Int, height: Double) = ("kim", 28, 200)

// 인덱스를 통해서 값을 가져올 수 있습니다.
print("이름: \(person.name), 나이: \(person.age), 신장: \(person.height)")

# Type Conversion (형식 변환)

  • 타입을 다른 타입으로 변환하는 것
  • 타입()
    ex) Int(), Double()
et height = Int8(5)
// 5를 Int8타입으로 변환
let h = UInt8(25)
// 25를 UInt타입으로 변환 

let num = 10
let floatNum = Float(num)
type(of: floatNum) // Float 타입

let signedInteger = Int(floatNum)
type(of: signedInteger) // Int 타입

let str = String(num)
type(of: str) // String 타입

// magnitude, abs

let integer = Int(-15)
let magnitude = integer.magnitude // 15
let absNum = abs(integer) // 15

절대값을 나타내는magnitude와abs는 똑같이 15를 나타내는데 차이점은 무엇일까?
-> magnitudeUInt로 변환, absInt로 변환


# Basic Operation

  • +
  • -
  • *
  • /

 

용어

let a = 123
let b = 456
let c: Int? = 789

// Unary Operator (단항 연산자)
-a

// Prefix (전위 표기법)
-a

// Postfix (후위 표기법)
c!

// Binary Operator (이항 연산자)
a + b

// Infix (중위 표기법)
a + b

// Ternary Operator (삼항 연산자)
// Swift 에서 삼항 연산자는 단 하나
a > 0 ? "positive" : "negative"

 

대입 연산자 (Assignment Operators)

// Basic assignment operator
var value = 0

// Addition assignment operator
value = value + 10

// Subraction assignment operator
value = value - 5

// Multiplication assignment operator
value = value * 2

// Division assignment operator
value = value / 2

// Modulo assignment operator
value = value % 2

// Compound Assignment Operators
value += 10
value -= 5
value *= 2
value /= 2
value %= 2

Swift는++**,**--를 지원하지 않는다.
Ex)value ++,value --