[Swift] 기초 문법 정리 - 자료형과 변수와 상수, 그리고 출력

Posted by WhiteHyun on January 20, 2022

Goal

  • Swift의 기초 문법인 자료형과 변수, 상수의 할당을 알아본다.
  • 할당된 값을 출력할 수 있다.
  • 문자열보간법을 사용할 수 있다.

들어가기에 앞서

  • 문법작성규칙은 아래와 같이 작성합니다.[1]

    lower camel case: method, variable, constant upper camel case: enum, struct, class, extension

변수와 상수의 할당

  • 변수와 상수의 할당은 [변수 및 상수] [변수 및 상수명]: [자료형] = [값]을 따르며 생성할 때 자료형은 생략할 수 있습니다.

변수

  • 변수는 값의 변동이 있을 때 사용합니다.
  • 변수를 할당할 때 var 라는 키워드를 사용합니다.

    1
    2
    3
    4
    5
    6
    7
    8
    
    var name: String = "WhiteHyun"
    var age: Int = 25
    var height: Float = 190.9
    
    // 할당한 값을 다시 재설정해줄 수 있습니다.
    name = "SeungHyun"
    age = 26
    height = 191.1
    

상수

  • 상수는 값을 바꿀 수 없다. 특정 값에 의미를 부여하거나 가독성을 위해 사용됩니다.
  • 상수를 할당할 때에는 let 키워드를 사용합니다.

    1
    2
    3
    4
    5
    6
    
    let name: String = "SeungHyun"
    let age: Int = 25
    let height: Float = 190.9
    
    name = "SeungHyun Hong" // 오류 발생!
    

출력

print와 dump

  • print는 커맨드라인에 내가 원하는 값을 출력할 때 사용합니다.
  • dump는 print와 기능은 비슷하나, custom struct, custom class에 대해 좀 더 자세한 내용을 출력하고 싶을 때 사용합니다.
1
2
print(2) // 2
dump(2) // - 2    여기서 - 2의 '-'는 음수 부호가 아니다!

문자열 보간법

  • 문자열 내에 출력하고자 하는 변수나 상수가 있을 때 사용합니다. \(value) 형태로 표시하여 출력합니다.
1
2
3
4
let name: String = "SeungHyun"
var age: Int = 25
print("My name is \(name).") // My name is SeungHyun.
print("I'm \(age) years old.") // I'm 25 years old.

자료형

Int & UInt

  • 정수타입입니다. Int 를 평균적으로 사용하며, 양수 부호만 적용하는 경우 UInt 를 고려해볼 수 있습니다. 또한 효율적인 메모리 사용을 위해 Int8(UInt8), Int16(UInt16), .. 등 원하는 메모리만큼의 정수 타입을 선언할 수 있습니다.

    1
    2
    3
    
    var age: UInt = 30
    let schoolAge: Int = 121
    var level: Int8 = 127
    
  • 각 정수형 타입의 범위는 표를 확인해 주세요.

    자료형 범위
    Int8 -128~127
    UInt8 0~255
    Int16 -32,768~32,767
    UInt16 0~65,535
    Int32 -2,147,483,648~2,147,483,647
    UInt32 0~4,294,967,295
    Int64 -9,223,372,036,854,775,808~9,223,372,036,854,775,807
    UInt64 0~18,446,744,073,709,551,615

정수형 프로퍼티

프로퍼티 설명
byteSwapped 정수의 비트를 전부 토글한 값
customMirror 정수 인스턴스를 비추는(reflect) Mirror 객체
hashValue(deprecated) 정수 값의 hash 값, 실행할 때마다 다름(deprecated)[2]
leadingZeroBitCount 정수의 2진수에서 MSB[3]로부터 0의 개수
magnitude 절댓값
nonzeroBitCount 정수의 2진수에서 0이 아닌 1의 개수
trailingZeroBitCount 정수의 2진수에서 LSB[3]로부터 0의 개수
words Words struct
bigEndian 빅엔디안
littleEndian 리틀엔디안
bitWidth 정수형의 이진 비트 길이
description 정수값의 String형

정수형 메소드

