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

+ Recent posts