프로그래밍/Java

Java 배열(Array)

브이몬 2021. 9. 6. 14:56

▶ 배열

동일한 자료형의 데이터를 연이어 저장할 수 있도록 하는 기억 공간의 집합체(모임)이다.

배열의 크기는 최초에 한번 설정되면 변경이 불가능하다.

 

▶ 배열의 원소

배열에는 여러 개의 데이터를 저장할 수 있는데 배열에 저장된 각각의 값을 배열의 원소(Element)라고 부른다.

 

▶ 배열 선언

변수와 유사하지만 배열의 원소 개수를 언급해야 한다.

 

▶ 배열 선언하는 형식

  1. new 연산자를 이용하는 방법
  2. 해당 배열의 내용을 직접 초기화하는 방법

▶ 배열 선언할 때 고려해야 할 점

  1. 각 원소에 저장할 값에 대한 자료형
  2. 배열명(참조변수의 선언)
  3. 배열의 원소의 개수

▶ 배열 선언 방법

  1.  new 연산자를 이용한 방법
    • a라는 이름을 가진 배열에 5개의 정수형을 저장하기 위해 배열 선언 방법
    • int[] a= new int[5];
      • int : 각 원소에 저장할 값에 대한 자료형
      • a : 배열명(참조변수)
      • 5 : 배열 원소의 개수(배열의 크기)
      • 자바 컴파일러는 선언문을 보고 5개의 원소를 보관할 기억 공간(메모리)을 할당한다.
      • int는 정수 형태의 값을 저장하기 위해 위에 배열은 20바이트(4바이트*5)이다.
      • a[0]=10; a[1]=20; 이런 식으로 데이터 값을 넣을 수 있다.
    • 배열은 index가 지정이 된다. intdex는 0번부터 시작해서 번호를 순서대로 증가시킨다.
    • 첫 번째 원소는 a[0], 두 번째 원소는 a[1]이 된다.
    • 마지막 원소는 원소의 개수보다 1이 작다.
    • 배열의 원소 개수가 n으로 선언하면 배열명[0]부터 배열명[n-1]이 된다.
  2. 배열을 초기화하는 방법
    • 1차원 배열이면 데이터 값을 콤마(,)로 구분해 나열하고 집합화하기 위해서는 중괄호로 묶어준다.
    • int[] a={10, 20, 30, 40, 50}
      • int : 자료형
      • a: 배열명(참조변수)
      • 배열의 크기(원소의 개수): 5

 

▶ 배열 선언 후 값 대입하기

  1. 배열을 선언한 후 5개의 원소에 개별적으로 값을 대입 반복문을 사용해 원소에 저장된 값을 출력

public static void main(String[] args){
    int[] arr= int[5];			  //5개의 원소를 갖는 배열을 선언.
    arr[0]=10;                            //index 0~4까지 원소에 5개의 배열에 각각 값을 대입
    arr[1]=20;
    arr[2]=30;
    arr[3]=40;
    arr[4]=50;
    
    for(int i=0;i<5;i++){                 //배열 값을 출력
    	System.out.println("arr["+i+"]="+arr[i]);
    }
}

  2. 위에 각각 값을 넣은 방법을 더 간단하게 값을 입력하는 방법

public static void main(String[] args){
    int[] arr= int[5];			  //5개의 원소를 갖는 배열을 선언.
    for(i=0;i<5;i++){                     //index 0~4까지 원소에 5개의 배열에 각각 값을 대입
        a[i]=(i+1)+10;
    }
    
    for(int i=0;i<5;i++){                 //배열 값을 출력
    	System.out.println("arr["+i+"]="+arr[i]);
    }
}

  3. 배열을 초기화로 점수 5개를 대입하여 총점, 평균을 구하는 방법

public static void main(String[] args){
    int[] a={70, 50, 60, 90, 95};          //배열 초기화
    int tot=0;                             //총점 변수 초기화
    double avg=0;                          //평균 변수 초기화
    
    for(int i=0;i<5;i++){             //총합은 반복문을 사용해 배열의 원소값을 변수 tot에 더해 누적.
    	tot+=a[i];
    } 
    avg=(double)tot/5.0;              //평균은 총합에서 원소의 개수로 나누어 구함.
                                      //소수점 이하자리까지 구하기위해 캐스트연산자를 사용하고 
                                      //5도 5.0으로나누어야 한다.
    System.out.pirntln("총점 :"+ tot+", 평균 :"+avg);

 

▶ 배열의 길이

원소의 개수가 배열의 길이가 된다.

배열이름.length : 배열의 길이를 알 수 있다.

int[]a = new int[5];       //길이가 5인 int배열
int tmp=a.length;          //a.length 값은 5이다. 위에 길이가 5인 배열을 선언했기 때문에

 

public static void main(String[] args){
    int[] arr= int[5];			  //5개의 원소를 갖는 배열을 선언.
    for(i=0;i<arr.length;i++){                     //배열의 길이만큼 값을 대입
        a[i]=(i+1)+10;
    }
    
    for(int i=0;i<arr.length;i++){                 //배열의 길이만큼 값을 출력
    	System.out.println("arr["+i+"]="+arr[i]);
    }
}

 

▶ 2차원 배열

2차원 배열은 행(row)과 열(column)로 이루어진 표(행렬)를 연상하면 이해하기 쉽다.

  국어 영어 수학
1번 학생 80 90 100
2번 학생 100 90 80
3번 학생 70 60 50
4번 학생 90 70 70
5번 학생 60 85 90

행단 위로는 핵생의 정보가 저장되고 열 단위로는 각 과목별 점수가 저장되어있다. 

 

▶ 2차원 배열 선언(열과 행의 개수 추가)

int[][] a=int[5][3];

3개의 원소를 갖고 있는 1차원 배열 형태가 5묶음 있는 형태로 전체 15개의 정수 값을 저장할 수 있다.

a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]
a[2][0] a[2][1] a[2][2]
a[3][0] a[3][1] a[3][2]
a[4][0] a[4][1] a[4][2]

