카테고리 없음

[Java] 배열,다차원 배열__개발공부 12일차-1

하체는 스쿼트 2022. 3. 6. 21:23

배열의 정의

 

 

같은 타입의 여러 변수를 하나의 묶음으로 다루는 것,Array
동일한 자료형이 메모리 상에 연속적으로 놓이게 한 것
     

 

 

배열 선언 형식

 

 

자료형[ ] 배열명;
자료형 배열명[];
  

 

배열 생성 형식

 

 

new 연산자를 사용해서 힙(동적) 영역에 실제 기억공간이 할당되고 그 시작주소를 배열명이 참조한다.

 

배열명 = new 자료형 [배열크기];
            new에 의해 힙이라는(동적메모리) 영역에 할당(생성)된다. 힙이 실제 기억공간이다.
         = 에 의해서 new로인해 생긴 힙영역의 생성 주소를 참조해오는거다.(힙-> 스택)
 

예)[ ] 인덱스 (index) 연산자를 설명 - 배열 
1000명의 국어점수를 저장할 변수를 선언
  

 

 


배열의 요소

 

첨자값==index(인덱스)
0번째 요소 배열명[0]
1번째 요소
2번째 요소
 
999번째 요소 배열명[999] ==배열명[배열명.length-1]

 

 


배열크기

 

 

배열크기 = 배열명.length
  

 

 

배열의 값 교환

 

 

 

 

**중요**

메인의 m이랑 swap의 m은 이름만 같고 기억공간은 다른거다.

스택에서는 저장 공간이 다르지만 실제로 참고하고 있는 힙 영역의 주소가 같으므로

메서드에서 배열을 통해서 값을 교환하면 
(참조되고 있는 힙영역에서의 값이 교환되는 것이다.)

메인메서드에 있는 m배열에도 영향을 주어서 값이 교환된다.

 

메서드를 통해서 배열의 값을 교환하고 싶다면 배열을 매개변수로 해서 메서드를 만들어야 한다.

 

 

배열의 길이 변경

 

늘리고싶은 크기의 배열을 메서드에서 만들고 원래 있던 곳 배열의 값들을 복사해 온다. 

그리고 temp의 주소를 반환해서 메인메서드에 있는 배열에 할당한다.

(m배열이 참고하고 있는 힙영역의 주소지를 바꿔주는 역할이다.)

 

 

 

**배열의 크기를 증가시키는 메서드를 만드는 방법

 

1단계 - 메인메서드에 있는 m배열을 매개변수로 하여 increaseArraySize 메서드를 만든다.

그 후 increaseArraySize 메서드 내에서 변경하고자 하는 크기의 배열로 새로운 배열(temp)을 만든다.

 

2단계 : temp배열로 m배열의 인덱스 요소값들을 복사해온다.

 

 

3단계 increaseArraySize반환값을 temp로 한다.            (여기서temp는 temp 배열의 힙영역의 주소를 의미한다.)

그리고 이걸 main 메서드에서 m에 할당 함으로써 배열 m이 힙영역(실제 동적 메모리 영역)에서 참조하는 주소를 바꿔준다. (이 과정이 굉장히 중요하다.) 

 

 

배열의 크기를 자동적으로 늘려주는 알고리즘

 

 

 

 

자바의 정석 p189

문자열 배열의 선언

 

 

String[] team1 = new String[6];
team1[0] = new String("홍킬동");

 

String[] team2 = {"홍킬동","홍kill동","홍KILL동","홍킬DONG"};

 

 

 

참고)

배열을 초기화 하지 않으면 각 자료형의 기본값으로 초기화가 되어져 있다.
(문자열 배열은 초기화 시키지 않으면 null값으로 나온다.)  

 

int[]m = new int[3];
int의 기본값인 0으로 초기화 되어진다.
int[0] = 0
int[1] = 0
int[2] = 0

 

 

배열관련 메서드

 

arraycopy()

 

System.arraycopy(src, srcPos, dest, destPos, length);

src :  원본 배열
srcPos : 원본의 복사할 곳의 시작 인덱스
dest: 복사할 곳의 배열
destPos : 복사본의 복사할 곳의 시작 인덱스
length : 원본 복사할곳에서 복사가 끝나는 길이
 

Arrays.toString()

 

Arrays.toString(m) m배열의 요소값들을 출력한다.

예)

[1, 2, 3, 5, 100, 0, 0, 0, 0, 0]

 

 

 

다차원 배열

 

 

다차원 배열이란 2차원 이상의 배열을 다차원 배열이라고 한다.
예) 2차원 배열, 3차원 배열, 4차원배열...(메모리)

 

 

1. 1차원 배열"열"
    int[m] = new int[8];
    int m [ ];

2. 2차원 배열 "행","열"

3. 3차원 배열 "면","행","열"

4. 4차원 배열 "권","면","행","열" 


행 열 2차원배열  4행 2열
int[ ][ ]m = new int[4][2];
int[ ][ ]m = new int[행크기][열크기];

 

예)

[ [ a, b, g ], [ c, d, h ], [ e , f, i ] ]                                   3행 3렬

[ [ a, b ], [ c, d ], [ e , f ] ]                                            3행 2렬

[ [ a ], [ c ], [ e ] ]                                                      3행 1렬

[ [ a ], [ c ], [ e ], [ q ], [ k ] ]                                        5행 1렬

 

쉽게 이야기 하면 두번째 괄호(가장 바깥쪽 괄호안의 괄호)가 행을 구분지어 주는 기준이다.

 

 

 

