
잔디 심기

오늘의 공부
학생의 점수를 출력하는 간단한 프로그램을 작성해보자.
Array1
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
int 형 변수를 계속해서 추가해야 한다. 학생 수가 5명이int 형 변수를 5개 선언해야 하고, 학생 수가 100명이라면 int 형 변수를 100개 선언해야 한다. 결국 비슷한 변수를 반복해서 선언하는 문제가 발생한다.이렇게 같은 타입의 변수를 반복해서 선언하고 반복해서 사용하는 문제를 해결하는 것이 바로 배열이다.
배열은 같은 타입의 변수를 사용하기 편하게 하나로 묶어둔 것이다. 이전 예제를 배열을 사용하도록 변경해보자.
참고로 단계적으로 구조를 변경해 나갈 것이다.
Array1Ref1
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]);
}
}
지금부터 아주 간단해보이는 다음 두 줄을 아주 자세히 설명하겠다. 집중해서 따라오자.
int[] students; //1. 배열 변수 선언
students = new int[5]; //2. 배열 생성

int[] students; 와 같이 배열 변수를 선언해야 한다.int[] 처럼 타입 다음에 대괄호( [] )가 들어간다는 점이다.int a 에는 정수를, double b 에는 실수를 담을 수 있다.int[] students 와 같은 배열 변수에는 배열을 담을 수 있다. (배열 변수에는 10, 20 같은 값이 아니라 배열이라는 것을 담을 수 있다)
new int[5] 라고 입력하면 오른쪽 그림과 같이 총 5개의 int 형 변수가 만들어진다.new 는 새로 생성한다는 뜻이고, int[5] 는 int 형 변수 5개라는 뜻이다. 따라서 int 형 변수 5개를 다룰 수 있는 배열을 새로 만든다는 뜻이다.int student1 , int student2 ... int student5 까지 총 5개의 변수를 직접 선언했다. 배열을 사용하면 이런 과정을 한번에 깔끔하게 처리할 수 있다.new int[5] 라고 하면 총 5개의 int 형 변수가 만들어진다. 자바는 배열을 생성할 때 그 내부값을 자동으로0 , boolean 은 false , String 은 null (없다는 뜻이다.)로 초기화 된다.
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. 최종 결과
참조값을 확인하고 싶다면 다음과 같이 배열의 변수를 출력해보면 된다.
System.out.println(students); //[I@4617c264 @앞의 [I는 int형 배열을 뜻한다. @뒤에 16진수
는 참조값을 뜻한다.
배열은 변수와 사용법이 비슷한데, 차이점이 있다면 다음과 같이 [] 사이에 숫자 번호를 넣어주면 된다. 배열의 위치를 나타내는 숫자를 인덱스(index)라 한다.
//변수 값 대입
students[0] = 90;
students[1] = 80;
//변수 값 사용
System.out.println("학생1 점수: " + students[0]);
System.out.println("학생2 점수: " + students[1]);

new int[5] 와 같이 5개의 요소를 가지는 int 형 배열을 만들었다면 인덱스는 0,1,2,3,4 가 존재한다.
여기서 주의해야 할 점이 있는데 인덱스는 0부터 시작한다는 것이다. 배열의 요소를 5개로 생성했지만, 인덱스는 0부터
시작한다. 따라서 사용 가능한 인덱스의 범위는 0 ~ (n-1) 이 된다. 그래서 students[4] 가 배열의 마지막 요소이다.
만약 students[5] 와 같이 접근 가능한 배열의 인덱스 범위를 넘어가면 다음과 같은 오류가 발생한다.
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out
of bounds for length 5 at array.Array1Ref1.main(Array1Ref1.java:14)
배열에 값을 대입하든 배열의 값을 사용하든 간에 일반적인 변수와 사용법은 같다. 추가로 [] 를 통해 인덱스만 넣어주면 된다.
students[0] = 90; //1. 배열에 값을 대입
x001[0] = 90; //2. 변수에 있는 참조값을 통해 실제 배열에 접근. 인덱스를 사용해서 해당 위치의 요소에
접근, 값 대입
students[1] = 80; //1. 배열에 값을 대입
x001[1] = 80; //2. 변수에 있는 참조값을 통해 실제 배열에 접근. 인덱스를 사용해서 해당 위치의 요소에
접근, 값 대입
//1. 변수 값 읽기
System.out.println("학생1 점수: " + students[0]);
//2. 변수에 있는 참조값을 통해 실제 배열에 접근. 인덱스를 사용해서 해당 위치의 요소에 접근
System.out.println("학생1 점수: " + x001[0]);
//3. 배열의 값을 읽어옴
System.out.println("학생1 점수: " + 90);
배열을 사용하면 이렇게 참조값을 통해서 실제 배열에 접근하고 인덱스를 통해서 원하는 요소를 찾는다
자바의 변수 데이터 타입을 가장 크게 보면 기본형과 참조형으로 분류할 수 있다. 사용하는 값을 직접 넣을 수 있는 기본형, 그리고 방금 본 배열 변수와 같이 메모리의 참조값을 넣을 수 있는 참조형으로 분류할 수 있다.
int , long , double , boolean 처럼 변수에 사용할 값을 직접 넣을 수 있는 데이터 타입을 기본형(Primitive Type)이라 한다.int[] students 와 같이 데이터에 접근하기 위한 참조(주소)를 저장하는 데이터배열은 왜 이렇게 복잡하게 참조형을 사용할까? 지금까지 배운 변수처럼 단순히 그 안에 값을 넣고 사용하면 되는 것 아
닐까?
기본형은 모두 사이즈가 명확하게 정해져있다.
int i; //4byte
long l;//8byte
double d; //8byte
그런데 배열은 다음과 같이 동적으로 사이즈를 변경할 수 있다.
int size=10000; //사용자가 입력한 값을 넣었다고 가정해보자.
new int[size]; //이 코드가 실행되는 시점에 배열의 크기가 정해진다.
Scanner 를 사용해서 사용자 입력에 따라 size기본형과 참조형에 대한 내용은 객체를 설명할 때 더 자세히 다룬다. 지금은 기본형과 참조형이라는 2가지 구분이 있다
는 점만 이해하면 충분하다.