본문 바로가기
Work & Study/JAVA (& 혼공자Java)

자바(Java) - 배열3

by a.k.a DUKI 2020. 9. 22.
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문

배열이나 컬렉션을 좀 더 쉽게 처리 할 수 있다. (컬렉션은 나중에 설명하도록 한다.)

반복 실행을 위해 루프카운터 변수나 증갑식을 사용하지 않는다.

  1. for문이 처음 실행될 때 배열(1)에서 가져올 천 번째 값이 존재하는지 평가
  2. 가져올 값이 존재하면 해당 값을 변수(2)에 저장
  3. 실행문(3)을 실행
  4. 블록 내부의 실행문(3)이 모두 실행되면 다시 루프를 돌아 배열(1)에서 가져올 다음 값이 존재하는지 평가
  5. 다음 항목이 존재하면 (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
반응형