[Swift. 문법] 2. 변수와 자료형

Ted·2023년 8월 9일
0

Swift문법

목록 보기
2/3
post-thumbnail

상수와 변수

기본적으로 swift 문법은 애가 좀 깐깐하다.

무조건 변수와 상수를 선언하려면 let과 var을 꼼꼼하게 해주어야한다. swift로 코딩테스트를 준비하는 사람이라면 집중!!!

  • let : 상수
  • var : 변수
// 상수와 변수 선언
let 상수이름: 타입 =var 변수이름: 타입 =// 값의 타입이 명확하다면 타입 생략 가능
let 상수이름 =var 변수이름 =// 상수와 변수 활용
let constant: String = "차후에 변경이 불가능한 상수 let"
var variable: String = "차후에 변경이 가능한 변수 var"

variable = "변수는 이렇게 차후에 다른 값을 할당할 수 있지만"
// constant = "상수는 차후에 값을 변경할 수 없습니다" // 컴파일 오류

그리고 상수 선언 후에 값을 할당하려면 다른 언어와 다르게 swift는 정적 타이핑 언어이기 때문에 해당 변수나 상수가 어떤 자료형인지를 정확하게 명시해주어야한다. : String과 같이 Type Annotation을 통해서

물론 타입 추론(Type Inference)이라고 해서 직접 명시하지 않아도 정적 타이핑이 가능하도록 하는 기능이 있지만, 정확하지 않을 경우 타입을 제대로 명시해주어야 한다.

let sum: Int
let inputA: Int = 100
let inputB: Int = 200

// 선언 후 첫 할당
sum = inputA + inputB

// sum = 1 // 그 이후에는 다시 값을 바꿀 수 없다, 오류발생

// 변수도 물론 차후에 할당하는 것이 가능하다
var nickName: String

nickName = "yagom"

// 변수는 차후에 다시 다른 값을 할당해도 문제가 없다!
nickName = "야곰"

데이터 타입의 종류

기본 데이터 타입

데이터 타입은 여느 언어와 동일하게 Bool, Int, UInt, Float, Double, Character, String의 타입이 있다.

// Bool
var bool : Bool = false
bool = true
bool = 1 // 컴파일 오류

// Int, UInt
var int : Int = 1
var uint : UInt = 1
uint = -1 // 컴파일 오류

// Float, Double
var float = 0.01
float = 0
var double = 0.0001
double = 0
double = float // 컴파일 오류

// character, string
var character : Character = "t"
character = "e"
character = "ted" // 컴파일 오류

var string : String = "종원"
string = string + "tedd"
string = character // 컴파일 오류

Any, AnyObject, nil

Any는 모든 타입을 지칭하지만 주의하여 사용해야하는 타입이다.

var any : Any = 100
any = "ted"

// 마지막에 String 타입의 값을 넣었더라도 Any는 String이 아니기 때문에 할당하면 안됨.
let string = any // 컴파일 오류

AnyObject의 경우 모든 클래스 타입을 지칭한다.

class tedClass{}
var anyObject : AnyObject = tedClass()

// AnyObject는 클래스의 인스턴스만 수용
anyObject = 1 // 컴파일 오류

nil은 none과 비슷한 의미를 가진다.

var any : Any
var anyObject : AnyObject

any = nil // 컴파일 오류
anyObject = nil // 컴파일 오류

Collection

Set, Array, Dictionary가 있다.

Set

Set은 순서가 없고, 멤버만 유일한 컬렉션 타입이다.

// 1. Set 생성 및 선언
var integerSet: Set<Int> = Set<Int>()

// insert : 새로운 멤버 입력
// 동일한 값은 여러번 insert해도 한번만 저장된다.
integerSet.insert(1)
integerSet.insert(99)
integerSet.insert(99)
integerSet.insert(99)
integerSet.insert(100)

print(intigerSet) // {100, 99, 1}

// contains: 멤버 포함 여부 확인
print(integerSet.contatins(1)) // true
print(integerSet.contains(2)) // false

// remove: 멤버 삭제
integerSet.remove(99) // {100, 1}
integerSet.removeFirst() // {1}

// count: 멤버 개수
integerSet.count // 1


// 2. Set의 활용
// 멤버의 유일성이 보장되기 때문에 집합 연산에 활용하면 유용하다.
let setA: Set<Int> = [1, 2, 3, 4, 5]
let setB: Set<Int> = [3, 4, 5, 6, 7]

// 합집합
let union: Set<Int> = setA.union(setB)
print(union) // [2, 4, 5, 6, 7, 3, 1]

// 합집합 오름차순 정렬
let sortedUnion: [Int] = union.sorted()
print(sortedUnion) // [1, 2, 3, 4, 5, 6, 7]

// 교집합
let intersection: Set<Int> = setA.intersection(setB)
print(intersection) // [5, 3, 4]

// 차집합
let subtracting: Set<Int> = setA.subtracting(setB)
print(subtracting) // [2, 1]

Dictionary

Dictionary의 경우 'Key'와 'Value'로 이루어진 모음집이다.

// 1. Dictionary의 선언과 생성
// Key가 String 타입이고 Value가 Any인 빈 Dictionary 생성
var anyDictionary: Dictionary<String, Any> = [String: Any]()

// 위와 동일한 표현
// var anyDictionary: Dictionary <String, Any> = Dictionary<String, Any>()
// var anyDictionary: Dictionary <String, Any> = [:]
// var anyDictionary: [String: Any] = Dictionary<String, Any>()
// var anyDictionary: [String: Any] = [String: Any]()
// var anyDictionary: [String: Any] = [:]
// var anyDictionary = [String: Any]()


