본문 바로가기
코딩

[ Java ] 자바-입문 8.배열

by 모두의 아카이브 2024. 2. 7.
반응형
package array;
public class EnhancedFor1 {
 public static void main(String[] args) {
     int[] numbers = {1, 2, 3, 4, 5};
     //일반 for문
     for(int i = 0; i < numbers.length; ++i) {
     	int number = numbers[i];
     System.out.println(number);
     }
     
     //향상된 for문, for-each문
     for (int number : numbers) {
     	System.out.println(number);
     }
     
     //for-each문을 사용할 수 없는 경우, 증가하는 index 값 필요
     for(int i = 0; i < numbers.length; ++i) {
     	System.out.println("number" + i + "번의 결과는: " + numbers[i]);
 	}
 }
}​
//1. 변수 값 읽기
System.out.println("학생1 점수: " + students[0]); 
//2. 변수에 있는 참조값을 통해 실제 배열에 접근. 인덱스를 사용해서 해당 위치의 요소에 접근
System.out.println("학생1 점수: " + x001[0]);
//3. 배열의 값을 읽어옴
System.out.println("학생1 점수: " + 90);

// 배열을 사용하면 이렇게 참조값을 통해서 실제 배열에 접근하고 인덱스를 통해서 원하느 요소를 찾는다.​
students[0] = 90; //1. 배열에 값을 대입
x001[0] = 90; //2. 변수에 있는 참조값을 통해 실제 배열에 접근. 인덱스를 사용해서 해당 위치의 요소에 접근, 값 대입

배열이 필요한 이유

학생의 점수를 출력하는 프로그램을 만들어보자.

package array;
public class Array1 {
 public static void main(String[] args) {
     int student1 = 90;
     int student2 = 80;
     int student3 = 70;
     int student4 = 60;
     int student5 = 50;
     System.out.println("학생1 점수: " + student1);
     System.out.println("학생2 점수: " + student2);
     System.out.println("학생3 점수: " + student3);
     System.out.println("학생4 점수: " + student4);
     System.out.println("학생5 점수: " + student5);
 }
}

실행결과
학생1 점수: 90
학생2 점수: 80
학생3 점수: 70
학생4 점수: 50
학생5 점수: 90
  • 학생을 더 추가할려면 변수를 선언하는 부분과 점수를 출력하는 부분의 코드를 추가해야한다. 여기서 학생을 수백 명 이상 추가해야한다면 학생 수가 증가함에 따라 코딩 양이 비례해서 증가하는 문제가 발생한다.
  • 비슷한 변수를 반복해서 선언해야 하는 문제가 발생하지만 점수를 출력하는 부분을 보면 변수의 이름이 다르기 때문에 반복문도 적용할 수 없다.

이렇게 같은 타입의 변수를 반복해서 선언하고 반복해서 사용하는 문제를 해결하는 것이 바로 배열이다.

 

배열의 선언과 생성

package array;
public class Array1Ref1 {
     public static void main(String[] args) {
     int[] students; //배열 변수 선언
     students = new int[5]; //배열 생성
     //변수 값 대입
     students[0] = 90;
     students[1] = 80;
     students[2] = 70;
     students[3] = 60;
     students[4] = 50;
     //변수 값 사용
     System.out.println("학생1 점수: " + students[0]);
     System.out.println("학생2 점수: " + students[1]);
     System.out.println("학생3 점수: " + students[2]);
     System.out.println("학생4 점수: " + students[3]);
     System.out.println("학생5 점수: " + students[4]);
 }
}

1. 배열 선언

int[ ] students; // 배열 변수 선언

2. 배열 생성

students = new int[5]; // 배열 생성

  • 5개의 int 공간이 생성, 0으로 자동 초기화
  • new는 새로 생성한다는 뜻이고, .int[5]는 int형 변수 5개라는 뜻이다
  • 자바는 배열을 생성할때 내부값을 자동으로 초기화 하는데, 숫자는 0, boolean은 false, String은 null로 초기화 된다.

