2차원 배열
배열을 담는 배열이다. [자료형]이 배열이라면, [[자료형]]의 형태로 생성한다.
var st1 = [56,57,59] // -> 자료형: [Int]
var st2 = [86,87,89]
var st3 = [76,77,79]
var st4 = [96,97,99]
print(st1)
print(st2)
print(st3)
print(st4)
var studs:[[Int]] = [st1,st2,st3,st4] //[Int]의 배열형태. 즉, 배열들의 배열 -> 2차원배열
print(studs)
var score = [[77,79,71],[57,59,51,50],[97,99],st4,studs[0]] // [[Int]]형 2차원 배열
print(score) //2차원 배열 출력
for i in score{
print(i) //2차원 배열의 요소에 접근. 즉 2차원 배열안의 배열들을 출력한다.
for k in i {
print(k) //2차원 배열의 배열 속 요소 출력.
}
}
print("score.count:",score.count) //2차원 배열의 요소갯수 -> 2차원 배열 속 '배열의 갯수'
print("score[0]:",score[0],score[0].count) //2차원 배열의 0번째 배열접근, 0번째 배열의 원소갯수
print("score[1]:",score[1],score[1].count) //2차원 배열의 1번째 배열접근, 1번째 배열의 원소갯수
print("score[2]:",score[2],score[2].count) //2차원 배열의 2번째 배열접근, 2번째 배열의 원소갯수
print("score[3]:",score[3],score[3].count) //2차원 배열의 3번째 배열접근, 3번째 배열의 원소갯수
print("score[4]:",score[4],score[4].count) //2차원 배열의 4번째 배열접근, 4번째 배열의 원소갯수
2차원 배열도 배열에 관련된 함수를 사용할 수 있다. 접근을 몇 번하느냐에 따라 결과가 달라지는 모습을 볼 수 있다.
print("score[4]:",score[4],score[4].count) //4번째 배열접근, 4번째 배열의 원소갯수
print(score[4][0],score[4][1],score[4][2],separator: " ") //2차원 배열 속 4번째 배열의 요소 출력
2차원 배열에 접근하게 되면 배열에 접근이 가능하고, 한번 더 접근하면 그 안의 요소에 접근이 가능하다.
2차원 배열 예제
2차원 배열을 이용한 예제다. 2차원 배열의 각 배열의 합, 평균, 원소의 평균을 구해보자.
var score = [[10,20,30], [300,400,500,600], [1,3,5,7,9]]
var total = 0
var cnt = 0
for i in score {
var sum = 0
for k in i{ //2차원 배열속 배열을 순회한다.
sum += k //각 배열속의 원소들의 합계를 구한다.
}
print(i, "합계:\(sum)", "평균:\(sum/i.count)")
//2차원 배열속 배열들 출력, 배열속 원소들의 합계, 배열속 원소들의 평균 출력
total += sum //합계들의 총합 계산(2차원배열의 총합)
cnt += i.count //원소들의 갯수 총합(2차원배열의 전체 평균을 얻기위함)
}
print(score, "배열합계:\(total)", "배열평균:\(total/score.count)", "원소평균:\(total/cnt)", "원소갯수:\(cnt)개")
Tuple
배열의 특징은 같은 자료형만 묶을 수 있다는 점이다. 이러한 점이 경우 따라서 편리하기도 하지만 반대로 다른 자료형과 함께 다룰 때에는 불편하게 작용한다. 이때 사용하는 것이 튜플이다. 튜플은 여러 자료형을 함께 묶을 수 있다.
var 튜플이름 : ( 자료형1, 자료형2, 자료형3, ... ) = ( 원소1, 원소2, 원소3, ... )
단 선언 시에 지정된 자료형으로만 원소의 입력 및 변경이 가능하며, 원소의 추가 및 삭제는 할 수 없다.
var t1:(String,Int,Bool) = ("원빈",174,true) //튜플 선언 및 초기화
print(t1)
print(t1.0) //튜플에 접근할때는 점(.)으로 접근한다.
print(t1.1)
print(t1.2)
//t1.3 = 123.456 //다른 자료형으로 대입은 안된다.
t1.0 = "투빈"
print(t1)
var tt3:(name:String, height:Int, marriage:Bool) = ("현빈",188,false) //각 요소에 이름을 지정할 수 있다.
print(tt3)
print(tt3.name, tt3.0) //각 요소에 이름으로 접근이 가능하다.
print(tt3.height, tt3.1)
print(tt3.marriage, tt3.2)
튜플 활용
튜플의 데이터를 다른 변수에 한번에 대입하는 작업도 가능하다.
var t2:(String,Int,Double) = ("젤리빈", 120, 987.432)
var nn:String
var hh:Int
var dd:Double
(nn,hh,dd) = t2 //튜플의 자료형에 맞게 여러 변수에 한번에 대입이 가능하다.
print(nn)
print(hh)
print(dd)
typealias
typealias를 사용하여 자료형을 미리 묶어놓고 사용할 수 있다.
typealias mem = (name:String, height:Int, marriage:Bool) //여러 자료형을 mem이라는 자료형으로 묶었다.
var tt4:mem = ("김우빈", 183, true) //mem 자료형으로 튜플을 생성한다.
var tt5:mem = ("커피빈", 163, false) //mem 자료형으로 튜플을 생성한다.
var tt6:mem = ("미스터빈", 186, true) //mem 자료형으로 튜플을 생성한다.
print(tt4)
print(tt5)
print(tt6)
var tts:[mem] = [tt4,tt5,tt6] //typealias로 생성한 자료형으로 배열을 만들 수 있다.
print(tts)
튜플 예제
튜플을 이용한 예제이다. 배열속 튜플의 sum과 avg를 계산하여 대입하고, 등급을 계산 후 출력해보자.
typealias stud = (name:String, score:[Int], sum:Int, avg:Int, grade:String)
var exam:[stud] = [
("이효리",[77,78,71],0,0,""),
("삼효리",[57,58,51],0,0,""),
("사효리",[97,98,91],0,0,""),
("오효리",[67,68,61],0,0,""),
("육효리",[87,88,81],0,0,"")
]
//연산부
for i in 0..<exam.count{
for k in exam[i].score{
exam[i].sum += k //i번째 튜플의 합 계산
}
exam[i].avg = exam[i].sum / exam[i].score.count //i번째 튜플의 평균 계산.
if exam[i].avg >= 90 {
exam[i].grade = "수"
} else if exam[i].avg >= 80{
exam[i].grade = "우"
} else if exam[i].avg >= 70{
exam[i].grade = "미"
} else if exam[i].avg >= 60{
exam[i].grade = "양"
} else if exam[i].avg >= 50{
exam[i].grade = "가"
} else{
exam[i].grade = "미달"
}
}
//출력부
for st in exam{
print(st)
}
주목해야할 점은 등급을 계산하는 부부이다. 조건문을 이용하여 계산하는 것이 대부분이다. 하지만 미세한 차이지만 더 빠르고 훨씬 짧은 코드로 계산이 가능하다.
typealias stud = (name:String, score:[Int], sum:Int, avg:Int, grade:String)
var exam:[stud] = [
("이효리",[77,78,71],0,0,""),
("삼효리",[57,58,51],0,0,""),
("사효리",[97,98,91],0,0,""),
("오효리",[67,68,61],0,0,""),
("육효리",[87,88,81],0,0,"")
]
//연산부
for i in 0..<exam.count{
for k in exam[i].score{
exam[i].sum += k //i번째 튜플의 합 계산
}
exam[i].avg = exam[i].sum / exam[i].score.count //i번째 튜플의 평균 계산.
let grade = ["미달","미달","미달","미달","미달","가","양","미","우","수"]
exam[i].grade = grade[exam[i].avg / 10]
}
//출력부
for st in exam{
print(st)
}
평균을 10으로 나눈 결과로 인덱스를 정하고, 배열에 저장해둔 등급 결과는 정해둔 인덱스를 이용하여 출력하면 된다.
코드는 더 짧아지고 컴퓨터는 기존의 조건문의 연산보다 더 적은 연산을 통해 결과를 출력할 수 있다.
'iOS > TJ' 카테고리의 다른 글
day10_func() (0) | 2021.06.17 |
---|---|
day09_dictionary, set (0) | 2021.06.16 |
day07_array (0) | 2021.06.02 |
day06_control flow_loop (0) | 2021.05.27 |
day05_control flow_loop (0) | 2021.05.25 |