본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


Java(자바)/Java 기본

Java 불변객체, Java 객체 참조

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2020. 1. 22.

 

항상 기본과 기초에 충실해야되지만 일을하다보면 하도 안쓰다보니(?) 잊혀질때가 많은 것 같다.

아래소스코드를 실행하여보면,

public class Tester{

    public static void main(String[] args) {
        String [] abcd = new String[]{"a","b","c"};
        String [] efg = abcd;
		
        abcd[1] = "qqqqq";
		
        for(String arg : abcd){
            System.out.println(arg);
        }
        System.out.println("");
        for(String arg : efg){
            System.out.println(arg);
        }		    
    }
}

둘다 같은 값으로 표현!

 

abcd라는 문자열 객체는 efg가 참조하는 객체이다.

그러므로 abcd의 내용을 바꾸었을 뿐 인데 내용이 같이 변하여 버렸다.

해당 내용을 그대로 일반 String에 적용시켜 보자.

public class Tester{

    public static void main(String[] args) {
        String aaa = "abcd";
        String bbb = aaa;
		
        aaa = "good";
		
        System.out.println(aaa);
        System.out.println(bbb);	    
    }
}

aaa변수만 바뀌었다.

문자 aaa의 내용을 bbb에 적용시켜보았다.

앞선 배열에서는 대상 - 참조 관계가 성립하여 데이터가 둘다 변하였는데...여기서는 그렇게 되지가 않았다.

그 이유는 String 자체가 불변객체이기 때문이다.

String 변수로 선언함과 동시에 자동으로 new한 효과가 나타나 버리게 되기 때문 이다.

이러한 개념을 잊고 살다보면 간혹 "어...분명히 객체를 복사했는데 왜 바뀌지??" 라는 실수로 돌아오게 된다.

 

만약 맨 위의 코드를 서로 다른 값을 가지도록하려면 아래처럼 new의 개념인 clone을 써야 할 것이다.

public class Tester{

    public static void main(String[] args) {
        String [] abcd = new String[]{"a","b","c"};
        //String [] efg = abcd;  //기존 abcd를 바라보고있던 부분을
        String [] efg = abcd.clone(); //clone 메소드를 실행하여 새로이 생성하였다.
		
        abcd[1] = "qqqqq";
		
        for(String arg : abcd){
            System.out.println(arg);
        }
        System.out.println("");
        for(String arg : efg){
            System.out.println(arg);
        }		    
    }
}

 

특히 요런 실수는 메소드 - 메소드가 연결된 부분에서 자주 하게 된다.

아래 내용을 살펴보자.

public class Tester{

    public static void main(String[] args) {
        String name = "텍스트";
        changeString(name);  //name값을 메소드에 넣어
        System.out.println(name);   //출력~
    }
    
    public static void changeString(String arg){
        arg = "더하기 : "+arg;
    }    
}

 

출력값이 "더하기 : 텍스트"가 나올 것이라 예상하지만 결과는..

텍스트만 나온다.

 

changeString 메소드에 문자가 전달됨과 동시에 NEW 현상, 즉 새로이 객체를 생성하였기 때문이다.

그러므로 name이라는 객체와 changeString 안에 존재하는 arg 라는 객체는 서로 다른 객체라고 볼 수 있다.

 

기본과 기초!

잊지말자!

 

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글