관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

반복문과 배열 그리고 예외 처리 23 - 연습문제 이론편 풀어보기 1 : 1~7번 문제 본문

프로그래밍 언어/자바

반복문과 배열 그리고 예외 처리 23 - 연습문제 이론편 풀어보기 1 : 1~7번 문제

huenuri 2024. 8. 14. 16:04

이론문제는 무려 14문제나 되어 한 포스트에 담지는 못할 것 같다. 원래 오늘 아침까지 실습 편 문제까지 풀어보려고 했는데 문제도 많거니와 할 수 없는 목표였다.

오후 5시까지 이 문제들을 풀어보고 저녁에는 자바2의 2주 차 학습까지 진행하는 것이 오늘의 목표이다. 


 

 

 

연습문제 이론편

 

1번 문제

다음 프로그램 출력 결과는 무엇인가? 무엇을 하는 코드인가?

 

 

10보다 작은 홀수가 출력되었다. 이는 반복문으로 홀수를 출력하는 코드이다.


 

 

 

문제 2번

for 문의 실행 결과 sum 값이 다른 하나는?

 

 

 

 

3번은 값이 하나도 출력이 되지 않았고 sum 값이 다른 건 4번이라고 할 수 있겠다. 이 문제는 많이 어려웠다. 직접 손으로 값을 대입해 보았으나 아직은 이 값을 알아내는 것이 쉽지 않다. 그래도 한번 시도해보려고 한다.

 

손으로 직접 써보니 이제야 조금 이해가 된다. 

 

이때 주의할 점은 sum = 0으로 초기화시키지 않으면 그 값이 누적이 되어 이전 값에서 더해진다는 것이다. 하지만 값이 출력이 되지 않은 3번 다음에는 sum을 초기화하지 않아도 제대로 나왔다.


 

 

 


 

 

3번 문제에 대한 해설

 

  • i는 처음에 0으로 초기화되는데, i > 10이라는 조건은 처음부터 false이다.
  • 즉, i는 10보다 크지 않으므로 for 루프의 본문이 한 번도 실행되지 않는다.
  • 따라서, sum++이라는 코드가 전혀 실행되지 않으며, System.out.print(sum + " ");도 출력되지 않는다.

 

4번 문제에 대한 해설

이 코드에서 for 루프는 다음과 같이 동작한다.

  1. 초기화: int i = 0; (루프가 시작될 때 i를 0으로 설정한다.)
  2. 조건: i < 10 (루프가 계속 실행될 조건을 확인한다.)
  3. 증가/감소: sum += i, i++ (루프 본문이 실행된 후에 이 두 연산이 수행된다.)

 

루프의 실행 흐름

  1. 루프 본문 실행 전
    • 조건 평가: i < 10이 참이면 루프 본문이 실행된다.
  2. 루프 본문 실행 후
    • 증가/감소:
      • sum += i가 실행됩니다. 루프 본문이 끝난 후 sum이 i만큼 증가한다.
      • i++가 실행되어 i가 1 증가한다.

 

핵심 이해

  • 루프 본문 실행 후
    • sum += i가 i++ 전에 실행되기 때문에 sum의 업데이트는 루프 본문이 실행된 후에 반영된다.
    • 루프 본문에서 sum을 출력할 때는 업데이트되기 전의 sum 값이 출력됩니다.

즉, sum += i와 i++는 루프 본문이 실행된 후에 수행되므로, 출력문은 sum의 이전 값을 사용한다. 이로 인해 반복 초기 단계에서 sum의 이전 값이 출력된다.

 

이렇게 관련된 내용을 찾아보면서 드디어 이해가 되었다. 


 

 

 

 

문제 3번

1에서 100까지 3의 배수를 더하는 while문 작성하기

 

 

 

 

