배열은 같은 타입의 데이터를 연속된 공간에 나열하고 각 데이터에 인덱스(index)를 부여해놓은 자료구조.
배열을 선언하는 방법은 두 가지 있다.
1. 타입[] 변수; 2. 타입 변수[];
타입은 배열에 저장될 데이터의 타입(int
, double
, String
)이다.
값 목록을 이용하거나 new
연산자를 이용하는 방법이 있다. 배열안에 넣어줄 값이 이미 있으면
타입[] 변수 = {0, 1, 2, ...};
이렇게 생성이 가능하다. 주의할 점은 이미 배열변수를 선언한 후에는 다른 실행문에서 중괄호를 사용한 배열생성이 불가능하다.
타입 [] 변수;
변수 = {0, 1, ,2, ...} //컴파일에러발생
변수를 미리 선언한 후 나중에 값을 넣어줘야할때는 new
연산자를 사용해 값을 넣어주면된다.
변수 = new 타입[]{0, 1, 2, ...};
배열의 길이란 배열에 저장할 수 있는 값의 개수를 말한다
코드에서 배열의 길이를 얻으려면 length
를 사용하면 된다.
int[] intArray = {1, 2, 3};
int num = intArray.length; // num은3
값들이 행과 열로 구성된 배열을 2차원 배열이라고 한다. 2차원 배열은 수학의 행렬과 비슷하다 자바는 2차원 배열을 중첩배열 방식으로 구현한다 2x3 행렬을 만들기 위해 다음 코드를 사용한다.
int[][] scores = new int[2][3];
해당 배열의 길이를 같이 구해보면 다음과 같다.
scores.length; //2(scores의 길이)
scores[0].length; //3(scores[0]의 길이)
scores[1].length; //3(scores[1]의 길이)
int[][] scores = {{95, 80}, {92, 96}};
scores배열의 길이는 2이다. scores[0]
은 {95, 80}배열을 참조 scores[1]
은 {92, 96}배열을 참조한다. 위 코드에서 생성된 scores배열의 항목 값은 다음과 같다.int score = scores[0][0]; //95
int score = scores[0][1]; //80
int score = scores[1][0]; //92
int score = scores[1][1]; //96
기본타입 배열은 각 항목에 직접 값을 가지고 있지만 참조타입 배열은 각 항목에 객체의 번지를 가지고 있다 예를 들어 String
은 클래스라서 String[]
배열은 각 항목에 문자열이 아니라 String
객체의 번지를 가지고 있다. 즉 String[]
배열은 객체를 참조하게 된다.
따라서 String[]
배열의 항목도 String
변수랑 동일하게 취급된다.
String[]
배열 항목 간에 문자열을 비교하기 위해서는 ==
연산자 대신 equals()
메소드를 사용한다. ==
은 결국 객체의 번지를 비교하기 때문에 문자열 비교에는 사용할 수 없다.
String[] strArray = new String[3];
strArray[0] = "java";
strArray[1] = "java";
strArray[2] = new String("java");
strArray[0] == strArray[1] //true(같은객체참조)
strArray[0] == strArray[2] //false(다른객체참조)
strArray[0].equals(strArray[2]) //true(문자열이동일)
배열은 한 번 생성하면 크기를 변경할 수 없다. 때문에 더 많은 공간이 필요하다면 더 큰배열을 생성하고 이전 배열로부터 항목 값들을 복사해야한다 배열값을 복사하는 방법은 2가지다.
for문으로 배열복사
int[] oldIntArray = {1, 2, 3};
int[] newIntArray = new int[5];
for(int i = 0; i < oldIntArray.length; i++){
newIntArray[i] = oldIntArray[i];
}
for(int i = 0; i < newIntArray.length; i++){
System.out.print(newIntArray[i] + ", ");
} //출력결과 : 1, 2, 3, 0, 0
복사되지 않은 newIntArray[3]
,newIntArray[4]
항목은 초기값인 0으로 유지된다.
String
의 경우에는 초기값인 null
이 유지된다.
참조타입이 복사되면 복사되는 값이 객체의 번지이므로 복사하기전과 참조하는 객체가 동일.
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
src
: 원본배열
srcPos
: 원본배열 시작 인덱스
dest
: 새 배열
destPos
: 새 배열 시작 인덱스
length
: 복사할 개수
String[] oldStrArray = {"java", "array", "copy"};
String[] newStrArray = new String[5];
System.arraycopy( oldStrArray, 0, newStrArray, 0, oldStrArray.length);
for(int i = 0; i < newStrArray.length; i++){
System.out.print(newStrArray[i] + ", ");
}
자바는 배열이나 컬렉션을 더 쉽게 처리하기 위해 향상된 for문을 제공한다.
향상된 for문은 루프 카운터 변수와 증감식을 사용하지 않는다.
for( 타입변수 : 배열 ){
실행문;
}
따라서 for문의 반복 횟수는 배열의 항목 수가 됩니다.
열거타입은 한정된 값인 열거상수중에서 하나의 상수를 저장하는 타입이다.
한정된 값의 예로는 월,화,수,목,금,토,일 이라는 7개의 값을 가지는 요일이 있다.
Week.java
MemberGrade.java
선언은 public enum
으로한다.public enum 열거타입이름 { ... }
public enum Week{MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY};
열거상수가 여러단어로 구성될 경우에는 언더바_
로 연결해준다. 열거타입을 선언하는방법은 열거타입 변수;
이다.
Week today;
Week reservationDay;
열거타입을 변수를 선언했으면 다음과 같이 열거상수를 저장할 수 있다.
Week today = Week.SUNDAY;
열거타입 변수도 참조타입이기 때문에 null
값도 저장가능하다.
Week birthday = null;