반복문과 그 중첩, 여기에 배열까지.. 조합해서 쓰기에 너무 좋은 문법들이다.
그렇기 때문에 여러 날에 걸쳐 진도를 나가고 예제 풀이에 시간을 많이 투자한다.
배열의 길이
배열의 길이는 0을 포함한 양의 정수로 표현된다.
배열의 길이가 0이라는 것은 0칸짜리 배열 즉, 값을 저장할 공간이 하나도 없이 주소만 가진 배열을 의미한다.
언뜻 만들 필요조차 없는 배열이라 느껴질수 있지만 후에 배울 내용에 필요하니 길이가 0인 배열이 있을수 있다는 정도만 알아두자.
int[] score = new in[5]; 이런 배열을 만들었을 때, 이 길이를 보고자 한다면 score.length 를 쓰면 된다.
이때, 문자열의 길이를 확인할 때 사용하는 str.length() 과는 달리 ()가 들어가지 않음에 주의하자.
배열의 길이는 수정이 불가능한 상수인데, 경우에 따라 추가적인 칸이 필요할 때가 있다.
이때 배열의 길이를 늘리게 되는데 이는 정확히 말하면 기존의 배열보다 길이가 긴 배열을 새로 생성한 후 값을 복사해서 넣는 것이다.
아래에서 설명을 따로 하겠지만, 배열의 길이가 불필요하게 길 경우 쓸데없이 메모리만 차지하게 되므로 배열의 길이를 늘릴때는 일반적으로 기존 배열의 2배크기로 한다.
배열은 따로 초기화해주지 않아도 타입에 따라 기본값이 우선 들어가 있는다고 배웠는데, 기본값이 아닌 다른 값으로 초기화하는 간단한 방법도 있다.
예를들면 int[] score = new int[] { 10, 20, 30, 40, 50 }
이는 생성과 동시에 값을 넣은것이다. 또한 이 경우 생략이 가능한 부분들이 있는데,
위는 int[] score = { 10, 20, 30, 40, 50 }와 같고
또한 score = new int[] { 10, 20, 30, 40, 50 }과도 같다.
주의할 점은 이런 식으로 했을시엔 대괄호 안에 배열의 길이를 명시해서는 안된다.
또한 배열에서는 score = new int[] { 10, 20, 30, 40, 50, } 맨 뒷부분에 ,가 추가적으로 있다고 해도, 줄이바뀐다 해도 오류가 발생하지 않는다. 이는 코드짜기에 수월하므로 배열에서만 가능한 문법이다.
for문을 배울 당시 향상된 for문을 지나쳤었는데 다시 돌아가 보면 배열 내부의 값을 얼마나 쉽게 볼 수 있는지 확인해볼수 있다.
실제로 출력해보면 같은 값이 나오고, 위의 for문보다 코드자체가 훨씬 짧다는 것을 알수있다.
하지만 배열의 값을 순차적으로 변수에 넣어 그를 출력하는 것이므로 특정 칸의 배열의 값을 바꾸는 것은 불가능하다.
위의 주석에 메모해 놓았듯이, 향상된 for문은 그저 배열을 하나씩 순회해서 나온 결과를 변수에 할당하여 출력해보일 뿐이다.
단순히 이 목적으로 for문을 사용한다면 향상된 for문을 사용하는 것이 가독성면에서도 더 좋다는 것을 알아두면 된다.
또한 단순히 배열 안의 값을 출력하는 것이 목적이라면 Arrays.toString(배열의이름) 를 이용하면 훨씬 보기좋게 출력된다.
추가로 어제 나왔던 JVM이 쓰레기 메모리를 자동으로 수거해 간다 했는데 이를 System.gc(); 이런 식으로 직접 호출할 수도 있다.
위의 예제는 배열의 확장을 보여주고 있다. 빈 배열을 새로 생성해 값을 옮기는 작업이다.
이때에도, 변경 전과 변경 후의 배열 값과 그 길이가 궁금한 것이라면 앞서 설명한 Array.toString()을 사용하면 보기에 편하다.
변경전 System.out.println(Array.toString(arr)); 를 해보면 [ 1, 2, 3, 4, 5 ] 이렇게 출력될 것이고
변경후엔 [ 1, 2, 3, 4, 5, 0, 0, 0, 0, 0 ] 로 출력될 것이다.
배열을 복사하는 데에는 위와같은 방법도 있다.
System.arraycopy를 이용하면코드의 길이 자체가 짧아질 뿐만 아니라 여러 조건들도 첨부할 수 있다.
구조는 System.arraycopy(src, srcPos, dest, destPos, length); 이렇게 되어 있는데 각 구간에 대한 설명을 보면 이보다 간단할 수가 없다.
src = source를 의미하며 이는 원시를 뜻한다. 즉 원본 배열을 의미한다.
srcPos = source position을 의미하며 이는 원본 배열의 위치, 즉 복사할 원본의 시작 index를 의미한다.
dest = destination을 의미하며 종착지, 즉 복사해서 값이 들어갈 배열을 의미한다.
destPos = destination position을 의미하며 종착지 배열의 위치, 즉 값이 들어갈 배열의 시작 index를 의미한다.
length = 길이를 뜻하며 복사할 원본 배열에서 srcPos부터 시작해 length만큼의 길이를 복사한다는 의미이다.
이는 배열의 각 요소들이 연속적으로 저장되어 있다는 배열의 특성때문에 이렇게 처리하는 것이 가능한 것이다.
이 뜻들을 알고 나면 위의 예제에서의 출력내용을 이해할 수 있다.
기본적으로 int타입의 값이 들어가는 배열의 경우 int타입이 4바이트크기이기 때문에 그 용량을 알수있다.
int[] score2 = new int[1_000_000_000]; 이런 배열이 필요할 일이 거의 없겠지만 만들어 보면, 이 배열의 크기는 4000000000byte, 4000000Kb, 4000Mb, 4Gb 즉 4Gb나 되는 메모리공간을 차지하는 배열이 된다.
eclipse에서 직접 생성해보면 살짝 버벅이는 것을 확인할 수 있다.
이부분은 JVM의 효율과 성능이랑 관련이 있는데 이는 eclipse가 깔려있는 폴더에서 확인할 수 있다.
eclipse.ini라는 파일을 우클릭하고 편집을 눌러 메모장으로 열어보면 밑에쪽에 Xms와 Xmx가 있는데 이부분이 JVM의 효율 및 성능을 의미하며 컴퓨터 사양이 좋다면 이부분을 수정해 그 기능을 올릴수도 있다.
기본적으로 하얀 바탕에 검은 글씨보다 검은 바탕에 하얀 글씨가 눈의 피로도가 훨씬 낮다.
하지만 우리가 사용하는 eclipse나 메모장은 기본적으로 하얀바탕에 검은글씨이다.
앞으로 엄청나게 많이 쓰게 될테니 눈건강을 위해 eclipse의 설정을 바꿔보았다.
상단의 메뉴에서 windows -> preferences 로 들어간 후
Appearance를 클릭해 보면 Theme를 정할 수 있다. 기본적으로는 Light가 설정되어 있을텐데,
이를 Dark로만 바꿔주어도 눈의 피로도가 훨씬 줄어든다.
다양한 디자인들이 있는데 이는 help 메뉴에서 eclipse marcketplace로 들어가 다운받아 사용할 수 있다.
꿀팁하나!
scanner를 사용했을때 패키지 바로 아래에 import java.util.*; 을 쓴것을 기억할 것이다.
이는 java.util이라는 패키지 안의 모든것을 호출한 것인데 배열을 사용할 때는
import java.util.Arrays; 를 해주어야 한다.(자동으로 붙기도 하지만.. 없으면 컴파일 에러)
만약 이부분이 없다면, 기억도 나지 않는다면 Ctrl + shift + o를 눌러주면 자동소환된다.
오늘은 여기까지!!
아직까지도 코드를 어설프게 그것도 엄청 간단한 코드를 짜는 감자정도에 불과하다.
싹틔울날을 고대하며.. 지치지말자