APP/Swift

Swift 문법 심화, Ios 개발자 면접 직전 Swift 문법 중요 포인트 정리1 자료형 (숫자형, 문자형, 옵셔널, 변수 상수 선언)

개발자 aloe 2022. 10. 1. 15:13
728x90

 

Int 형의 크기?

/컴파일러)의 따라 크기가 다름
print("Int32 Min = \(Int32.min) Int32 Max = \(Int32.max)")
// 32 bit 인트 값의 최대 최소값
print("Int Min = \(Int.min) Int Max = \(Int.max)")
// 출력 되는것을 보니까 현재 온라인 컴파일러는 64비트 즉 8바이트 만큼 크기를 가짐

 

 


 

문자 데이터타입 중요 포인트 

 

 

문자 데이터 타입 : Character 선언 시 중요 포인트

문자 데이터 타입 : Character 선언 시 중요 포인트
var myChar2 = ":"
var myChar3 : Character = "X"  //:Character 생략불가,생략하면 String형임
// 그래서 Character을 써야하는 상황일때는 꼭 : Character 써줘야함
print(type(of: myChar2))
print(type(of: myChar3))

//유니코드를 이용하여 변수에 문자 'X'를 할당  \u 다음에 코드 값 넣으면 됨
var myChar4 = "\u{0058}"
print(myChar4)

/*
String
Character
X
*/

 

문자열 데이터 타입 : String 이용시 문자열 보간을 사용하여 문자열과 변수, 상수, 표현식, 함수 호출의 조합으로 만들 수도 있음.

 

var userName = "Kim"  // : String 생략하는 것이 일반적임
var age = 20
var message = "\(userName)의 나이는 \(age)입니다."
print(message) // Kim의 나이는 20입니다.

// Kim의 나이는 20입니다

 

 

 

 


변수, 상수  선언시 중요 포인트

 

타입 어노테이션과 타입 추론

 

변수 또는 상수가 코드 내에서 선언되는 시점에 타입 어노테이션(type annotation)을 사용하는 것

  •   변수 또는 상수 이름 다음에 타입 선언을 두면 됨
  •  Int 타입의 userCount 라는 이름의 변수를 선언
  • var userCount : Int = 10  // : Inttype annotation

즉 직접 선언할 때 타입 명시하는 것을 타입 어노 테이션이라고함 (: int) 직접 쓰는 것

 

위에 : Int 를 생략하는게 타입 타입 추론(type inference)  이라고 함

  •  var signalStrength = 2.231     // var signalStrength : Double = 2.231
  • let companyName = "My Company"
  • signalStrength라는 변수를 Double 타입(스위프트의 타입 추론에서 모든 부동 소수점 수는 Double 타입)
  • companyName이라는 상수는 String 타입으로 간주

 

 

상수와 변수 선언하고 값 수정하기

애플은 코드의 효율성과 실행 성능을 높이기 위해서 변수(var)보다는 상수(let)를 사용하라고 권장

 

// let으로 만든 상수는 초기값에서 변경이 불가능함 
let x = 10
print(x)
x = 20
print(x)
/*
main.swift:4:1: error: cannot assign to value: 'x' is a 'let' constant
x = 20
^
main.swift:2:1: note: change 'let' to 'var' to make it mutable
let x = 10
^~~
var

오류 내용을 보면 constant라 변경이 불가능해 let 키워드를 var 변수로 
(Mutable 값을 변경 가능하게)바꾸라고 나와있음
*/

 

 

 


튜플(Tuple)

  • 튜플은 스위프트 프로그래밍 언어에서 가장 강력한 기능 중 하나
  • 여러 값을 하나의 개체에 일시적으로 묶는 방법
  • 튜플에 저장되는 항목들은 어떠한 타입도 될 수 있으며, 저장된 값들이 모두 동일한 타입이어야 한다는 제약도 없음
let myTuple = (10, 12.1, "Hi")
var myString = myTuple.2
print(myString)   //출력되는 값은? 

// Hi  인덱스 값을 사용하여 값을 추출함


단 한 줄의 코드로 튜플의 모든 값을 추출하여 변수 또는 상수에 할당
// 튜플을 이용해서 변수를 3개를 한번에 초기화 함 
let myTuple = (10, 12.1, "Hi")  //: myTuple의 자료형
let (myInt, myFloat, myString) = myTuple

print(myTuple)

 

튜플의 값을 선택적으로 추출하는 데 사용될 수 있으며,

무시하고 싶은 값에 밑줄을 사용하면 그 값은 무시

let myTuple = (10, 12.1, "Hi")  
var (myInt, _, myString) = myTuple  //부동 소수점 수는 무시

 

 

튜플을 생성할 때 각 값에 이름을 할당할 수도 있음

