본문 바로가기

프로그래밍/Java 프로그래밍

자바의 배열과 향상된 for문

저번 포스팅에서 기본 타입에 대한 배열을 살펴봤습니다. 이번에는 참조 타입에 대한 배열에 대해 살펴보겠습니다.



객체를 참조하는 배열


기본 타입(byte, char, short, int, long, float, double, boolean) 배열은 각 항목에 직접 값을 갖고 있지만, 참조 타입(클래스, 인터페이스) 배열은 각 항목에 객체의 번지를 가지고 있습니다. 이것은 참조 타입이 주소를 가지고 있던 것과 마찬가지입니다. 예를 들어 String은 클래스이므로 String[] 배열은 각 항목에 문자열이 아니라, String 객체의 번지를 가지고 있습니다. 예를들어 살펴보도록 하겠습니다.


String[] strArray = new String[3];

strArray[0] = "Java";

strArray[1] = "C++";

strArray[2] = "C#";


위 코드는 배열 변수 strArray를 선언하고 3개의 문자열을 참조하는 배열을 생성합니다. String 타입을 참조하는 3개의 배열을 가진다는 뜻은 각각의 배열 값이 String 타입 형태를 가지고 있다는 뜻이고, 이는 String 타입이 힙영역에 객체를 생성하고 참조변수에 그 주소를 가지고 있는 것처럼 각 배열의 항목 값이 String 변수의 주소를 가지고 있다는 얘기입니다. 단순히 기본타입은 크기를 알기때문에 스택영역에 생성하고 값을 가지고 있는 것에 반해 참조 타입은 힙영역에 생성하고 그 주소를 가지고 있다고 이해하시면 됩니다. 




위의 프로그램에서는 두가지 방법으로 String 배열을 선언했습니다. 첫번째 생성법은 new 생성 연산자를 이용해서 String 배열을 생성하고나서 값을 대입했습니다. 첫번째와 두번째는 그냥 "Java" 문자 리터럴을 대입했고 세번째는 new 생성연산자를 이용해 값을 대입했습니다. JVM은 스스로 메모리를 관리합니다. 좀 더 효율적으로 관리하기위해 "Java"라는 리터럴을 다시 생성하지 않고 strArray[0]과 strArray[1]에 같은 주소를 대입하여 메모리를 효율적으로 관리합니다. 그래서 strArray[0] == strArray[1]의 결과가 true가 나옵니다. 하지만 세번째는 new 생성연산자를 이용해서 값을 대입했기 때문에 새로운 메모리를 할당하게되고 그래서 strArray[0] == strArray[2]의 결과가 false가 나오게 됩니다. 하지만 equals 메소드를 사용하면 주소가 아닌 값을 비교하기 때문에 true가 나오게 됩니다. 두번째 생성 방법인 값을 초기화하면서 생성한 경우는 전부 같은 주소를 갖게 되어 모두 true가 됩니다. 같은 주소를 가지던 아니던 값을 비교하려면 equals 메소드를 사용해야합니다.



배열 복사


배열은 한번 생성하면 크기를 변경할 수 없기 때문에 더 많은 저장공간이 필요하다면 더 큰 배열을 새로만들고 이전 배열로부터 항목 값들을 복사해야 합니다. 배열 간의 항목 값들을 복사하려면 for문을 사용하거나 System.arraycopy() 메소드를 사용합니다.




길이가 3인 배열에서 길이가 5인 배열로 복사하는 프로그램입니다. oldIntArray에 있는 모든 값을 복사한 뒤 newIntArray값을 출력하면 복사되지 않은 부분은 0으로 출력되는 것을 볼 수 있습니다. 이는 정수는 0으로 초기화되기 때문입니다. 길이가 제한되는 배열의 단점때문에 자바에서는 List 타입같은 다른 자료형(Collection)들도 준비되어있습니다.



향상된 for문


자바는 배열이나 컬렉션을 좀 더 쉽게 처리하기 위해 향상된 for문을 제공합니다. 향상된 for문은 반복 실행을 하기 위해 루프 카운터 변수와 증감식을 사용하지 않습니다. 예제를 통해 살펴보도록 하겠습니다.



향상된 for문은 초기식, 조건식, 증감식이 없습니다. 그냥 배열과 같은 타입의 변수를 선언하고 그 변수에 값이 차례대로 처음부터 끝까지 대입되는 것입니다. 이는 앞으로 배우게될 컬렉션에서도 똑같이 적용됩니다. 정수타입의 배열이기 때문에 for문 안에 정수형 변수를 선언하고 ":"과 배열을 타나나게 됩니다. 향상된 for문과 일반 for문은 같이 쓰일 수 있는 경우가 많이 있는데 컬렉션에서는 향상된 for문을 사용하기를 권장합니다.

'프로그래밍 > Java 프로그래밍' 카테고리의 다른 글

자바 클래스  (0) 2020.07.06
자바의 열거타입  (0) 2020.07.05
자바의 배열  (0) 2020.07.03
자바 참조 타입과 참조변수  (0) 2020.07.02
자바 반복문  (0) 2020.07.01