항상 기본과 기초에 충실해야되지만 일을하다보면 하도 안쓰다보니(?) 잊혀질때가 많은 것 같다.
아래소스코드를 실행하여보면,
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의 내용을 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 라는 객체는 서로 다른 객체라고 볼 수 있다.
기본과 기초!
잊지말자!
반응형
'Java(자바) > Java 기본' 카테고리의 다른 글
Java netty Sokect server (netty를 활용한 간단한 소켓 서버) (4) | 2020.09.21 |
---|---|
Java 파일 이미지 타입확인, Java 이미지 깨짐 확인 (0) | 2020.07.22 |
이클립스 프로젝트 실행 가능한 Jar파일 만들기 대상이 보이지 않을 때(export jar not showing) (0) | 2019.12.19 |
JAVA 바이너리 설치, Install binary java, 리눅스, 우분투 (0) | 2019.10.11 |
JAVA의 기초, JVM JRE JDK (0) | 2019.07.31 |
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)
댓글