let myTuple2 = (count: 10, length: 12.1, message: "Hi") 
print(myTuple2.message)
// Hi

 

튜플 정리 전체적인 코드

let myTuple = (10, 12.1, "Hi")  
print(myTuple.0)
print(type(of:myTuple)) // 자료형은 튜플안에 선언 한 값의 자료형과 
튜플 자료형을 나타내는 ()로 감쌓아 나옴

// let (myInt, MyFloat, myString) = myTuple  
// var (myInt, _, myString) = myTuple  //부동 소수점 수는 무시

//튜플을 생성할 때 각 값에 이름을 할당할 수도 있음 (레이블이라고 함 )
let myTuple1 = (count: 10, length: 12.1, message: "Hi") //과제 : myTuple의 자료형
print(type(of:myTuple1))// 레이블이랑 같이 자료형이 출력됨 
print(myTuple1.message)
// 즉 인덱스 번호를 사용할수 있지만 값 별로 이름을 지정해서 이름을 불러 사용할수 있는것임

 

다음 글에서 보면 알 수 있겠지만 튜플은 함수 타입을 확인 할때도 이와 같은 형식을 유지함


 

 

 

스위프트의 가장 어렵고 막강한 기능 중 하나인 옵셔널

옵셔널 타입만이 값을 갖지 않는다는 의미의 nil 값을 가질 수 있음

 

// 옵셔널
// Int형 값을 저장 or 값이 없음(nil)
// nil 앱 개발 하거나 값을 처리하는데 있어서 값이 없을 때를 처리하기 위해 고안된 자료형

print(10)
print(Int("12"))
print(Int("hi"))
// 10
// Optional(12)
// nil

 

Null과 nil 의 차이점 

https://seolhee2750.tistory.com/10  참조 문헌

 

내가 정리한 null 과 nil 개념
Null은 값을 아직 가지지 않는 상태 즉 할당받지 않는 상태
Nil은 값이 없는 정말 (無: 없음) 무를 나타낸다.

 

 


본격 옵셔널 값 추출 방법들 : 옵셔널 을 푸는 방법들

 

 

옵셔널 타입 강제 언래핑(forced unwrapping) 1

 

var x : Int?  //옵셔널 정수형 변수 x 선언
var y : Int = 0
x = 10  // 주석처리하면?
print(x)  // Optional(10)
print(x!) // forced unwrapping해서 10이 나옴 
print(y)
//x = x+2  //가능?  X
x = x! + 2 // 옵셔널 값은 그냥연산 못함 풀어서 사용해야함 ! 사용하는forced unwrapping 사용
print(x)
//y = x    //가능? x
y = x!   // 일반 변수에 넣을때도 값을 풀어서 넣어줘야함 일반 자료형 변수에 
// 옵셔널값 그냥 못 넣음 
print(y)

// Optional(10)
// 10
// 0
// Optional(12)
// 12

정리 옵셔널 변수는 항상 값이 들어오면 옵셔널 형태로 감싸여있고
옵셔널 변수에 저장된 값은 항상 값을 풀어서 사용해야 함 즉 옵셔널은 항상 풀어서 사용해야 함

 

옵셔널 값을 풀 때 주의 할점!

 

var x : Int?  //옵셔널 변수는 초기값을 안주면 nil이 들어간다
    //x = 10  // 주석처리하면?
    //print(x)  // Optional(10)
print(x) // nil 출력됨 

//print(x!) // nil 값이 들어간 옵셔널 변수를 강제로 풀면 Crash가 난다

Crash?

https://ko.wikipedia.org/wiki/%EC%B6%A9%EB%8F%8C_(%EC%BB%B4%ED%93%A8%ED%8C%85)

 

충돌 (컴퓨팅) - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 충돌[1], 충돌(crash), 또는 시스템 크래시는 컴퓨터 프로그램(응용 소프트웨어 또는 운영 체제)이 적절하게 기능하는 것을 멈췄을 때이다. 종종 이것은 이러한 오

ko.wikipedia.org

 


스위프트에서 옵셔널을 풀때 가장 많이 쓰는 방법1

 

If-else 문과 forced unwrapping

 

var x : Int?
x = 10
if x != nil { // 옵셔널은 닐이 아닐때만 풀어야 하기때문에 이렇게 if문에 의해서
  print(x!)  // nil이 아닌지 체크하고 풀어야함 
  
  // 주의 : if x!=nil 이라고 쓰면 안됨
// 위와 같이 쓰면 x변수의 옵셔널을 풀고 nil 값을 넣어라가 되기 때문이고
// 심지어 x가 옵셔널이 풀려서 nil 값도 못넣기 때문임 
} 
else {
  print("nil")
}
var x1 : Int?   //nil
if x1 != nil {
  print(x1!)
} 
else {
  print("nil")
}

 

 

