728x90
반응형
객체를 참조하는 배열
기본 타입 배열은 각 항목에 직접 값을 갖고 있지만,
참조 타입 배열은 각 항목에 객체의 번지를 갖고 있다.
배열 예시1)
String은 클래스이므로 String객체의 번지를 가지고 있다.
//String[] 배열은 String 객체를 참조하게 된다.
Stirng[] strArray = new String[3];
strArray[0] = "홍길동";
strArray[1] = "김길동";
strArray[2] = "이길동";
String[] 배열의 항목도 String변수와 동일하게 취급 되어야 한다.
String[] 배열 항목간에 문자열을 비교하기 위해서는 == 연산자가 아닌 equals()메소드를 사용해야 한다.
== 는 개체 번지를 비교하기 때문에 문자열을 비교하는데 사용할 수 없다.
Stirng[] strArray = new String[3];
strArray[0] = "홍길동";
strArray[1] = "김길동";
strArray[2] = new String("이길동");
System.out.println(strArray[0] == strArray[1]); //true (같은 객체 참조)
System.out.println(strArray[0] == strArray[2]); //false (다른 객체 참조)
System.out.println(strArray[0].equals(strArray[2])); //true (문자열이 동일)
배열 복사
배열은 한 번 생선하면 크기를 변경할 수 없기 때문에 더많은 저장 공간이 필요하다면 더 큰 배열을 새로 만들고 이전 배열로 부터 항목 값들을 복사해야한다.
배열 간의 항목 값들을 복사하려면 for문을 사용하거나, System.arraycopy() 메소드를 이용한다.
배열 예시2) for문을 이용한 배열 복사
int[] oldArray = {1,2,3};
int[] newArray = new int[5];
for(int i=0; i<oldArray.length; i++) {
newArray[i] = oldArray[i];
}
for(int i=0; i<newArray.length; i++) {
System.out.print(newArray[i] + ", ");
}
빈 공간에는 값이 없으므로 초기 값인 0이 유지 된다.
배열 예시3) System.arraycopy() 메소드를 이용한 배열 복사
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
// Object src : 원본 배열
// int scrPos : 원본 배열에서 복사할 항목의 시작 인덱스
// Object dest : 매개값은 새 배열
// int destPos : 새 배열에서 붙여넣을 시작 인덱스
// int length : 복사할 개수
System.arraycopy(arr1, 0, arr2, 0, arr.length);
// arr1 : 원본 배열
// 0 : 원본 배열에서 어디서 부터 복사할 것인가.
// arr2 : 새 배열
// 0 : 대상 배열을 0 부터 복사
// arr1.length : arr1이 갖고있는 배열 갯수 만큼 복사
( 아. 어렵다. )
배열 예시4) System.arraycopy() 메소드를 이용한 배열 복사
String[] oldArray = {"java", "array", "string"};
String[] newArray = new String[5];
System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
for(int i = 0; i<newArray.length; i++) {
System.out.print(newArray[i] + ", ");
}
빈 공간에는 값이 없으므로 초기 값인 null이 채워진다.
참조 타입 배열이 복사되면 복사되는 값이 객체의 번지 이므로 새 배열의 항목은 이전 배열의 항목이 참조하는 객체와 동일 하다.
향상된 for문
배열이나 컬렉션을 좀 더 쉽게 처리 할 수 있다. (컬렉션은 나중에 설명하도록 한다.)
반복 실행을 위해 루프카운터 변수나 증갑식을 사용하지 않는다.
- for문이 처음 실행될 때 배열(1)에서 가져올 천 번째 값이 존재하는지 평가
- 가져올 값이 존재하면 해당 값을 변수(2)에 저장
- 실행문(3)을 실행
- 블록 내부의 실행문(3)이 모두 실행되면 다시 루프를 돌아 배열(1)에서 가져올 다음 값이 존재하는지 평가
- 다음 항목이 존재하면 (2) -> (3) -> (1) 순서로 루프를 다시 진행, 없으면 for문이 종료
for문의 반복 횟수는 배열의 항목 수가 된다.
for문 예시4)
int[] scores = { 90, 92, 88, 91, 100, 82 };
int sum = 0;
for (int score : scores) {
sum = sum + score; // 실행문
}
System.out.println("점수 총합: " + sum);
double avg = (double) sum / scores.length;
System.out.println("점수 평균: " + avg);
※용어 정리
- 향상된 for문: for(타입 변수 : 배열) { ... }
- 반복 실행을 하기 위해 루프 카운터 변수와 증감식을 사용하지 않는다.
- 배열의 항목 개수만큼 반복하고, 자동적으로 for문을 종료
- 반복할 때 마다 변수에는 배열에서 가져온 항목이 저장된다.
본 내용은 #혼자공부하는자바 책을 참고해 공부하려 작성했습니다.
728x90
반응형
'Work & Study > JAVA (& 혼공자Java)' 카테고리의 다른 글
자바(Java) - 객체 지향 프로그래밍1 (0) | 2020.09.23 |
---|---|
자바(Java) - 열거 타입 (0) | 2020.09.23 |
자바(Java) - 배열2 (0) | 2020.09.22 |
자바(Java) - 배열1 (0) | 2020.09.21 |
자바(Java) - 참조 타입과 참조 변수2 (0) | 2020.09.20 |