본문 바로가기

JAVA/혼자공부하는자바

[JAVA 기초] 자바 배열 4(객체를 참조하는 배열, 배열 복사, 향상된 for문)

728x90

참조 타입 배열

기본 타입이 아닌 참조 타입의 배열은 요소의 값(리터럴)을 저장하지 않고, 객체의 번지를 저장을 한다.

 

예를 들어 String 배열 변수를 선언해보자. (String은 참조 타입 중 클래스에 해당)

String[] strArray = new String[3];
strArray[0] = "Java";
strArray[1] = "Java";
strArray[2] = new String("java");

위와 같이strArray 변수에 3개의 배열 객체를 만들어 대입하고 각 인덱스에 "Java" 문자열을 추가해주면 메모리에 아래 그림처럼 생성이 된다.

이때 0과 1인덱스에서는 힙 영역에 생성된 동일한 "Java" String 객체를 공유하여 참조한다.

2인덱스에서는 new연산자를 사용하여 새로운 "Java" String 객체를 만들었기에 다른 번지에서 생성된 "Java" 객체를 참조하게 된다.

 

 

System.out.println( strArray[0] == strArray[1]);       //true  (번지 비교)
System.out.println( strArray[0] == strArray[2]);       //false (번지 비교)
System.out.println( strArray[0].equlas(strArray[2]) ); //true  (문자열 비교)

여기서 각 객체를 비교하게 되면 인덱스 0과 1은 같은 번지를 참조하고 있어 true를 출력하고

인덱스 0과 2는 서로 다른 번지를 참조하고 있어 false를 출력하게 된다.

하지만 equals 연산자는 번지가 아닌 문자열 그 자체를 비교하게 되어 true를 출력한다.

 


 

배열 복사

배열복사란 기존의 배열을 복사하여 새로운 배열을 만드는 것이다.

  • for문을 이용해서 요소 하나하나를 복사
  • System.arraycopy()를 이용한 복사

위의 2가지 방법이 있다.

 

for문을 이용한 방법

for문 조건문에 length속성을 이용하여 비어있는 newIntArray 배열에 oldIntArray를 복사하여 출력시켰다.

 

 

 

System.arraycopy()를 이용한 방법

System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
                         원본 배열  /  인덱스   /   대상 배열   /  인덱스   /  개수

 

 

배열은 한번 길이가 정해지면 바꿀 수 없기 때문에 추가적인 요소를 저장하려면 배열 복사를 하여 새로운 배열을 만들어야 한다.

String[] oldStrArray = {"java", "array", "copy"};
String[] newStrArray = new String[5]'

위 oldStrArray 배열변수에 추가적인 2개의 요소를 집어넣으려면 아래와 같은 코드를 호출한다.

 

System.arraycopy(oldStrArray, 0, newStrArray, 0 , oldStrArray.length);

첫 번째 인자 : oldStrArray (어떤 배열을 복사할 것인가)

두 번째 인자 : 0 (어디서부터 복사를 할 것인가.

세 번째 인자 : newStrArray (어떤 배열에 붙여 넣을 것인가)

네 번째 인자 : 0 (대상의 배열에 어디부터 붙여 넣을 것인가)

다섯 번째 인자 : oldStrArray.length (몇 개를 복사할 것인가, length속성을 사용하여 원본 배열의 길이만큼 복사)

 

 


향상된 for문

배열에 있는 인자들을 하나 씩 실행해주는 for문이다.

  • 배열이나 컬렉션을 좀 더 쉽게 처리
  • 반복 실행 위해 루프 카운터 변수나 증감식 사용하지 않음

scores 배열에 인자를 하나씩 score 변수에 대입하여 sum에 저장하는 코드이다.

 

평균값 출력 예시 (실수 타입 계산에는 정수를 꼭 double 타입 형 변환 해주는걸 잊지 말자)