3. 배열의 참조값 보관

 

  • new int[5] 로 배열을 생성하면 배열의 크기만큼 메모리를 확보한다.
    • int 형을 5개 사용하면 4byte * 5 20byte 를 확보한다.
    • 배열을 생성하고 나면 자바는 메모리 어딘가에 있는 이 배열에 접근할 수 있는 참조값(주소)( x001 )을 반환한다.
      • 여기서 x001 이라고 표현한 것이 참조값이다. (실제로 x001 처럼 표현되는 것은 아니고 이해를 돕기 위한 예시이다.)
    •  앞서 선언한 배열 변수인 int[] students 에 생성된 배열의 참조값( x001 )을 보관한다.
    • int[] students 변수는 new int[5] 로 생성한 배열의 참조값을 가지고 있다.
    • 이 변수는 참조값을 가지고 있다. 이 참조값을 통해 배열을 참조할 수 있다. 쉽게 이야기해서 참조값을 통해
      메모리에 있는 실제 배열에 접근하고 사용할 수 있다.
    • 참고로 배열을 생성하는 new int[5] 자체에는 아무런 이름이 없다! 그냥 int 형 변수를 5개 연속으로 만드는 것이다. 따라서 생성한 배열에 접근하는 방법이 필요하다. 따라서 배열을 생성할 때 반환되는 참조값 을 어딘가에
      보관해두어야 한다. 앞서 int[] students 변수에 참조값( x001 )을 보관해두었다.
      이 변수 를 통해서 이 배열에 접근할 수 있다
int[] students = new int[5]; //1. 배열 생성
int[] students = x001; //2. new int[5]의 결과로 x001 참조값 반환
students = x001 //3. 최종 결과

 

4. 배열 사용

인덱스

[ ] 사이에 숫자를 넣어주면 된다. 이때 배열의 위치를 나타내는 숫자를 인덱스라 한다.

//변수 값 대입
students[0] = 90;
students[1] = 80;
//변수 값 사용
System.out.println("학생1 점수: " + students[0]);
System.out.println("학생2 점수: " + students[1]);

배열은 0부터 시작한다.

new int[5]와 같이 5개의 요소를 가지는 int형 배열을 만들었다면 인덱스는 0,1,2,3,4가 존재한다.

여기서 주의할점은 인덱스는 0부터 시작, 따라서 인덱스의 범위는 0 ~ (n-1)이 된다.

만약 students[5] 와 같이 접근 가능한 배열의 인덱스 범위를 넘어가면 다음과 같은 오류가 발생한다.

 

5. 배열에 값 대입

students[0] = 90; //1. 배열에 값을 대입
x001[0] = 90; //2. 변수에 있는 참조값을 통해 실제 배열에 접근. 인덱스를 사용해서 해당 위치의 요소에 접근, 값 대입

 

6. 배열 값 읽기

//1. 변수 값 읽기
System.out.println("학생1 점수: " + students[0]); 
//2. 변수에 있는 참조값을 통해 실제 배열에 접근. 인덱스를 사용해서 해당 위치의 요소에 접근
System.out.println("학생1 점수: " + x001[0]);
//3. 배열의 값을 읽어옴
System.out.println("학생1 점수: " + 90);

//배열을 사용하면 이렇게 참조값을 통해서 실제 배열에 접근하고 인덱스를 통해서 원하는 요소를 찾는다.

 

7. 기본형 vs 참조형

  • 기본형(Primitive Type): 우리가 지금까지 봤던 int , long , double , boolean 처럼 변수에 사용할 값을 직접 넣을 수 있는 데이터 타입을 기본형(Primitive Type)이라 한다.
  • 참조형(Reference Type): int[] students 와 같이 데이터에 접근하기 위한 참조(주소)를 저장하는 데이터 타입을 참조형(Reference Type)이라 한다. 뒤에서 학습하는 객체나 클래스를 담을 수 있는 변수들도 모두 참조 형이다

배열이 참조형을 사용하는이유

=> 기본형은 모두 사이즈가 명확하게 정해져 있다

int i; //4byte
long l;//8byte
double d; //8byte

그러나 배열은 동적으로 사이즈를 변경할 수 있다.

