책 내용 질문하기
2022 정보처리기사 실기 기출문제집 Java 코드 문제
도서
2022 시나공 정보처리기사 실기
페이지
123
조회수
359
작성일
2022-07-18
작성자
탈퇴*원
첨부파일

실전 모의고사는 토막 강의가 없어서 막히는 문제 생기면 너무 어렵네요..

 

 

1회 실전 모의고사 9번 문제

 

 

public class Test10 {


public static int a = 5;

public static void main(String[] args) {

int b = 2;

cal(b);

cal(b);

System.out.printf("%d, %d\n", a, b);

}

static void cal(int b) {

if (b < a)

a -= 3;

else

b += 3;

}

}



​이거 제가 풀면 2, 5 나오는데 답은 2, 2라서 이클립스로 디버깅을 해봤는데, 

 

cal 메소드에서 분명 b는 5가 됐는데 printf로 넘어가면서 2로 변하고 2로 찍히더라고요

 

왜 그러는지 정말 이해가 안가요ㅠㅡㅠ 스코프 때문인 건지.. 비전공자라서 조금 이해 쉽게 설명해주시면 감사하겠습니다..

답변
2022-07-19 20:57:23

안녕하세요 길벗수험서 운영팀입니다.

 

전역 변수와 지역 변수의 차이를 구분하셔야 합니다.

 

기본적으로 함수가 변수를 인수로 사용할 때는 변수가 직접 전달되는 것이 아닌 변수에 저장된 값만 전달됩니다.

때문에 cal()에서 변경된 b의 값은 main()에서 적용되지 않습니다. 

또한, main()의 b와 cal의 b는 서로 다른 변수입니다. (선언도 따로 되었죠) - 지역 변수에 해당

 

반면 a는 main() 메소드의 밖, 클래스에서 선언되었습니다. - 전역 변수에 해당

클래스에서 a의 값의 변경은 메소드에서만 반영되는 것이 아닌 클래스 모두에 반영된다는 것을 의미합니다.

cal()에서 a는 선언조차 되지 않았는데 값을 변경하고 있고, main()에서도 a를 출력하고 있습니다.

이것이 오류도 나지 않고 수행되었다는 것은 이 a가 class 단에서 선언된 변수라는 것을 알 수 있죠.

즉 cal()에서 a의 값의 변화는 Test.a의 값을 변경한 것이고, main()에서 a의 출력은 Test.a의 값을 출력한 것이니 그대로 변경된 값 2가 나오게 되는 것이죠.

 

행복한 하루되세요 :)

  • 관리자
    2022-07-19 20:57:23

    안녕하세요 길벗수험서 운영팀입니다.

     

    전역 변수와 지역 변수의 차이를 구분하셔야 합니다.

     

    기본적으로 함수가 변수를 인수로 사용할 때는 변수가 직접 전달되는 것이 아닌 변수에 저장된 값만 전달됩니다.

    때문에 cal()에서 변경된 b의 값은 main()에서 적용되지 않습니다. 

    또한, main()의 b와 cal의 b는 서로 다른 변수입니다. (선언도 따로 되었죠) - 지역 변수에 해당

     

    반면 a는 main() 메소드의 밖, 클래스에서 선언되었습니다. - 전역 변수에 해당

    클래스에서 a의 값의 변경은 메소드에서만 반영되는 것이 아닌 클래스 모두에 반영된다는 것을 의미합니다.

    cal()에서 a는 선언조차 되지 않았는데 값을 변경하고 있고, main()에서도 a를 출력하고 있습니다.

    이것이 오류도 나지 않고 수행되었다는 것은 이 a가 class 단에서 선언된 변수라는 것을 알 수 있죠.

    즉 cal()에서 a의 값의 변화는 Test.a의 값을 변경한 것이고, main()에서 a의 출력은 Test.a의 값을 출력한 것이니 그대로 변경된 값 2가 나오게 되는 것이죠.

     

    행복한 하루되세요 :)

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