안녕하세요 길벗수험서 운영팀입니다.
먼저 배열 클래스의 length() 함수는 마지막 주소값이 아닌 배열의 전체 길이를 포함합니다.
즉 0~11 까지 있는 배열 요소 주소의 마지막인 11이 아니라, 0~11의 총 12개의 배열 요소를 갖고 있다는 의미의 길이이기 때문에 11이 아닌 12를 반환하게 됩니다.
자바 언어를 만든 제작자들이 정해놓은 것이니 왜 11이 아니냐고 물으셔도 곤란합니다 ㅠ
향상된 for문의 경우 교재 122쪽의 문제 38번을 예시로 해설해 드리겠습니다.
먼저 배열선언부는 배열 a에 값을 아래와 같이 저장한다는 의미입니다.
(NONE 부분은 존재하지 않음을 의미합니다.)
1 | 1 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | NONE |
tot과 totsu는 0으로 초기화 한후,
for(int i[]:a) 는 2차원 배열 a의 각 요소들을 새로 선언된 i라는 1차원 배열로 받아들이겠다는 의미입니다.
2차원 배열의 각 요소는 1차원 배열 2개, 위의 표에서 1행과 2행을 의미합니다.
즉 2번의 회전을 하게 되는데,
첫번째 회전에서 i[]는 { 1, 1, 0, 1, 0 }이라는 값을 가진 배열이 되겠고,
두번째 회전에서 i[]는 { 1, 0, 1, 0 }이라는 값을 가진 배열이 되겠죠.
다음 for문을 보죠.
for (int j : i) tot += j;
int j를 선언하면서 j는 i의 각 요소를 하나씩 받으면서 반복하겠다는 의미입니다.
즉, i[]가 { 1, 1, 0, 1, 0 }일 때, j는 저 요소들을 하나씩 저장하면서 5회 반복하겠고,
i[]가 { 1, 0, 1, 0 }일 때, j는 요소들을 하나씩 저장하면서 4회 반복하면서,
tot += j는 총 9회 반복하게 되겠네요.
각 요소의 값을 더하는 과정이니 1만 모두 더하게 되면 tot은 5가 되겠네요.
다음 totSu = totSu + i.length; 는 for(int j:i)에 속한 코드가 아닙니다. 해당 반복문의 코드는 tot+=j;에서 세미콜론이 등장하면서 끝나버렸죠.
for(inti[]:a)에 속한 코드이니 for(int j:i)가 끝날 때마다 한번씩 수행되서 총 2회 수행되는 코드입니다.
i.length는 배열 i의 길이를 의미하므로, 첫번째 회전에는 5, 두번째 회전에는 4가 됩니다.
totsu는 최종적으로 9가 되겠죠.
결국 마지막에 totsu는 9, tot은 5가 됩니다.
for문 내에서 int i[]와 같이 새로 선언된 배열이나 변수의 경우 이름은 바뀌어도 상관 없습니다. 다만 바깥쪽 for문에서 중심 인자가 되는 배열명 a와 같은 이름은 앞에서 선언한 배열명이 되어야겠죠.
행복한 하루되세요 :)
-
관리자2019-04-02 09:50:28
안녕하세요 길벗수험서 운영팀입니다.
먼저 배열 클래스의 length() 함수는 마지막 주소값이 아닌 배열의 전체 길이를 포함합니다.
즉 0~11 까지 있는 배열 요소 주소의 마지막인 11이 아니라, 0~11의 총 12개의 배열 요소를 갖고 있다는 의미의 길이이기 때문에 11이 아닌 12를 반환하게 됩니다.
자바 언어를 만든 제작자들이 정해놓은 것이니 왜 11이 아니냐고 물으셔도 곤란합니다 ㅠ
향상된 for문의 경우 교재 122쪽의 문제 38번을 예시로 해설해 드리겠습니다.
먼저 배열선언부는 배열 a에 값을 아래와 같이 저장한다는 의미입니다.
(NONE 부분은 존재하지 않음을 의미합니다.)
1
1
0
1
0
1
0
1
0
NONE
tot과 totsu는 0으로 초기화 한후,
for(int i[]:a) 는 2차원 배열 a의 각 요소들을 새로 선언된 i라는 1차원 배열로 받아들이겠다는 의미입니다.
2차원 배열의 각 요소는 1차원 배열 2개, 위의 표에서 1행과 2행을 의미합니다.
즉 2번의 회전을 하게 되는데,
첫번째 회전에서 i[]는 { 1, 1, 0, 1, 0 }이라는 값을 가진 배열이 되겠고,
두번째 회전에서 i[]는 { 1, 0, 1, 0 }이라는 값을 가진 배열이 되겠죠.
다음 for문을 보죠.
for (int j : i) tot += j;
int j를 선언하면서 j는 i의 각 요소를 하나씩 받으면서 반복하겠다는 의미입니다.
즉, i[]가 { 1, 1, 0, 1, 0 }일 때, j는 저 요소들을 하나씩 저장하면서 5회 반복하겠고,
i[]가 { 1, 0, 1, 0 }일 때, j는 요소들을 하나씩 저장하면서 4회 반복하면서,
tot += j는 총 9회 반복하게 되겠네요.
각 요소의 값을 더하는 과정이니 1만 모두 더하게 되면 tot은 5가 되겠네요.
다음 totSu = totSu + i.length; 는 for(int j:i)에 속한 코드가 아닙니다. 해당 반복문의 코드는 tot+=j;에서 세미콜론이 등장하면서 끝나버렸죠.
for(inti[]:a)에 속한 코드이니 for(int j:i)가 끝날 때마다 한번씩 수행되서 총 2회 수행되는 코드입니다.
i.length는 배열 i의 길이를 의미하므로, 첫번째 회전에는 5, 두번째 회전에는 4가 됩니다.
totsu는 최종적으로 9가 되겠죠.
결국 마지막에 totsu는 9, tot은 5가 됩니다.
for문 내에서 int i[]와 같이 새로 선언된 배열이나 변수의 경우 이름은 바뀌어도 상관 없습니다. 다만 바깥쪽 for문에서 중심 인자가 되는 배열명 a와 같은 이름은 앞에서 선언한 배열명이 되어야겠죠.
행복한 하루되세요 :)