책 내용 질문하기
실기질문드려요
도서
2018 시나공 정보처리기사 실기(산업기사 포함)
페이지
101
조회수
612
작성일
2019-04-01
작성자
탈퇴*원
첨부파일
1권 101쪽에코드해설 2번에서 문자열의 길이가 왜 12가 되는 건가요 0부터 시작하면 11까지니까 길이가 11 로되어야 하지 않나요 그리고 향상된 for문이 이해하기 어렵습니다 알기쉽게 예시를 들어주실 수 있나요?? 그리고 자바에서 향상된 for문에서 변수 i등 사용시 미리 반복문 위에서 선언한 다음에 변수를 사용해야 되는것 아닌가요
답변
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

 

 

tottotsu0으로 초기화 한후,

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를 선언하면서 ji의 각 요소를 하나씩 받으면서 반복하겠다는 의미입니다.

, i[]{ 1, 1, 0, 1, 0 }일 때, j는 저 요소들을 하나씩 저장하면서 5회 반복하겠고,

i[]{ 1, 0, 1, 0 }일 때, j는 요소들을 하나씩 저장하면서 4회 반복하면서,

tot += j는 총 9회 반복하게 되겠네요.

각 요소의 값을 더하는 과정이니 1만 모두 더하게 되면 tot5가 되겠네요.

 

다음 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가 되겠죠.

 

결국 마지막에 totsu9, tot5가 됩니다. 

 

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

     

     

    tottotsu0으로 초기화 한후,

    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를 선언하면서 ji의 각 요소를 하나씩 받으면서 반복하겠다는 의미입니다.

    , i[]{ 1, 1, 0, 1, 0 }일 때, j는 저 요소들을 하나씩 저장하면서 5회 반복하겠고,

    i[]{ 1, 0, 1, 0 }일 때, j는 요소들을 하나씩 저장하면서 4회 반복하면서,

    tot += j는 총 9회 반복하게 되겠네요.

    각 요소의 값을 더하는 과정이니 1만 모두 더하게 되면 tot5가 되겠네요.

     

    다음 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가 되겠죠.

     

    결국 마지막에 totsu9, tot5가 됩니다. 

     

    for문 내에서 int i[]와 같이 새로 선언된 배열이나 변수의 경우 이름은 바뀌어도 상관 없습니다. 다만 바깥쪽 for문에서 중심 인자가 되는 배열명 a와 같은 이름은 앞에서 선언한 배열명이 되어야겠죠.

     

    행복한 하루되세요 :)

· 5MB 이하의 zip, 문서, 이미지 파일만 가능합니다.
· 폭언, 욕설, 비방 등은 관리자에 의해 경고없이 삭제됩니다.