주인장의 프로그래밍 개발 공부방

[Chapter 5 배열] 6-1. (심화) 객체 배열과 가변 배열 본문

프로그래밍 기본 지식/Chapter 5 배열

[Chapter 5 배열] 6-1. (심화) 객체 배열과 가변 배열

거신 2019. 9. 3. 09:05

지금까지 배열의 전반적인 내용과

1차원 배열, 2차원 배열 등 다양한 배열에 대해서 알아보았다.

이번 시간에는 똑같은 배열이지만 구조적으로 조금 더 복잡한

심화내용을 다뤄보려고 한다.

 

목표 : 객체 배열과 가변 배열에 대해서 이해할 수 있다.

 

1. 객체 배열

 

우리는 지금까지 소스 코드 등을 자바를 기반으로 공부하고 있었지만

정작 객체지향 프로그래밍에서 객체라는 것을 제대로 공부하지 않았기 때문에

객체가 도당체 무엇인지 알 수가 없을 것이다.

하지만 지금은 객체가 무엇인지 이해하려 하지말고 일단 배열이라는 것에 초점을 맞추길 바란다.

이 다음에 배울 객체에서 제대로 알아볼테니 조급한 마음은 잠시 접어두자.

 

일단 객체 배열이라는 것은 배열은 배열이지만

배열의 각 방에 담겨있는 것들이 객체라는 것이다.

우리는 지금까지 1차원 배열, 2차원 배열을 공부하면서

배열의 방에 무엇이 저장되어 있어야 하는지에 대해서 너무나 잘 알고 있을 것이다.

가령 int[] 라는 배열타입이 있다면

이 배열에는 int타입의 값만 저장된다는 것을 말하는 것 자체가 에너지 낭비일 것이다.

그만큼 너무나 당연하게 알고 있을텐데

여기에선 int가 객체로 바뀐 것 뿐이다.

 

그러니까 쉽게 말해 알맹이만 다른 것이지 겉에 보이는 형태는 결국 똑같다는 것이다.

그렇다면 객체는 뭐가 다르길래 알맹이가 다르다는 것일까?

 

일단 예시부터 살펴보자.

 

예시1)

String str = new String();

 

지금 필자는 객체라는 것을 만들었다.

정확히는 객체의 인스턴스를 생성한 것인데 어디서 많이 본 것 같지 않은가?

초반에 변수를 배우면서 참조형 변수에 등장했던 String이라는 녀석이다.

이 녀석이 바로 대표적인 객체가 되겠다.

 

그래서 우리가 이전에 잠시 맛만 봤던

 

String[] strArr = new String[] {};

 

이 녀석이 여기에서 등장할 수 있는 것이다.

 

앞서 얘기한 것과 연관지어 보자면 당연히 String[] 타입의 배열 안에는 String 타입의 값만 들어갈 수 있다는 뜻이되고

조금 더 자세하게 말해보자면

 

그림1)

그림과 같이 배열 안에 new String()이라는 객체 인스턴스들이 자리잡고 있는 형태가 되는 것이다.

 

이렇게 배열 안에 객체가 자리하고 있는 배열을 객체 배열이라고 한다.

 

예시로 대표적인 객체인 String으로 예를 들었지만 String 이외에도 Object, Calendar, File, 사용자 정의 클래스 등의

다양한 객체들도 물론 가능하다.

그리고 객체들의 가장 최상위 클래스인 Object로 배열을 생성한다면 배열의 요소를

다양한 객체들로 넣을 수도 있다는 것도 미리 알아두면 도움이 될 것이다.

 

참고로 이전에도 언급했었지만 메모리 구조에서 봤을 때 객체 배열2차원 배열과 매우 비슷한 구조로 되어 있지만

각 요소에 담겨져 있는 객체의 인스턴스는 배열이 아니기 때문에 1차원 배열이 맞는 말이라고 할 수 있다.

 

객체 배열은 기본적으로

String[] strArr = new String[] {};

의 형태로 선언할 수 있고

 

String[] strArr = new String[3];

처럼 크기를 지정해 초기화하거나

 

String[] strArr = {"A", "BC", "DEF"};

와 같이 바로 값을 넣어 초기화하는 방법도 가능하다. 

 

여기에서 주의할 부분은 선언과 동시에 값을 넣어 초기화하는

String[] strArr = {"A", "BC", "DEF"};

의 경우에는 배열을 초기화할 때 가능하고

 

String[] strArr = new String[3];

strArr = {"A", "BC", "DEF"};

처럼 배열 선언 후 할당할 경우에는 두 번째 줄에서

"Array constants can only be used in initializers"

"배열 상수는 오직 초기화에만 사용할 수 있습니다."

라는 에러메시지를 만날 수 있다.

이 부분은 우리가 객체라는 개념을 배우게 되면 이해할 수 있는 부분이기에

지금은 저렇게는 사용할 수 없구나라고만 이해하고 넘어가길 바란다.

 

따라서 위의 경우에는

strArr = new String[] {"A", "BC", "DEF"};

new 연산자를 이용해 인스턴스를 생성하면 해결이 가능하다.

여기서 조금 더 자세하게 풀어보면

 

new String[] {"A", "BC", "DEF"};

new String[] {new String("A"), new String("BC"), new String("DEF")};

라는 것을 유추할 수 있을 것이다.

결과적으로 배열 안에 객체 인스턴스가 담겨있는 객체 배열이란 것을 알 수 있다.

 

6-2에서 계속

Comments