oDesk 자바 문제 중 두 문제 질문드립니다.

2014-09-28 21:11

안녕하세요~

odesk 자바 테스트 문제 중 이해가 안되는 두 문제가 있어서 자바 기본에 강한 고수분들의 답변 부탁드립니다.

  1. 실행 결과값을 묻는 질문인데 'false;true'가 답입니다. 똑같은 값을 가지는 wrapper class이지만 객체레퍼런스값을 비교하므로 둘 다 false가 되어야 할 듯 한데, 하나는 false, 하나는 true입니다. 찾아봤는데 정확한 이유를 못 찾겠습니다. public class Test106 {

    public static void main(String[] args){

    Integer x =0;
    Integer y =0;
    Integer a =1000;
    Integer b=1000;
    System.out.println( (a==b)+" ; "+(x==y));
    
    }

}

  1. 마찬가지로 실행결과를 묻는 질문인데 '2332'가 답입니다. swap함수에 객체레퍼런스를 인수로 넘겼는데 새로 객체를 생성해 swap한경우는 인스턴스변수의 값이 안바꿨고 , 인스턴스변수 값을 직접 바꾼경우는 값이 swap이 됐습니다.직접 실행해봤는데 2332로 결과가 떨어졌습니다. swap함수 둘다 3232로 값이 바뀔 듯 한데 하나가 바뀌지 않은 이유가 어떻게 되는지... 꼭 좀 답변 부탁드립니다. 수고하세요~ public class Test15{

    public static void main(String[] args){ VO a = new VO(2); VO b = new VO(3); swapONE(a,b); print(a,b); swapTWO(a,b); print(a,b);

    }

    private static void print(VO a, VO b){

    System.out.println(a.toString()+b.toString());
    

    }

    public static void swapONE(VO a, VO b){

    VO tmp = a;
    a = b;
    b= tmp;
    

    }

    public static void swapTWO(VO a, VO b){ int tmp = a.x; a.x = b.x; b.x = tmp; }

}

class VO{

public int x;
public VO(int x){

    this.x = x;
}

public String toString(){
    return String.valueOf(x);
}

}

4개의 의견 from SLiPP

2014-09-29 02:42

첫번째 문제는 제가 예전에 달았던 댓글 참고하시면 답이 될 것 같아요. http://www.slipp.net/questions/66#answer-343

두번째 문제는 자바에서 객체 변수는 실제 힙에 저장된 객체를 가르키는 레퍼런스인데요. 메소드의 파라미터로 객체를 전달시 내부적으로 레퍼런스의 복사본이 전달됩니다. 결국 복사된 레퍼런스를 swap 해봤자 해당 swapONE 메소드 내부에서만 swap 되겠죠? swapTWO에서는 오리지널 레퍼런스와 복사 된 객체의 레퍼런스가 참조하고 있는 힙에 저장 된 객체는 동일할테니 레퍼런스의 값을 변경하면 실제 값이 변경되겠죠? 좀 더 상세한 내용은 아래 참고 바래요~ http://www.javaworld.com/article/2077424/learn-java/does-java-pass-by-reference-or-pass-by-value.html

잠이 안와 잠깐 들렸다가... 댓글 달고 갑니다.^^;

2014-09-30 08:03

자바는 파라미터 전달 방식이 Call by Value만 지원합니다. 그래서 두번째 질문의 예제에서 파마라터간 변경(swapping) 결과가 메소드 호출후 인자에 영향을 주지 못하는 원인입니다.

2014-09-30 11:15

위에 답변달아주신 세 분..정말 감사합니다.

예전에 C를 해서 pass by value, pass by reference개념은 잘 알고 있었는데, 자바에서는 pass by value만 지원하는 줄 몰랐네요.....

그리고 wrapper class도 테스트를 하다보니 어떤 작은 숫자일때는 ==의 결과가 동일하고 또 어떤때는 다르고 해서 아마 숫자의 범위별로 차이가 있겠거니하고 막연히 추측했는데 역시 -128~127까지의 기본값이 있었군요....

정말 속시원하게 알려주셔서 감사합니다.

p.s. 멜로 받은 패스워드를 분실해서 새로운 아디로 답글 올립니다.

의견 추가하기

연관태그

← 목록으로