1. 배열 선언 및 추가(append), 제거(remove), 삽입(insert)하기
var intArray1:[Int] = [1,2,3,4,5] // 'var ABC:Int =' 구조와 'var ABC:[Int] =' 구조의 차이점을 이해한다. 배열로 선언.
var intArray2 = [1,2,3,4,5] // 생략하면 스위프트가 알아서 판단한다.
intArray1.append(-3) // 배열 마지막에 '값'을 추가한다. [1,2,3,4,5,-3]
intArray1.remove(at:3) // 3번 인덱스를 지우겠다. [1,2,3,5,-3]
intArray1.insert(7, at: 3) // 3번 인덱스에 7을 끼워넣겠다. [1,2,3,7,5,-3]
2. 배열의 모든 값을 확인하는 방법 & 배열의 길이를 확인하는 방법
var intArray1 = [1,2,3,7,5,-3]
// 배열의 모든 값을 확인하는 방법 1.
for i in intArray1 { // 파이썬과 스타일이 같다.
print(i, terminator:", ") // intArray1 범위에서 0번, 1번, 2번...을 프린트 하겠다.
} // 즉, intArray1[0], intArray1[1], intArray1[2]...
print("")
// 배열의 모든 값을 확인하는 방법 2. 위와 결과는 같다.
for i in 0..<intArray1.count {
print(intArray1[i], terminator:", ")
}
print("")
//결과 :
//1, 2, 3, 7, 5, -3,
//1, 2, 3, 7, 5, -3,
// 배열의 길이를 확인하는 방법 1.
print(intArray1.count) // 파이썬의 len(ABC) 함수와 같은 기능을 한다.
// 배열의 길이를 확인하는 방법 2.
var intArray1Length = intArray1.count
print(intArray1Length)
//결과 :
//6
//6
3. 빈 배열 만들기 (빈 배열은 스위프트가 자료형을 스스로 판단하지 못하기 때문에 자료형을 명시해 선언하는게 필수!!)
var intArray1:[Int] = [] // 빈 배열을 생성할 때는 스위프트가 자료형을 스스로 판단하지 못하기 때문에
var intArray2:[String] = [] // 반드시 자료형을 배열 이름 뒤에 붙여줘야한다!!
같은 초기값이 들어있는 배열 만들기
var intArray = Array(repeating: 5, count: 8)
var strArray = Array(repeating: "A", count: 5)
print("\(intArray)\n\(strArray)")
결과 :
[5, 5, 5, 5, 5, 5, 5, 5]
["A", "A", "A", "A", "A"]
// repeating 말고 repeatElement로도 가능하다
var intArray = Array(repeatElement(7, count: 6))
var strArray = Array(repeatElement("B", count: 4))
print("\(intArray)\n\(strArray)")
결과 :
[7, 7, 7, 7, 7, 7]
["B", "B", "B", "B"]
배열에 등차수열 값 넣기
// 등차수열 초기값이 들어있는 배열 만들기
var intArray1:[Int] = Array(1...100)
print(intArray1)
결과 :
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
var intArray2:[Int] = Array(stride(from: 1, through: 100, by: 3))
print(intArray2)
결과 :
[1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49, 52, 55, 58, 61, 64, 67, 70, 73, 76, 79, 82, 85, 88, 91, 94, 97, 100]
// 기존 배열에 추가하기
var intArray1:[Int] = []
intArray1.append(contentsOf: 1...100)
print(intArray1)
결과 :
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
var intArray2:[Int] = []
intArray2.append(contentsOf: stride(from: 1, through: 100, by: 3))
print(intArray2)
결과 :
[1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49, 52, 55, 58, 61, 64, 67, 70, 73, 76, 79, 82, 85, 88, 91, 94, 97, 100]
4. 배열 정렬하기
var intArray = [100,2,6,7,4,10,1,6,24,30,42,68]
print(intArray.sort()) // ()을 출력. null값이 된다.
intArray.sort() // intArray 배열을 오름차순 정렬해서 저장한다.
print(intArray) // [1, 2, 4, 6, 6, 7, 10, 24, 30, 42, 68, 100]
intArray.sort(by:>) // intArray 배열을 내림차순 정렬해서 저장한다.
print(intArray) // [100, 68, 42, 30, 24, 10, 7, 6, 6, 4, 2, 1]
intArray.sort(by:<) // intArray 배열을 오름차순 정렬해서 저장한다.
print(intArray) // [1, 2, 4, 6, 6, 7, 10, 24, 30, 42, 68, 100]
var strArray = ["A","C","D","K","T","B","E"]
print(strArray.sort()) // ()을 출력. null값이 된다.
strArray.sort() // strArray 배열을 오름차순 정렬해서 저장한다.
print(strArray) // ["A", "B", "C", "D", "E", "K", "T"]
strArray.sort(by:>) // strArray 배열을 내림차순 정렬해서 저장한다.
print(strArray) // ["T", "K", "E", "D", "C", "B", "A"]
strArray.sort(by:<) // strArray 배열을 오름차순 정렬해서 저장한다.
print(strArray) // ["A", "B", "C", "D", "E", "K", "T"]
---------------------------------- 위/아래 비교 ----------------------------------
var intArray = [100,2,6,7,4,10,1,6,24,30,42,68]
print(intArray.sorted()) // 오름차순 정렬해서 반환한 값을 출력. [1, 2, 4, 6, 6, 7, 10, 24, 30, 42, 68, 100]
intArray.sorted() // intArray 배열을 오름차순 정렬한다. (저장 X 메모리에 정렬된 값만 반환)
print(intArray) // [100, 2, 6, 7, 4, 10, 1, 6, 24, 30, 42, 68]
intArray.sorted(by:>) // intArray 배열을 내림차순 정렬한다. (저장 X 메모리에 정렬된 값만 반환)
print(intArray) // [100, 2, 6, 7, 4, 10, 1, 6, 24, 30, 42, 68]
intArray.sorted(by:<) // intArray 배열을 오름차순 정렬한다. (저장 X 메모리에 정렬된 값만 반환)
print(intArray) // [100, 2, 6, 7, 4, 10, 1, 6, 24, 30, 42, 68]
var strArray = ["A","C","D","K","T","B","E"]
print(strArray.sorted()) // 오름차순 정렬해서 반환한 값을 출력. ["A", "B", "C", "D", "E", "K", "T"]
strArray.sorted() // strArray 배열을 오름차순 정렬한다. (저장 X 메모리에 정렬된 값만 반환)
print(strArray) // ["A", "C", "D", "K", "T", "B", "E"]
strArray.sorted(by:>) // strArray 배열을 내림차순 정렬한다. (저장 X 메모리에 정렬된 값만 반환)
print(strArray) // ["A", "C", "D", "K", "T", "B", "E"]
strArray.sorted(by:<) // strArray 배열을 오름차순 정렬한다. (저장 X 메모리에 정렬된 값만 반환)
print(strArray) // ["A", "C", "D", "K", "T", "B", "E"]
// 즉, ABC.sort() 는 var ABC = ABC.sorted() 와 같다. 스위프트의 .sorted()는 파이썬의 .sort()와 같다. 배열 자체를 바꾸지 않는다.
// 따라서, ABC.sort() 는 'var ABC = ABC.sort()', 'print(ABC.sort())' 와 같은 식으로 쓸 수 없다.
5. 배열은 합연산이 가능하다.
var intArray1 = [1,2,3,4,5,6,7,8,9,10]
var intArray2 = [1000,1001,1002,1003,1004]
intArray1 += intArray2
print(intArray1)
결과 :
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1000, 1001, 1002, 1003, 1004]
var strArray1 = ["A","B","C","D","E"]
var strArray2 = ["Apple","Banana","Cherry"]
strArray1 += strArray2
print(strArray1)
결과 :
["A", "B", "C", "D", "E", "Apple", "Banana", "Cherry"]
6. 딕셔너리
var dataDict:[String:Int] = ["생년월일":920417, "우편번호":48123]
print(dataDict["주민번호"]) // 결과 : nil
print(dataDict["생년월일"]) // 결과 : Optional(920417)
print(dataDict["생년월일"]!) // 결과 : 920417 // 1. ! 강제실행
print(dataDict["생년월일"] ?? "None") // 결과 : 920417 // 2. ?? 예외처리
if let myValue = dataDict["생년월일"] { // 결과 : 920417 // 3. if else 예외처리
print(myValue)
} else {
print("None")
}
Optional 조건부를 없애는 방법에는 3가지가 있다. (위 코드블럭 참고)
1) ! 강제실행
2) ?? 예외처리
3) if else 예외처리
1번의 경우 강제실행 했는데 코드에 문제가 있으면 앱이 죽는다. 2번과 3번의 예외처리의 경우 안전장치를 했기 때문에 조건부 실행을 하지 않으면서도 앱이 죽는것을 막을 수 있다.
7. 딕셔너리의 모든 값을 확인하는 방법 & 딕셔너리의 길이를 확인하는 방법
// 딕셔너리의 모든 값을 확인하는 방법. (위에 배열의 모든 값을 확인하는 방법 1.과 같다. 단, 배열의 방법 2.는 딕셔너리는 인덱스가 없기 때문에 사용할 수 없다.)
var dataDict:[String:String] = ["생년월일":"920417", "우편번호":"48123"]
for (key,value) in dataDict {
print("dataDict[\(key)]=\(value)", terminator:" ")
}
결과 :
dataDict[우편번호]=48123 dataDict[생년월일]=920417
// 딕셔너리의 길이를 확인하는 방법 1.
print(dataDict.count)
// 딕셔너리의 길이를 확인하는 방법 2.
var dataDictLength = dataDict.count
print(dataDictLength)
//결과 :
//2
//2
8. 튜플 : 배열과 유사하나 다른 종류의 데이터를 함께 사용 가능하다!
배열의 인덱스 호출은 파이썬과 동일하지만 튜플은 조금 다르니 알아보도록 하자.
var testTuple = (134,"서울",809,"경기",394,"인천")
print(testTuple.0) // 스위프트의 배열이나 파이썬은 모두 변수명[i]인데
print(testTuple.1) // 스위프트의 튜플은 변수명.i 다.
print(testTuple.3)
//결과 :
//134
//서울
//경기
// print(testTuple.count) // 튜플은 딕셔너리와 다르게 인덱스 개념은 있지만 문자열과 숫자가 섞여 있을 경우 .count로 길이 확인이 불가능하다.
//Value of tuple type '(Int, String, Int, String, Int, String)' has no member 'count'
9. 튜플로 여러 변수 한 번에 선언하기 & 짝퉁 딕셔너리 튜플(네임드 튜플) 선언하기
// 1. 튜플을 이용해 여러개의 변수 한 번에 선언하기.
var testTuple = ("Seoul","010-2233-3333",12345) // 1) 튜플에 n개의 값을 생성한다.
var (addr, tel, coin) = testTuple // 2) n개의 변수를 선언하고 그걸 튜플에 연결한다.
//var (addr, tel, coin) = ("Seoul","010-2233-3333",12345) 이것과 같다. <아래의 짝퉁 딕셔너리 튜플과 비교>
print(testTuple) // 결과 : ("Seoul", "010-2233-3333", 12345)
print(addr, tel, coin) // 결과 : Seoul 010-2233-3333 12345
print("--------------------------------------------------")
// 2. 짝퉁 딕셔너리 튜플 만들기.
var namedTestTuple = (addr:"Bucheon",phone:"010-4455-3215",coin:23498)
// 딕셔너리 같지만 딕셔너리는 아니다. 인덱스가 있다!!
// 하지만 딕셔너리의 Key : Value 쌍처럼 사용이 가능하다!!
// 짝퉁 딕셔너리라 위에 1. 처럼 단순 변수로 이용은 불가능하다. (print(addr)을 하면 오류가 난다.
// 딕셔너리처럼 print(namedTestTuple.addr) 혹은 print(namedTestTuple.0)으로 사용이 가능하다.) <위의 변수 한 번에 선언하기랑 비교>
// 굳이 따지자면 각각의 변수명에 각각의 값이고 이런 n개를 하나의 튜플로 묶은거라 보면 된다.
print(namedTestTuple) // 결과 : (addr: "Bucheon", phone: "010-4455-3215", coin: 23498)
print(namedTestTuple.addr) // 결과 : Bucheon
print(namedTestTuple.0) // 결과 : Bucheon 위에랑 같지만 숫자로 쓰는건 지양하자. 가독성이 떨어져 유지보수에 불리하다.
단, 딕셔너리와의 가장 큰 차이점은 딕셔너리는 Key가 문자열일 경우는 testDic["Key1"]로 써야하는데
짝퉁 딕셔너리 튜플은 딕셔너리처럼 사용할 수는 있지만 실제로는 각각이 하나의 변수(var Key1)이라서 namedTestTuple.Key1 처럼 쓴다.(인덱싱을 이용할 때는 namedTestTuple.0)
10. Optional
Optional 조건부를 없애는 방법에는 3가지가 있다. 1) ! 강제실행, 2) ?? 예외처리, 3) if else 예외처리(Exception Handling)
(단, 2번이랑 3번 예외처리는 딕셔너리에서만 되는 것 같다. 2번과 3번의 예는 위 딕셔너리 참고.)
var intArray = [1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49, 52, 55, 58, 61, 64, 67, 70, 73, 76, 79, 82, 85, 88, 91, 94, 97, 100]
print(intArray.firstIndex(of: 55)) // print문은 기본적으로 문자만 출력한다. 그런데 숫자가 들어가서 Xcode가 '문자가 아닌 것 같은데? 숫자 같아...' 라고 경고를 띄운다.숫자가 맞아? 하고 xcode가 경고를 띄운다.
//결과 :
//Optional(18) // 조건부로 실행했다는 뜻
print(intArray.firstIndex(of: 55)!) // ! 나 믿고 실행해 (강제로 실행 시킴)
//결과 :
//18
intArray.remove(at: intArray.firstIndex(of: 55)) // 에러 발생으로 실행 불가.
intArray.remove(at: intArray.firstIndex(of: 55)!) 55가 처음 나온 인덱스를 삭제하라는 것이니 배열에서 55의 처음값을 삭제한다.
//결과 :
//[1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49, 52, 58, 61, 64, 67, 70, 73, 76, 79, 82, 85, 88, 91, 94, 97, 100]
cf. 부동소수점 오류
// 1. 부동소수점 오류
var sum:Float = 0.0
for _ in 0..<100 {
sum += 0.1
}
print(sum) // 0.1 * 100 = 10 이 나와야 하지만 부동소수점 오차로 10.000002가 나온다.
// 그래서 이런 식으로 보정해줄 수 있다.
if (abs(sum - 10.0) < 0.00001) { // abs : 절대값 |sum - 10.0| < 0.00001 로 발생한 오차보다 단위를 하나 올린다.
var sum2:Int = Int(sum)
print(sum2)
}
결과 :
10.000002
10
'개발자 > Swift' 카테고리의 다른 글
Swift (스위프트) 함수 예제 - BMI, Swap (0) | 2020.04.04 |
---|---|
Swift (스위프트) 함수 문법 (0) | 2020.04.03 |
Swift (스위프트) 연습 첫 번째 (0) | 2020.03.31 |
Swift (스위프트) 함수 & 단축키 모음 (0) | 2020.03.31 |
Swift (스위프트) 별 찍기와 반복문에 대한 고찰 (0) | 2020.03.26 |