// 2. Dictionary 활용
// 키에 해당하는 값 할당
anyDictionary["someKey"] = "value"
anyDictionary["anotherKey"] = 100

print(anyDictionary) // ["someKey": "value", "anotherKey": 100]

// 키에 해당하는 값 변경
anyDictionary["someKey"] = "dictionary"
print(anyDictionary) ["someKey": "dictionary", "anotherKey": 100]

// 키에 해당하는 값 제거
anyDictionary.removeValue(forKey: "anotherKey")
anyDictionary["someKey"] = nil
print(anyDictionary)


// 3. 불변 Dictionary: let을 사용하여 Dictionary 선언
let emptyDictionary: [String: String] = [:]
let initalizedDictionary: [String: String] = ["name": "yagom", "gender": "male"]

// 불변 Dictionary이므로 값 변경 불가
//emptyDictionary["key"] = "value"

// "name"이라는 키에 해당하는 값이 없을 수 있으므로 String 타입의 값이 나올 것이라는 보장이 없다.
// 컴파일 오류가 발생한다.
// let someValue: String = initalizedDictionary["name"]

Array

Array는 순서가 있는 리스트 컬렉션이다.

  • 여러가지 리터럴 문법을 활용할 수 있어 표현 방법이 다양함
  • 대괄호 뒤에 괄호 ( )를 쓰는 것은 생성자(Initializer)를 호출하는 것이다.

Array 타입에 정의된 생성자

  • init() - 빈 배열
  • init(_: sequence) - Sequence타입을 받아 같은 순서로 나열된 배열을 생성
  • init(arrayLiteral:...) - Array(1, 2, 3, 4)와 같이 원소값을 직접 넘겨서 배열 생성
  • init(repeating:count:) - 특정 값을 지정한 갯수만큼 반복하여 배열을 생성

보통 빈 배열 선언시에 var a = [자료형]()로 선언하는 것이 빠르다. 그리고 배열의 주의할 점은 다른 타입의 값을 같이 넣으면 안된다.

// 1. Array 선언 및 생성
var integers: Array<Int> = Array<Int>()

// 위와 동일한 표현
// var integers: Array<Int> = [Int]()
// var integers: Array<Int> = []
// var integers: [Int] = Array<Int>()
// var integers: [Int] = [Int]()
// var integers: [Int] = []
// var integers = [Int]()

// 여러 자료형 선언
let anyArr: [Any] = [1, 2, "three", "four"]

// 2. Array 활용
integers.append(1)
integers.append(100)

// Int 타입이 아니므로 Array에 추가할 수 없습니다
//integers.append(101.1)

print(integers)	// [1, 100]

// 멤버 포함 여부 확인
print(integers.contains(100)) // true
print(integers.contains(99)) // false

// 멤버 교체
integers[0] = 99
replaceSubrange(_:with:) // 특정 부분열의 변경, 제거 후 해당 위치에 삽입

// 멤버 삭제
integers.remove(at: 0)
integers.removeLast() // 맨 끝의 원소를 떼내어 return
integers.removeAll(keepingCapacity) // 모든 원소 제거
integers.removeSubrange(_:)

// 멤버 수 확인
print(integers.count)

// 배열에 멤버 확인
integers.isEmpty // false

// 인덱스를 벗어나 접근하려면 익셉션 런타임 오류발생
//integers[0]

// 멤버 중 최대, 최소
integers.max()
integers.min()

let strMaxData = strArray.max() ?? "" // int의 경우 0
print("[strMaxData [최대값] :: \(strMaxData)]")

// 정렬 및 뒤집기
sort(_:) // 제자리 정렬
sorted(_:) // 정렬된 사본을 return

// 3. 불변 Array: let을 사용하여 Array 선언
let immutableArray = [1, 2, 3]

// 수정이 불가능한 Array이므로 멤버를 추가하거나 삭제할 수 없다.
//immutableArray.append(4)
//immutableArray.removeAll()

Array는 정말 알고리즘에서 많이 활용되기때문에 활용하는 다른 방식도 있다.
python에서 for문을 통해 array를 생성하는 것처럼 repeating과 count를 통해 만들 수가 있다.

// (repeating: 배열의 타입과 일치하는 값(1개), count: 값을 반복할 횟수)
 
let zeroArray1 = [Int](repeating: 0, count: 10) // [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
let zeroArray2 = Array(repeating: 0, count: 10) // [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

또한 Array에선 서브 스크립트를 활용해서 각 요소에 접근을 하는데다음과 같이 된다.

let fruits = ["Apple", "Banana", "Melon"]

// 범위 연산자를 사용하여 특정 범위를 추출
fruits[0...1] // ["Apple", "Banana"]
 
// 첫 번째 요소 접근
fruits[fruits.startIndex] // "Apple"
 
// 마지막 요소 접근
// endIndex는 배열의 마지막 인덱스가 아님
//fruits[fruits.endIndex] // error: 인덱스를 벗어남
fruits[fruits.index(before: fruits.endIndex)] // "Melon"

그리고 이 서브스크립트를 활용하는데 배열의 시작과 끝 인덱스 요소를 찾고자 했을 때 비어있다면 error가 발생하지만 fruits.first, fruits.last와 같이 속성으로 접근하면 nil값으로 반환되어 에러가 나지 않아 안전하다.

swift에서의 Array가 재밌는 점은 이렇게 배열을 선언해도 인식이 된다. 바로 Range 덕분이다.

let underFive = 0.0..<5.0
print(underFive.contains(3.2)) // true

참고 출처

profile
iOS Developer

0개의 댓글