행의 시작 위치는 (맨 위쪽)의 index 0으로 보고 아래로 갈수록 1씩 증가한다.

열의 시작 위치(맨 왼쪽)에 있는 index를 0으로 보고 오른쪽으로 갈수록 1씩 증가한다.

 

▶ 2차원 배열을 선언함과 동시에 특정한 값을 주는 초기화 방법

int[][] a={{80, 90, 100},  //0번째 행에 대한 초기화
           {100, 90, 80},  //1번째 행에 대한 초기화
           {70, 60, 50),   //2번째 행에 대한 초기화
           {90, 70, 70),   //3번째 행에 대한 초기화
           {60, 85, 90}    //4번째 행에 대한 초기화
           };

2차원 배열의 초깃값을 중괄호를 중첩해 사용한다.

바깥쪽 중괄호는 초기화를 위한 값을  하나의 집합으로 묶기 위한 것이다.

안쪽의 중괄호는 행단위로 중괄호를 묶고 콤마(,)로 분리한다.

 

▶ 2차원 배열 출력하기(for문을 이용)

System.out.print(a[0][0]+", ");
System.out.print(a[0][1]+", ");
System.out.println(a[0][2]);
System.out.print(a[1][0]+", ");
System.out.print(a[1][1]+", ");
System.out.println(a[1][2]);
.
.
.
System.out.print(a[4][0]+", ");
System.out.print(a[4][1]+", ");
System.out.println(a[4][2]);

15개의 출력문을 다 쓰는 것은 비효율 적이다.
중첩 for문을 이용하여 행이 0일 때 열이 0~2까지 출력하고 
행이 1일 때 열이 0~2까지 출력하도록 for문을 이용하여 쉽게 출력할 수 있다.

 

public static void main(String[] args){

  int[][] a={{80, 90, 100},  //0번째 행에 대한 초기화
             {100, 90, 80},  //1번째 행에 대한 초기화
             {70, 60, 50),   //2번째 행에 대한 초기화
             {90, 70, 70),   //3번째 행에 대한 초기화
             {60, 85, 90}    //4번째 행에 대한 초기화
             };
             
   for(int r=0;r<5;r++){
       for(int c=0;c<3;c++){
           System.out.print(a[r][c]+"\t");
       }
       System.out.println();
   }

위에 방법에서 a.length로 써보기 

public static void main(String[] args){

  int[][] a={{80, 90, 100},  //0번째 행에 대한 초기화
             {100, 90, 80},  //1번째 행에 대한 초기화
             {70, 60, 50),   //2번째 행에 대한 초기화
             {90, 70, 70),   //3번째 행에 대한 초기화
             {60, 85, 90}    //4번째 행에 대한 초기화
             };
             
   for(int r=0;r<a.length;r++){
       for(int c=0;c<a[i].length;c++){
           System.out.print(a[r][c]+"\t");
       }
       System.out.println();
   }

 

▶ 배열의 출력

System.out.println(arr);               //arr 주소값이 출력된다.

for(int i=0;i<arr.length;i++){
	System.out.println(arr[i]);       //배열의 요소를 순서대로 출력
}

System.out.println(Arrays.toString(arr)); //배열의 모든 요소를 출력한다. 
                                          //[100, 90, 80, 70, 60] 이런식으로 출력된다.

 

▶ 배열 메모리 구조

stack에 데이터의 주소값이 저장되고 원소 값들은 heap에 저장된다.

주소값은 "레퍼런스"라고 한다. 

동일한 주소값을 가지고 있다면 같은 데이터를 가리키고(가지고) 있다.

 

▶ 레퍼런스

가르키고 있다, 참조하고 있다고해서 레퍼런스라고 한다.

 

▶ 배열 문제 풀기

 1. 배열 요소 순서 바꾸기

배열 arr이 있고 요소들은 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 있다. 이 요소들을 랜덤으로 100 번돌려서 순서를 섞어보자

public static void main(String[] args){
	int[] arr={1,2,3,4,5,6,7,8,9,10};
    int n=0;
    int tmp=0;
    
    for(int i=0;i<100;i++){
    	n=(int)(Math.random()*10);
        tmp= arr[0];
        arr[0]=arr[n];
        arr[n]=tmp;
    }
    
    for(int i=0;i<arr.length;i++){
    	System.out.print(arr[i]+"\t");
    }
}