참조타입과 String

Backend kwon·2023년 4월 12일

String을 예로들지만, 참조타입에 특징적인 설명이다

String으로 보는 참조타입의 특징

String name1 = "Kim Coding";
String name2 = new String("Kim Coding");

System.out.print(name1); // "Kim Coding"
System.out.print(name2); // "Kim Coding"

name1과 name2는 실제 문자열의 내용을 값으로 가지고 있는 것이 아니라, 문자열이 존재하는 메모리 공간상의 주소값을 저장하고 있다.

그러나, 문자열을 출력해보면 주소값이 아니라 문자열의 내용이 출력된다.

String 타입의 변수를 참조하면 String 클래스의 메서드인 toString()이 자동으로 호출되기 때문이다.

toString()이 자동으로 호출되면 String 타입의 변수가 저장하고 있는 주소값에 위치한 String 인스턴스의 내용을 문자열로 변환해준다.

String name1 = "Kim Coding";
String name2 = "Kim Coding";

String name3 = new String("Kim Coding");
String name4 = new String("Kim Coding");

name1과 name2는 문자열 리터럴을 String 타입의 변수에 직접 할당하는 방법을 사용하고 있다. 이처럼 동일한 문자열 리터럴을 두 변수에 할당하는 경우, 두 변수는 같은 문자열의 참조값을 공유한다.

String 클래스의 인스턴스를 생성하게 되면 문자열의 내용이 같을지라도, 별개의 인스턴스가 따로 생성됩니다.

name3과 name4가 할당받게 되는 인스턴스의 참조값은 서로 다르다. 즉, name3과 name4는 서로 다른 인스턴스의 주소값을 저장하고 있게 된다.

tip) == 와 equals()

== : 좌항 == 우항의 형태로 사용할 수 있으며, 좌항의 값과 우항의 값이 일치하는지 검사하여 일치하면 true를, 일치하지 않으면 false를 반환

equals() : .앞의 변수가 저장하고 있는 문자열의 내용과 ()안의 문자열의 내용이 같은지 비교하여 같으면 true를 다르면 false를 반환

-> 즉 참조타입에서는 주소값(참조값)이 아닌 문자열의 내용을 비교하고 싶다면 equals()를 쓰는 것이 바람직하다.

profile
백엔드개발자를 향해서

0개의 댓글