객체지향 전까지는 그래도 어느정도 이해 한다고 생각한다. 아니, 생각했었다.
나는 혼자 공부할 때 남궁성 저자의 [자바의 정석]으로 공부를 했고, 학원에서는 신용권 저자의 [이것이 자바다]로 공부를 했다.
[자바의 정석]은 사실 입문자에게 많이 어렵다. 그래서 작년쯤 조금 더 쉽게 쓰여진 책을 내셨고, 그 책은 아직 보지 못했다. 나한테는 [이것이 자바다]라는 쉬운 책이 있기 때문에!
둘 다 커뮤니티가 활성화되어 있어서 편리하다. 카페에서 이해가 가지 않는 부분을 질문하면 저자님이나 다른 이용자들이 댓글로 알려주고, 서로 공부가 되고 참 좋은 것 같다. 하지만 아주아주 기본적인, 사소한 질문을 올리기에 망설여질까 싶어 남궁성 저자님이 초보방이라며 카카오톡 단체 채팅방을 만들어 주셨다. 요즘 자바 공부를 하는 건 아니었지만 질문을 주고받는 사람들을 보면 나도 다시금 공부했던 것을 상기시킬 수 있는 좋은 시스템인것 같다.
최근 배열에 대한 이야기가 나왔는데 아주 새카맣게 잊어버린것이다.
오늘 다시 공부해보고자 [이것이 자바다]를 펼쳤다!
1. dataType[] arrayName; 2. dataType arrayName[];
두 가지 모두 사용이 가능하며 아주 간단한다. 배열변수는 참조변수에 속한다. 배열도 객체이므로 힙 영역에 생성되고, 배열 변수는 힙 영역의 배열 객체를 참조하는 것! 참조할 배열 객체가 없다면 배열 변수는 null 값으로 초기화.
값을 불러올 때에는
arrayName[index];
만약 배열 변수가 없을 때 arrayName[index]로 읽을 경우 NullPointException이 발생한다.
1. dataType[] arrayName = { 값0, 값1, 값2, ... };
2. dataType[] arrayName;
arrayName = new dataType[] { 값0, 값1, 값2, ... };
3. dataType[] arrayName = new dataType[length];
3번은 length만큼의 빈 배열을 생성 후 (new 연산자로 생성할 경우) 데이터 타입에 맞게 초기화하는 것이다. int 타입의 배열이라면 각 값이 '0'으로, String 타입의 배열이라면 'null'값으로 초기화된다.
arrayName.length;
주로 for문에서 사용할 수 있다. 배열의 길이를 모르더라도 배열을 가지고 연산할 때 반복문을 배열의 길이만큼 실행해야한다면, for(i=0; i<arrayName.length; i++) { 실행할 반복문; } 과 같이 작성하면 된다.
기본 타입 8가지 배열은 각 항목에 직접 값을 가지고 있지만, 참조 타입(클래스, 인터페이스) 배열은 각 항목에 객체의 번지를 가지고 있다. 예를 들어 String은 클래스 타입이므로 String[] 배열은 각 항목에 문자열이 아니라, String 객체의 주소를 가지고 있다. 즉, String 객체를 참조하게 된다.
따라서 String[] 배열의 항목도 결국 String 변수와 동일하게 취급해야 한다. 예를 들면, ==를 사용하는 것은 번지를 비교하는 것이고, 각 문자열 비교를 위해 equals()를 사용해야 한다는 점!
String[] strArray = new String[3];
strArray[0] = "Java";
strArray[1] = "Java";
strArray[2] = new String("Java");
strArray[0]==strArray[1]; // true (같은 객체 참조)
strArray[0]==strArray[2]; // false (다른 객체 참조)
strArray[0].equals(strArray[2]); // true (같은 문자열)
이건 그림으로 보아야 이해할 수 있는 문장인듯 하다. 아직도 어렵다.....
그러니까 위 코드를 실행하면, String 타입의 배열 객체가 있고, length는 3이다.
Java라는 String 객체가 두 개가 생긴다.
1번지, 2번지라고 했을 때
strArray[0], strArray[1] 은 1번지의 String객체인 Java를 참조하고,
strArray[2] 는 2번지의 String객체인 Java를 참조한다.
이건 예전에 본건데... 얘네는 메모리를 줄이는 방향으로 움직이기 때문에
배열 0을 선언하고 같은 문자열인 1을 선언했을 때 또 다른 객체를 생성하고 참조하는 게 아닌 이전에 있는 번지를 저장한다. 그리고 2를 선언할 때에는 new 연산자를 사용했기 때문에 반드시 새로운 번지의 새로운 객체가 생성되는 것!
확실한 정보가 아니기 때문에 이건 추후 알아보고 수정할 예정
새로운 배열을 만들고, for문을 사용해 각각 대입해주어도 되지만,
System.arraycopy(1,2,3,4,5) 라는 메소드가 있다.
이거 정말 편리하다!
for문의 조건식에 들어가는 배열은 많이 줄여서 쓸 수 있다.
for(int i=0; i<array.length; i++) {
int sum+=array[i];
}
를 어떻게 쓸 수 있냐면
for(int i:array) {
int sum+=i;
대빵짧음ㅋ