메소드 설명
func encode(to encoder: Encoder) throws 정수값을 Encoder에 따라 인코딩한다.
func hash(into hasher: inout Hasher) Hashes the essential components of this value by feeding them into the given hasher.
func quotientAndRemainder(dividingBy rhs: Int) -> (quotient: Int, remainder: Int) 정수값을 other(=rhs)로 나누었을 때 몫과 나머지를 튜플로 반환한다.
func addingReportingOverflow(_ other: Int) -> (partialValue: Int, overflow: Bool) 정수값과 other(=rhs)을 더한 값과 overflow 발생 여부를 튜플로 반환한다.
func subtractingReportingOverflow(_ other: Int) -> (partialValue: Int, overflow: Bool) 정수값과 other(=rhs)을 뺀 값과 overflow 발생 여부를 튜플로 반환한다.
func multipliedReportingOverflow(by other: Int) -> (partialValue: Int, overflow: Bool) 정수값과 other(=rhs)을 곱한 값과 overflow 발생 여부를 튜플로 반환한다.
func dividedReportingOverflow(by other: Int) -> (partialValue: Int, overflow: Bool) 정수값을 other(=rhs)로 나눈 값과 overflow 발생 여부를 튜플로 반환한다.
func remainderReportingOverflow(dividingBy other: Int) -> (partialValue: Int, overflow: Bool) 정수값을 other(=rhs)로 나눈 나머지 값과 overflow 발생 여부를 튜플로 반환한다.
func advanced(by n: Int) -> Int 정수와 n의 값을 더하여 반환, + 기호를 사용하는 것을 추천한다.
func distance(to other: Int) -> Int 정수값과 other값의 거리를 계산하여 반환한다. (other - 정수값으로 계산됨)
func dividingFullWidth(_ dividend: (high: Int, low: Int.Magnitude)) -> (quotient: Int, remainder: Int) (high, low)[4]에 따른 숫자를 정수값으로 나눈 몫과 나머지를 반환한다.
func multipliedFullWidth(by other: Int) -> (high: Int, low: Int.Magnitude) 정수값과 other(=rhs)을 곱한 값을 (high, low)[4]의 형태로 반환한다.
func signum() -> Int 정수값이 음수면 -1, 양수면 1, 아니면 0을 반환한다.
func isMultiple(of other: Int) -> Bool other에서 어떤 값을 곱하여 자기 자신의 값이 나올 수 있는가
mutating func negate() 정수값의 부호를 바꾸어준다. 만약 정수값의 최솟값에서 함수를 실행하면 overflow 오류가 발생하니 유의할 것

Float & Double

  • 소수점을 포함한 숫자, 즉 실수를 다룰 때 사용합니다. 부동소수 타입이라고도 합니다. Float는 32비트의 부동소수 표현을 하며, Single-precision floating-point format[5]이고, Double은 64비트, Double-precision floating-point format[5]입니다.
    1
    2
    
    let floatNumber: Float = 51248760.2345
    let doubleNumber: Double = 1203947.12498
    

Character

  • 문자를 나타내는 자료형이며, 유니코드의 문자도 포함할 수 있습니다. 문자를 포함하는 변수를 초기화할 때에는 큰 따옴표(“)를 사용합니다.
    1
    2
    3
    
    let krFlag: Character = "\u{1F1F0}\u{1F1F7}"
    print(krFlag)
    // 🇰🇷
    

String

  • 문자열(문자의 집합)입니다. Character과 마찬가지로 유니코드를 사용할 수 있고, 큰 따옴표(“)를 사용하여 표현합니다.

    1
    2
    3
    4
    5
    6
    7
    
    let name: String = "SeungHyun"
    
    var school: String = .init() // String(), ""로 초기화 해도 됨.
    school.append("하중")
    school = school + "초등학교"
    print(school)
    // 하중초등학교
    
  • 여러 줄의 문자열을 작성해야한다면 큰 따옴표 세 개로 문자열을 묶어 처리합니다. 이 때 큰 따옴표 세 개를 쓴 다음 줄에 내려 적어야하니 왜 안돼? 와 같은 말은 하지 말아주세요.

    1
    2
    3
    4
    5
    
    let multiLineString: String = """
    Morning!
    I don’t think we’ve met before, I’m SeungHyun.
    :)
    """
    

    String 프로퍼티

프로퍼티 설명
isEmpty 빈 문자열인지 아닌지 true | false 로 반환한다.
count 문자열의 길이를 반환한다.

String 메소드

메소드 설명
func hasPrefix(_ prefix: String) -> Bool 문자열에서 접두어에 prefix라는 값이 포함되어 있으면 true, 아니면 false를 반환한다.
func hasSuffix(_ suffix: String) -> Bool 문자열에서 접미어에 prefix라는 값이 포함되어 있으면 true, 아니면 false를 반환한다.
func uppercased() -> String 문자열에 있는 소문자를 전부 대문자로 바꾸어 반환한다.
func lowercased() -> String 문자열에 있는 대문자를 전부 소문자로 바꾸어 반환한다.

Any

  • 위에 작성한 자료형 뿐 아니라 아직 설명하지 않은 자료형까지 전부 사용할 수 있는 데이터타입입니다.
  • 되도록 사용은 지양하셔야 합니다. 편하다고 나중에 사용했다가, 예기치 못한 오류가 발생하기 딱 좋은 타입이기 때문입니다.
    1
    2
    3
    
    var value: Any = 2
    value = "STRING VALUE"
    value = true
    

Reference

  1. Camel Case - 위키피디아
  2. hashValue - Apple
  3. Bit Numbering - 위키피디아
  4. high와 low에서, high는 정수값 자료형의 최대 크기이다. 예를 들어, UInt8의 high: 1, low: 2는 1*256 + 2 = 258이다. 애플 공식문서에 나오는 예시코드를 보면, Int의 최대 길이는 18446744073709551615이므로, (18446744073709551615*22640526660490081+7959093232766896457)/2241543570477705381을 계산하면 몫 186319822866995413이 나오고 나머지는 0이 나온다.

  5. Single-precision floating-point format - 위키피디아
    Double-precision floating-point format - 위키피디아