배열
- 배열은 같은 타입의 값만 관리한다.
- 배열의 길이는 늘리거나 줄일 수 없다.
- 타입 [ ] 변수 형태로 선언하는게 관례이다.
ex) Int[ ] intArray;
배열은 참조 변수이다. 배열도 객체이므로 힙 영역에 생성된다. 배열 변수는 힙 영역의 배열 참조 주소를 저장한다.
참조할 배열이 없다면 null로 초기화할 수 있다. (Null이기 때문에 null인 값을 참조하면 npe가 발생한다)
값 목록으로 배열 생성
타입[] 변수 = {1, 2, 3, 4, 5} 형식으로 간단하게 배열을 생성할 수 있다.
중괄호는 나열된 값들을 항목으로 가지는 배열을 힙에 생성하고 주소를 리턴한다.
배열 변수를 미리 선언한 후에는 값 목록을 변수에 대입할 수 없다.
타입[] 변수;
변수 = { 값0, 값1, 값2, 값3, …}; // 컴파일 에러
선언 이후에 대입을 해줘야 할 경우 new 타입[]을 사용한다.
String[] names = null;
names= new String[] { “김성현”, “바보”, “멍청이” };
메소드의 매개변수가 배열 타입일 경우에도 마찬가지로 new 타입[] 을 사용해야한다.
// 올바른 메소드 호출
printItem (new int[] {95, 85, 90);
New 연산자로 배열 생성
- 값의 목록은 (중괄호에 들어있는 데이터) 없지만 향 후에 값을 저장할 목적으로 배열을 미리 생성할 수 있다.
int[] intArray = new int[5];
New 연산자로 다차원 배열 생성
- 배열 변수 선언 시 타입 뒤 대괄호 [] 를 차원 수만큼 붙이고, new 타입 뒤에도 차원 수만큼 대괄호 []를 작성하면 된다.
int[][] scores = new int[2][3];
(두 반의 학생 점수들을 저장하는 2차원 배열의 길이는 모두 3이고, 정수타입이므로 0으로 초기화된다.)
만약 두 반의 학생 수가 다를경우 2차원 배열의 길이를 다르게 줄 수 있다.
1차원 배열의 길이를 2로 배열 객체를 우선 생성하고, 각각의 항목 값으로 길이가 다른 2차원 배열을 대입한다.
int[][] scores = new int[2][];
scores[0] = new int[3];
scores[1] = new int[2];
객체를 참조하는 배열
기본 타입 배열 (int, double, long, boolean 등등)은 각 항목에 값을 직접 저장하지만, 참조 타입 배열은 객체의 번지를 저장한다.
(힙 영역에 있는 참조값을 저장한다.)
String[] strArray = new String[3];
strArray[0] = "Java";
strArray[1] = "C++";
strArray[2] = "C#";
참조 타입 변수는 항상 객체의 참조값을 저장한다는것을 기억하자.
==, != 연산자를 사용하면 배열 항목이 참조하는 객체가 같은 객체인지 확인할 수 있다.
문자열을 비교할 땐 equals( ) 메소드를 사용한다.
String[] languages = new String[3];
languages[0] = "Java";
languages[1] = "Java";
languages[2] = " new String("Java");
System.out.println(languages[0] == languages[1]); // true : 참조값 비교
System.out.println(languages[0] == languages[2]); // false : 참조값 비교
System.out.println(languages[0].equals(languages[2])); // true : 문자열 비교
배열 복사
배열을 한번 생성하면 길이를 변경할 수 없다. 더 많은 저장공간이 필요하다면 더 큰 길이의 배열을 새로 만들고
이전 배열을 복사해야 한다.
가장 기본적인 복사 방법은 for문을 돌려서 하나씩 읽고 배열에 저장하는 방법이 있다.
package ch05.sec09;
public class ArrayCopyByForEx {
public static void main(String[] args) {
//길이 3인 배열
int[] oldIntArray = {1, 2, 3};
int[] newIntArray = new int[5];
for (int i = 0; i < oldIntArray.length; i++) {
newIntArray[i] = oldIntArray[i];
}
}
}
3, 4 인덱스는 배열의 초기값 0이므로 출력값은 1,2,3,0,0 이 나온다.
조금 더 간단한 방법은 System의 arraycopy( ) 메소드를 사용하는 방법이다.
package ch05.sec09;
public class ArrayCopyEx {
public static void main(String[] args) {
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문을 빠져나간다.
iter 을 입력하면 향상된 for 문이 자동입력된다.
package ch05.sec10;
public class AdvancedForEx {
public static void main(String[] args) {
int[] scores = {95, 71, 84, 93, 87};
int sum = 0;
for (int score : scores) {
sum += score;
}
System.out.println(sum);
double avg = (double) sum / scores.length;
System.out.println(avg);
}
}
배열 부분을 복습했다. 아직 코드로 배열을 입력하는게 익숙하지 않아 알고리즘 문제를 풀 때 헷갈리는 부분이 많다.
배열문제를 계속 풀면서 학습을 해야겠다
'Java' 카테고리의 다른 글
이것이 자바다 - 클래스 (0) | 2024.06.19 |
---|---|
이것이 자바다 - 열거(Enum) 타입 (0) | 2024.06.17 |
다형성(3) - OCP (0) | 2024.06.13 |
다형성 (2) - 추상클래스, 인터페이스 (0) | 2024.06.12 |
다형성 (캐스팅, 메서드 오버라이딩) (1) | 2024.06.10 |