int size=10000; //사용자가 입력한 값을 넣었다고 가정해보자.
new int[size]; //이 코드가 실행되는 시점에 배열의 크기가 정해진다.

 

8. 배열 리펙토링 - 초기화

int[] students;
students = new int[]{90, 80, 70, 60, 50}; //배열 생성과 초기화

 

9. 배열 리펙토링 - 간단한 배열생성

 

배열의 편리한 초기화

int[] students = {90, 80, 70, 60, 50};

 

이렇게 하더라도 자바가 내부 배열 요소 크기를 보고 new int[5]을 사용해서 배열을 생성

 

오류

int[] students;
students = {90, 80, 70, 60, 50};

10. 2차원 배열

2차원 배열은 int [ ] [ ] arr = new int [2][3]와 같이 선언하고 생성한다. 그리고 arr[1][2] 와 같이 사용하 는데, 먼저 행 번호를 찾고, 그 다음에 열 번호를 찾으면 된다

 

package array;
public class ArrayDi3 {
 public static void main(String[] args) {
     // 2x3 2차원 배열, 초기화
     int[][] arr = {
     {1, 2, 3},
     {4, 5, 6}
     };
     // 2차원 배열의 길이를 활용
     for (int row = 0; row < arr.length; row++) {
         for (int column = 0; column < arr[row].length; column++) {
             System.out.print(arr[row][column] + " ");
         }
             System.out.println();
 	}
 }
}
  • arr.length 는 행의 길이를 뜻한다. 여기서는 2가 출력된다.
    • {{},{}} 를 생각해보면 arr 배열은 {} , {} 2개의 배열 요소를 가진다.
  • arr[row].length 는 열의 길이를 뜻한다. 여기서는 3이 출력된다.
    • arr[0] 은 {1,2,3} 배열을 뜻한다. 이 배열에는 3개의 요소가 있다.
    • arr[1] 은 {4,5,6} 배열을 뜻한다. 이 배열에는 3개의 요소가 있다

11. 향상된 for문

각각의 요소를 탐색한다는 의미로 for-each문이라고도 많이 부른다.

iter 입력하면 자동완성 됨

 

향상된 for문 정의

for (변수 : 배열 또는 컬렉션) {
 // 배열 또는 컬렉션의 요소를 순회하면서 수행할 작업
}

 

package array;
public class EnhancedFor1 {
 public static void main(String[] args) {
     int[] numbers = {1, 2, 3, 4, 5};
     //일반 for문
     for(int i = 0; i < numbers.length; ++i) {
     	int number = numbers[i];
     	System.out.println(number);
     }
     
     //향상된 for문, for-each문
     for (int number : numbers) {
     	System.out.println(number);
     }
     
     //for-each문을 사용할 수 없는 경우, 증가하는 index 값 필요
     for(int i = 0; i < numbers.length; ++i) {
    	 System.out.println("number" + i + "번의 결과는: " + numbers[i]);
     }
 }
}

 

  • 향상된 for문은 배열의 인덱스를 사용하지 않고, 종료조건을 주지 않아도 된다. 단순히 해당 배열을 처음부터 끝까지 탐색한다.
  • : 의 오른쪽에 numbers 와 같이 탐색할 배열을 선택하고, : 의 왼쪽에 int number 와 같이 반복할 때 마다 찾은 값을 저장할 변수를 선언한다. 그러면 배열의 값을 하나씩 꺼내서 왼쪽에 있는 number 에 담고 for문을 수 행한다. for문의 끝에 가면 다음 값을 꺼내서 number 에 담고 for문을 반복 수행한다. numbers 배열의 끝에 도 달해서 더 값이 없으면 for문이 완전히 종료된다.
  • 향상된 for문은 배열의 인덱스를 사용하지 않고도 배열의 요소를 순회할 수 있기 때문에 코드가 간결하고 가독성 이 좋다.

향상된 for문을 사용하지 못하는 경우

  • 향상된 for문에는 증가하는 인덱스 값이 감추어져 있다. 따라서 int i 와 같은 증가하는 인덱스 값을 직접 사용해야 하 는 경우에는 향상된 for문을 사용할 수 없다
반응형