스위프트에서 옵셔널을 풀때 가장 많이 쓰는 방법2

옵셔널 바인딩(optional binding)을 이용하여 옵셔널에 할당된 값을 임시 변수 또는 상수에 할당

 

var x : Int?
x = 10
if let xx = x { //옵셔널 변수 x가 값(10)이 있으므로 언래핑해서 일반 상수 xx에 대입하고 if문 실행
  print(x, xx) // 키워드가 let이 아니고 var면 안에서 값을 가지고 놀겠다는 뜻임 
} 
else {
  print("nil")
}
var x1 : Int?
if let xx = x1 { //옵셔널 변수 x1이 값이 없어서 if문의 조건이 거짓이 되어 if문 실행하지 않고 else로 감
  print(xx)
} 
else {
  print("nil")
}

//Optional(10) 10
//nil

 

옵셔널 바인딩(optional binding) 요약 문법 들 (최신 2022년 9월 12일 5.7 Swift 업데이트 자료 까지)

var x : Int?
x = 10
if let x = x { // 옵셔널 바인딩시 이렇게 같은 이름을 줘도 상관 없음
  print(x) 
} // 옵셔널 바인딩시 변수는 이 if문 블럭에서만 쓰는것임 
else {
  print("nil")
}

이번 9 12 Swift 5.7버전업데이트 하면 이제 이런식으로 작성 가능함

https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html

 

var x : Int?
x = 10
if let x { // if let x 이걸로 옵셔널 바인딩을 한줄에 끝내버림
  print(x) // 옵셔널 바인딩시 변수는 이 if문 블럭에서만 쓰는것임 

} 
else {
  print("nil")
}

 

5.7 버전 사용 가능한 온라인 컴파일러 주소

https://swiftfiddle.com/?c=H4sIAAAAAAAAA32Q3UrDQBCFX2XYKwti9UKEgnjtO%2ByNSAqBMEgNJRAKka4%2FxKBFtzRCt3pRLQWFECPkmTKTd3DXH7zzauAMc75zJhbHoie6XeB0yXPVatWmNc8mrObA%2BQefa1ITNgrau4SmGTRFwotnoNUNmwr4vqBUAxVrKqcSh0cDiKAHhxgeSIxgH3a2Jfp9CLzQLmJwnF9Te6XZ1KTXfG1ZpqKny6Z0hAc2yZfwohyZlznd2jE%2Bayqrzy7YZBIBTgY%2BhhtRBySO%2FnGm94SvchfTJfb79FoD1Zoe375r0ir76dGUY14oa%2BcFpx7Efwwp0A%2Bk6FiQRIliUwzt03a39sToE6QOsK1AAQAA

 

 

 

 


여러 옵셔널을 언래핑

 

//여러 옵셔널 변수를 한번에 언래핑하는 방법은 콤마 사용
// + let 키워드를 둘 다 붙여줘야함 

var pet1: String?
var pet2: String?
pet1 = "cat"
pet2 = "dog"
if let firstPet = pet1, let secondPet = pet2 {  
// 스위프트에서 ,는 and 임 즉 두개다 참이여야함 하나라도 nill이면 else쪽으로감
   print(firstPet, secondPet)
} else {
  print("nil")
}

//cat dog

즉 둘다 nil이 아니여야 참이 됨

 

 

 

Nil-Coalescing Operator (Nil합병연산자) ??

 

let defaultAge = 1
var age : Int? 
age = 3
print(age) //과제:값은?
var myAge = age ?? defaultAge  // 닐을 풀때 사용하는 연산자임 닐이라면 우쯕 값이 들어감
//age가 nil이 아니므로 언래핑된 값이 나옴
print(myAge)  //과제: 값은?

 

 

장점 : 옵셔널 값을 따로 ( Optional Binding - 옵셔널 바인딩, • Force Unwrapping - 강제 추출)할 필요 없이 연산자로 한번에 풀 수 있음

 

  •  옵셔널변수 ?? nil일 때 할당되는 값
  • 옵셔널 변수의 값이 nil이면 ?? 다음 값으로 할당됨
  • 옵셔널 변수의 값이 nil이 아니면 언래핑된 값이 나옴
let defaultColor = "black"
var userDefinedColor: String?   // defaults to nil

var myColor = userDefinedColor ?? defaultColor
                 //nil이므로 defaultColor인 black으로 할당됨 
print(myColor)   //black
userDefinedColor = "red"
myColor = userDefinedColor ?? defaultColor
                 //nil이 아니므로 언래핑된 red가 할당됨
print(myColor)   //red, 주의 optional(red)가 아님

728x90