면 행 렬 2면 3행 4열
int[ ][ ][ ]n = new int[2][3][4];
int[ ][ ][ ]n = new int[면크기][행크기][열크기];

 

권 면 행 렬 2권 2면 3행 4열
int[ ][ ][ ][ ]n = new int[2][3][4][3];

int[ ][ ][ ][ ]n = new int[권크기][면크기][행크기][열크기];

 

 

다차원 배열의 길이

 

 

int[] m = new int[8];
System.out.println(m.length);                           //8 배열의 크기
int 정수 8개를 저장할 기억공간


 

 

[2차원배열]
int[][] m = new int[4][2];
System.out.println(m.length);                                            //배열 행의크기 4
System.out.println(m[0].length);                                         //배열 열의크기 2
System.out.println(m[1].length);                                         //배열 열의크기 2
System.out.println(m[2].length);                                         //배열 열의크기 2
System.out.println(m[3].length);                                         //배열 열의크기 2

m[행][열]
m[0][0] ~ m[3][1]

 

 

 


[3차원 배열]
2면 3행 4열
int[][][]m=new int[2][3][4];
dispM(m);//3차원 배열
System.out.println(m.length);                                               //면의 크기 2

System.out.println(m[0].length);                                            //행의 크기 3
System.out.println(m[1].length);                                            //행의 크기 3
System.out.println(m[2].length);                                            //행의 크기 3

System.out.println(m[0][0].length);                                         //열의 크기 4
System.out.println(m[0][1].length);                                         //열의 크기 4
System.out.println(m[0][2].length);                                         //열의 크기 4
System.out.println(m[0][3].length);                                         //열의 크기 4

 

 

3차원 배열 출력하는 메서드 작성방법

 

 

 

다차원 배열의 초기화

 

 

1차원 배열 초기화
int[ ]m = new int[ ]{1,2,3,4,5,6,7,8};
int[ ]m = {1,2,3,4,5,6,7,8};

 

 

2차원 배열 초기화

int[ ][ ]m = new int[2][4];
m[0][0]=1; m[0][1]=2; m[0][2]=3; m[0][3]=4;  
m[1][0]=5; m[1][1]=6; m[1][2]=7; m[1][3]=8;  

 

or

 

int[ ][ ] m =new int[ ][ ] {
                                {1,2,3,4},
                                {5,6,7,8}
                                 };

 

or

 

*******중요********
int[][] m ={
               {1,2,3,4},
               {5,6,7,8}
               };

 

 

3차원 배열 초기화

int[ ][ ][ ]m = new int[2][2][2];

m[0][0][0]=1; m[0][0][1]=2;  
m[0][1][0]=3; m[0][1][1]=4;  

m[1][0][0]=5; m[1][0][1]=6;  
m[1][1][0]=7; m[1][1][1]=8;  

 

or


int[ ][ ][ ]m = new int[ ][ ][ ]{
                                             {
                                                    {1,2},

                                                    {3,4}
                                             },
                                                    {   {5,6},{7,8}   }
                                     };

 

or


int[ ][ ][ ]m = { {{1,2}, {3,4}   }, { {5,6}, {7,8}  } };

 

 

다차원 배열을 사용하는 이유

 

 

int[ ]m = new int[8]; 같은 저장 공간 8개
int[ ][ ]m = new int[2][4]; 같은 저장 공간 8개
int[ ][ ][ ]m = new int[2][2][2]; 같은 저장 공간 8개

똑같이 저장 8개 하는건데 다르게 사용하는 걸까?

---->쉽게 찾기 위해서(불러내기 위해서)

 

예)

전교생(1,2,3학년)의 각 반의 국어 점수를 저장
1학년
1반 30명 - 국어
:
7반 30명 - 국어
2학년
1반 30명 - 국어
:
7반 30명 - 국어
3학년
1반 30명 - 국어
:
7반 30명 - 국어


1차원 배열 선언한다면 아래와 같이 된다.
int[ ] kors = new int[630];//3*7*30


2학년 5반 15번 학생의 국어점수는?
구할수는 있지만 계산을 엄청 많이해야한다.
345번째 학생(210+3*4+15)
kors[344] = 90;

System.out.println(kors[344]);                      -->2학년 5반 15번 학생의 국어점수이다.

2학년 5반의 국어 점수의 반 평균을 구하고자 한다면 이것 또한 계산이 엄청 복잡할것이다. 
321 ~ 351 번째

 

 

이런 경우에 다차원배열을 사용하면 편리하다.

 

3차원배열
면 = 학년
행 = 반
열 = 학생
int[ ][ ][ ] kors = new int[3][7][30];
2학년 5반 15번 학생의 국어점수는?                             -->kors[1][4][14]

 

2학년 5반의 국어 점수의 반 평균?
kors[1][4][0] ~ kors[1][4][29]

 

 

 

 

가변 배열

 

 

2차원 이상의 배열을 다차원 배열  -> "배열의 배열"
마지막 차수의 길이를 지정하지 않고, 추후 각기 다른 길이의 배열을 생성할 수 있다.(유연성)

 

세 반 + 30명-> 학생명 저장할 배열 선언
String[ ] names = new String[3*30];

 

위와 같이 코딩을 하게되면 모든 열이 똑같아 질수밖에 없다.

 

문제점이 발생한다.

1반(25명) 2반(30명) 3반(19명)으로 코딩을 하고 싶다면 어떻게 해야 하는가?

 

이럴때 사용하는 것이 가변배열이다.