성장기록지
[자바] 기본형처럼 쓸 수 있는 참조형인 불변클래스, String 정리 본문
김영한의 자바강의 중 기본형과 참조형 챕터에서 궁금한 것을 찾아 정리하였다.
변수의 데이터 타입은 크게 2가지가 있다.
기본형 - int long double 같이 변수에 사용할 값을 직접 넣을 수 있는 데이터 타입
참조형 - Student student 같이 데이터에 접근하기 위한 참조(주소) 를 저장하는 데이터 타입
참조형은 주소를 저장하므로, 연산이 불가능하다.
*String은 클래스라 참조형이지만, 기본형처럼 활용 가능하다.
왜 그럴까? String에 대해서 조금 더 자세히 알아보자.
- String은 new 연산자 없이도 인스턴스를 만들어 낼 수 있다. 물론 new가 있어도 된다.
ex) String str1 = "hello" ; String str2 = new String("hello");
new를 사용하지 않으면 문자열("hello")이 상수들이 저장되는 영역에 저장되어진다.
- 상수들이 저장되는 영역은 메소드 영역의 상수 풀이다. 메모리 구조는 나중에 더 작성하겠다.
- String은 참조형이여서 str1은 주소를 저장한다.
- 그러나 String str3 = "hello"라고 중복된 값(hello)이 들어오면, 상수영역에 hello가 있는지 살펴보고
있다면 원래에 있던 hello의 주소값을 가리킨다.
즉 이런 과정을 거치면 str1,str3은 동일한 인스턴스를 참조하므로,메모리를 아낄 수 있다.
new를 사용하면 인스턴스는 무조건 새롭게 만들어진다.
- 그래서 String str4 = new String("hello"); 를 하면 str4는 str2와 다른 주소값을 참조한다.
따라서 str1 == str2는 true, str3 == str4는 false를 반환한다.
위의 과정에서 str1,str2는 같은 주소값을 참조하고, str3,str4는 다른 주소값을 참조하기 때문이다.
만약 주소값을 참조한다는게 이해가 안간다면 참조형에 대해 조금 더 학습하면 된다.
+추가 : String은 불변 클래스이다.
- 생성된 string 인스턴스의 값은 수정이 불가능하다.
예를들어,
String str5 = "hello world";
String str6 = str5.substrting(3);
이란 코드를 진행한다면
str5.substring(3);은
str5를 잘라서 변화시키는 것이 아니라.
str에서 앞의 3글자를 잘라서 새로 만든 객체의 주소값이 저장되는것이다.
예를들어,
x001은 "hello world"가 저장된 주소,
x002는 str5.substrting(3) 을 하여서 "hello world"를 3글자 자른 "hel"이 저장된 주소라고 하자.
String str5=x001;
String str6= str5.substring(3); --> String str6 = x002;
따라서 str5의 값은 변하지 않는다.
추가로 공부할 것)
불변클래스에 대해서 자세히 공부해봐야겠다.