2015. 4. 20. 23:57

자바 필기 및 실기 문제

다음 내용은 위에 나온 문제 중에서 필기 6번 문제와 해설입니다.


[Q6] 아래 프로그램의 출력 결과를 적으시오.

 

public class SetValues {

   

    public static void main(String[] argv) {

 

        String stringObj = "Hello";

        int intValue = 0;

        Float floatObj = new Float(1.0);

 

        setValues(stringObj, intValue, floatObj);

 

        System.out.println( stringObj + ", "

                       + intValue + ", " + floatObj );

 

    }

 

    private static void setValues(String strValue, int intValue, Float floatObj) {

        strValue.replace("H", "h");

        strValue += " World";

        intValue = 99;

        floatObj.valueOf((float) 2.0);

    }

}

 

위 문제는 call by value, call by reference의 차이를 식별할 줄 아는지를 묻는 것이라고 착각을 유도하는 문제이다. 시험 응시자가 자칫 핵심을 잘못 간파해서 엉뚱한데 집중하지는 않는지 여부와 자바에서 제공하는 기본 메소드들의 동작 방식을 제대로 이해했는가 여부를 파악하고자 출제된 것이다.


아래 주석을 통해 객체가 어떻게 메소드 간에 전달되고, 어떻게 변화하는지를 설명하였다.
(
객체의 ID는 임의로 부여한 것이며, 실제 실행 중에는 달라질 수 있다.)

 

public class SetValues {

   

    public static void main(String[] argv) {

 

        // stringObj (object id = 15)

        String stringObj = "Hello";

        // intValue (, 객체 아님)

        int intValue = 0;

        // floatObj (object id = 16)

        Float floatObj = new Float(1.0);

 

        setValues(stringObj, intValue, floatObj);

 

        System.out.println( stringObj + ", "

                       + intValue + ", " + floatObj );

     }

  

    // strValue (object id = 15), call by reference 방식으로 전달

    // intValue (, 객체 아님), call by value 방식으로 전달

    // floatObj (object id = 16), call by reference 방식으로 전달

    private static void setValues(String strValue, int intValue, Float floatObj) {

 

        // replace 메소드는 새로운 String 객체 (object id = 17) 만들어 반환하지만,

        // 변수에 반환 값이 할당되지 않으므로, 무시됨.

        strValue.replace("H", "h");

 

        // += (문자열 조합) 연산자를 실행하면, 새로운 객체(object id = 18) 생성되며,

        // strValue (지역변수) 참조하는 객체는 object id = 18 변경됨.

        strValue += " World";

       

        // intValue 변수는 기본형(primitive type)이므로, intValue 변수에 저장된 값이

        // 99 변경됨.

        intValue = 99;

 

        // Float 클래스의 valueOf() 메소드는 static 메소드이며,

        // 2.0 값을 지니는 새로운 Float 객체 (object id = 19) 생성해 반환함.

        // 반환된 객체는 어느 변수에도 할당되지 않기 때문에 무시됨.

        floatObj.valueOf((float) 2.0);

    }

}

 

결국 메인 함수로 복귀(return)하게 되면, setValues 함수 내에서 생성된 모든 객체는 무시되고, setValues 메소드 호출 이전 상태의 값들이 그대로 출력된다.

Posted by 곽중선