728x90
반응형
자바에서 기본형은 int, long, double, boolean 등이 있고
참조형은 클래스, 객체, String 등이 있다.
참조형 데이터는 메모리 주소값을 참조한다.
Student s1 = new Student("1번학생", 10, 10);
Student s2 = new Student("2번학생", 100, 100);
여기서 s1, s2에는 학생 객체의 “참조값”이 저장된다.
이 상황에서 만약 배열을 새로 만든 뒤 배열에 학생 객체를 넣는다면 어떻게 될까?
List<Student> students = new ArrayList<>();
students.add(s1);
students.add(s2);
배열에서 인덱스로 학생 객체에 접근해서 값을 바꾼다면 배열 안의 학생 정보만 바뀔까? 아니면 배열 바깥의 학생 정보도 바뀔까?
list.get(0).setName("아무개1");
list.get(1).setName("아무개2");
정답은 배열 안의 학생 정보, 배열 바깥의 학생 정보 둘다 값이 바뀐다.
System.out.println(s1.getName()); // 아무개1
System.out.println(s2.getName()); // 아무개2
왜 그럴까?
Student s1 = new Student("1번학생", 10, 10);
Student s2 = new Student("2번학생", 100, 100);
여기서 s1과 s2에는 각각 학생 객체의 주소값이 저장된다.
List<Student> students = new ArrayList<>();
students.add(s1);
students.add(s2);
그리고 배열에 객체를 넣을때도 그 “주소값”을 넣는다. 인스턴스를 새로 만들어서 넣는것이 아니다!
그래서 값을 변경할때도 바라보는 주소값이 동일하므로 배열 안, 밖 둘다 바뀌는것이다.
그런데 또 의문이 들었다..
String도 참조형인데 비슷한 실험을 해볼 수 있을까?
String str1 = "hello";
String str2 = str1;
str2 = "world";
System.out.println(str1); // hello
System.out.println(str2); // world
예상한 결과가 나오지 않는다..
왜 그럴까?
str1 과 str2는 처음엔 같은 “hello” 문자열 객체를 참조한다.
이후 str2 = “world” 라고 하면, str2는 새로운 “world” 객체를 참조하게 되는 것이다.
String 은 immutable 불변하므로 hello객체가 변경이 되는게 아닌 다른 문자열 객체로 바꿔치기 되는 방식이 사용된다.
반대로 StringBuilder로 한다면?
→ StringBuilder는 mutable 가변객체이므로 진짜 객체 내부가 바뀐다.
StringBuilder sb1 = new StringBuilder("hello");
StringBuilder sb2 = sb1;
sb2.append(" world");
System.out.println(sb1); // hello world
System.out.println(sb2); // hello world
728x90
반응형
'Dev > Java' 카테고리의 다른 글
[객체(17)] 실습9 (0) | 2022.05.15 |
---|---|
[객체(16)] 입출력, 스트림 (0) | 2022.05.15 |
[객체(15)] 실습7, 실습8 (0) | 2022.05.15 |
[객체(14)] (0) | 2022.05.15 |
[객체(13)] 실습5, 실습6 (0) | 2022.05.15 |