단순히 문제를 푸는 것보다 이렇게 스스로 코드를 작성해 보고 만들어보는 게 프로그래밍 공부에 많은 도움이 된다. 처음에 난 3의 배수의 합이 이처럼 크리라고 생각하지 못했다. 3, 6, 9, ... 99까지 더한 결과가 이렇게 되는 것 같다.

원래 문제에는 print문은 없었다. continue를 하면 다음 순서로 건너뛸 수 있다.


 

 

 

 

문제 4번

1에서 50까지의 합을 더하는 while 문 작성하기

 

 

 

처음에는 부등호를 반대로 했더니 값이 0으로 나왔다. 이 부분이 좀 헷갈리는데, 여기서는 true가 되지 않는 식을 만들어야 한다.  그래야 break로 빠져나갈 수 있기 때문이다.

그리고 break 뒤에 바로 문장을 쓰면 애러가 되고 꼭 중괄호를 넣어야 한다. 위치에 따라 읽는 코드 블록이 다르기에 그런 것 같다.


 

 

 

문제 5번

배열의 선언이 잘못된 것 고르기

 

 

 

4번은 배열 선언이 되지 않음을 볼 수 있다. 배열 앞부분에는 배열의 길이를 명시할 수 없기 때문이다. 이 배열을 출력하려면 어떻게 해야 할까? 코드를 한번 짜보았다.


 

 

 

 

 

이렇게 출력이 잘 되고 있다. 여기서 중요한 점은 배열의 요소를 할당하지 않으면 기본값으로 0이 할당된다는 것이다.


 

 

 

 

문제 6번

다음 코드에 대해 실행 중 오류가 발생하는 것 고르기

int array[] = { 1, 2, 3, 4, 5 };

 

 

 

실행 중에 발생하는 에러가 다음과 같이 떴다. 이건 4번째 문장에서 길이를 100으로 바꾸자 발생하는 오류이다. array의 길이는 5로 정해놓았는데 그걸 변경하기 때문이다.

여기서 알게 된 건 다음과 같다.

 

배열의 값이 선언된 이후에 값을 변경하는 것이 가능했다. 그리고 2번 문장은 list라는 객체에 동일한 배열을 참조하도록 하는 것이다. 두 배열 변수가 동일한 배열을 참조하도록 한다. array에도 있지만 list라는 객체로도 참조할 수 있게 한 것이다.

list와 array는 동일한 배열 객체를 참조하므로, 하나의 배열을 다른 이름으로 접근하는 것과 같다. 메모리 상에서 실제로 두 개의 배열이 존재하는 것이 아니라, 단지 하나의 배열이 두 개의 참조 변수에 의해 접근되는 것이다.

결론적으로, int list[] = array;는 list 변수가 array와 같은 배열을 참조하도록 하여, 두 변수가 동일한 배열 객체를 가리키게 만든다. 이는 배열을 복사하는 것이 아니라 참조를 공유하는 방식이다.


 

 

 

문제 7번

 

첫 번째 도전

 

문자열로 값을 저장하는 줄 알았는데 아니었다..


 

 

 

다시 풀어보기

 

char형으로 10개의 배열 공간을 만드는 문제였다.


 

 

 

 

 

배열의 요소도 모두 출력해 보았다. 여기서 신기한 점은 배열을 선언만 하고 값을 저장하지 않으면 아무것도 출력이 되지 않는다는 것이다. int형일 때는 모두 0으로 초기화가 되어 char형의 경우 어떻게 되는지 궁금했다.


 

 

 

 

 

학습을 마치고

문제가 정말 많아서 반절씩 나누어서 포스트를 작성하기로 했다. 이제 딱 7문제가 남아있다. 남은 문제들은 이 문제들보다 훨씬 어렵지만 하나하나 풀다 보면 어느새 다 풀 수 있으리라 믿는다.

오늘은 수업을 쉬고 집에서 쉬엄쉬엄 놀면서 공부하니 정말 좋다. 가끔은 이런 시간도 필요한 것 같다.