본문 바로가기
> 개발/JAVA

자바의 배열 : 1차원배열과 2차원배열

by @일리 2023. 7. 30.

1차원 배열과 2차원 배열

1차원 배열은 선형 구조이다. 2차원 배열은 행과 열로 이루어진 테이블 구조를 가진다. 위의 예시에서 학생 세 명의 국,영,수 과목 점수를 2차원 배열로 표현하기 위해서 new int[행][열] 로 3행, 3열을 가진 2차원 배열을 만들었다. 이렇게 2차원 배열을 이용하면 반복문을 사용해서 배열 요소를 편리하게 나타낼 수 있다.

 

위의 이미지로 보면 2차원 배열은 그리드 형태의 데이터 구조로 보인다. 메모리에 저장될 때도 저렇게 저장될까? 그렇지 않다. 메모리에는 선형 구조로 데이터들이 a[0][0] | a[0][1] | a[0][2] | a[1][0] | a[1][1] | a[1][2]  ... 이렇게 선형 구조로 요소들이 순차적으로 저장된다.

 

2차원 배열과 length

Score.length는 행의 크기를 알려준다. 그리고 Score[0].length를 하면 열의 크기를 알려준다.

public class twoDArray {
    public static void main(String[] args){
        int[][] a = new int[2][4];
        
        for (int i = 0; i < a.length; i++){
            for (int j = 0; j < a[0].length; j++){
                a[i][j] = i + j;
                
                System.out.println("i = " + i);
                System.out.println("j = " + j);
                System.out.println("a[i][j] = " + a[i][j]);
            }
        }
    }
}

// i = 0
// j = 0
// a[i][j] = 0
// i = 0
// j = 1
// a[i][j] = 1
// i = 0
// j = 2
// a[i][j] = 2
// i = 0
// j = 3
// a[i][j] = 3
// i = 1
// j = 0
// a[i][j] = 1
// i = 1
// j = 1
// a[i][j] = 2
// i = 1
// j = 2
// a[i][j] = 3
// i = 1
// j = 3
// a[i][j] = 4

그 점을 활용해서 반복문으로 이차원배열의 각 요소에 값을 넣을 수 있당!! 이렇게 코드를 쳐놓으니 정처기가 떠오른다😅

가변 길이 배열 만들기

int[][] arr로 선언할 때 꼭 행과 열의 크기를 명시해야하는 건 아니다. 대괄호 안에 숫자를 넣지 않고 선언을 하면 크기가 정해지지 않은 가변 길이의 배열을 만들 수 있다. 예를 들어

int[][] arr = new int[5][];

는 5행을 가진 이차원 배열을 만드는 것이다. 그래서 arr[0], arr[1], arr[2] 등의 length가 모두 다를 수도 있다. 우왕~~열만 가변길이를 가지게, 혹은 행과 열 모두 가변 길이를 가질 수 있도록 할 수 있을까?! 나의 궁금한 점은

 

1. 행, 열 모두 가변적인 크기를 갖는 이차원 배열

2. 행의 크기만 가변적인 이차원 배열

3. 열의 크기만 가변적인 이차원 배열

 

중 어떤 것은 만들 수 있고, 어떤 것은 만들 수 없는지가 궁금했다. 찾아보니깐 여기에서 만들 수 있는 것은 오직 3번 뿐이다! 

// 행과 열 모두 고정적
int[][] varArr = new int[][] {{1, 2}, {3, 4, 5}};

// 행만 가변적
int[][] varArr2 = new int[2][];

처음에는 int [][] varArr 를 선언과 동시에 초기화해주면 행과 열 모두 가변적인 배열을 만들 수 있는 줄 알았다. 하지만 varArr[2][0] = {4,3,2,1}을 해보니 오류가 생겼다. 알고보니 처음에 초기화한 구조를 토대로 행과 열의 크기가 정해졌기 때문에 추가로 값을 넣을 수 없었다. 그러니 가변적인 이차원 배열을 만들려면 항상 행의 크기는 명시해줘야 한다.

다차원 배열 활용해서 별 찍기

public class MakeStar {
    public static void main(String[] args) {
        char[][] starArr = new char[5][];
        starArr[0] = new char[1];
        starArr[1] = new char[2];
        starArr[2] = new char[3];
        starArr[3] = new char[4];
        starArr[4] = new char[5];

        for (int i = 0; i < starArr.length; i++) {
            for (int j = 0; j < starArr[i].length; j++) {
                starArr[i][j] = '*';
                System.out.print(starArr[i][j]);
            }
            System.out.println();
        }
    }
}

// *
// **
// ***
// ****
// *****

코딩의 기본!! 하면 항상 나오는 'Hello World' 출력과 별찍기... 열의 크기가 1씩 늘어나는 가변 길이 이차원 배열을 만들어서 위와 같이 별을 찍을 수 있다. 

print, printf, println의 차이

지난 번부터 System.out.print% 매소드가 궁금했다. println을 쓰면 다음 줄로 넘어간다는 건 알겠는데 print는 뭐고, printf는 뭘까?

 

 1. println : 문자 그대로 출력 후 줄바꿈

 2. print : println과 동일하게 문자 그대로 출력하지만 줄은 바꾸지 않음

 3. printf : printf("서식 문자열", 값);를 사용하면 서식문자열을 출력, 마치 C언어처럼 %d, %f, %c, %s 를 사용한다.

public class Print {
    public static void main(String[] args) {
        int date = 30;
        String month = "7월";
        double temp = 33.7;

        System.out.printf("%s %d일의 온도는 %.1f입니다.", month, date, temp);
    }
}

// 7월 30일의 온도는 33.7입니다.

printf를 쓰면 month + "의 온도는 " + temp + "입니다" 와 같이 + 를 계속 사용하지 않아도 되니 편리하당 마치 자바스크립트의 템플릿 문자열처럼!!

댓글