반응형

문자열을 만들 때에는 두 가지 방법, 문자열 리터럴을 지정하는 방법과 String 클래스의 생성자를 사용해서 만드는 방법이 있다.


변경불가능한 클래스

String 클래스에서는 문자열을 저장하기 위해 문자형 배열 참조변수(char[ ]) value를 인스턴스 변수로 정의해놓고있다.

한번 생성된 String인스턴스가 갖고 있는 문자열은 읽어 올 수 만있고, 변경할 수는 없다.

예를 들어 + 연산자를 이용해서 문자열을 결합하는 경우 인스턴스 내의 문자열이 바뀌는 것이 아니라 새로운 문자열이 담긴 String 인스턴스가 생성되는 것이다.

String str1 = "반가워"; // 문자열 리터럴 "반가워"의 주소가 str1에 저장됨

String str2 = new String("반가워");  // 새로운 String인스턴스를 생성

String str3 = "반가워";  // 문자열 리터럴 "반가워"의 주소가 str3에 저장됨

  • String 클래스의 생성자를 이용한 경우에는 new 연산자에 의해 메모리 할당이 이루어지기 때문에 항상 새로운 String 인스턴스가 생성된다.
  • 문자열 리터럴은 이미 존재하는 것을 재사용하는 것이다.

이 때의 몇가지 시나리오를 확인해보자.

public static void main(String[] args) {

 

// String

// 문자열이라는 데이터를 보관이나 연산할때 사용

// static 영역, 데이터 영역, --> 상수 풀 영역

 

String str1 = "반가워";

String str2 = new String("반가워");

String str3 = "반가워";

 

System.out.println(str1);

System.out.println(str2);

// 시나리오 1

if(str1 == str2) { // str1은 상수풀 영역에, str2는 힙메모리 영역에 있어 주소값이 다름

System.out.println("주소가 같아요");

} else {

System.out.println("주소값이 달라요");

}

 

// 시나리오 2

// 리터럴 방식으로 생성한 문자열은 이미 생성한 값이 똑같다면 새로 만들지 않고 재활용한다.

if(str1 == str3) {

System.out.println("주소 같음");

} else {

System.out.println("주소 다름");

}

System.out.println("=============================");

// 시나리오 3

str3 = "반갑습니다"; // 값을 변경

if(str1 == str3) { //str3의 값을 변경하여 상수 풀 메모리에 새로 생성됨

System.out.println("주소 같음");

} else {

System.out.println("주소 다름");

}

System.out.println("=============================");

// 시나리오 4

// 문자열에 값을 비교하려면 equals를 반드시 사용

if(str1.equals(str2)) { // str1과 str2의 주소값을 비교하는 것이 아닌 문자열을 비교하므로 값은 "반가워"로 같으므로 같은 값입니다가 출력

System.out.println("같은 값입니다.");

} else {

System.out.println("다른 값입니다.");

}

[실행값]

주소값이 달라요

주소 같음

=============================

주소 다름

=============================

같은 값입니다.

반응형

'Java > Java 이론' 카테고리의 다른 글

[JAVA] 참조변수의 형변환  (0) 2023.08.11
[JAVA] 인터페이스(interface)  (0) 2023.08.11
[JAVA] 추상 클래스와 메서드  (0) 2023.08.10
[JAVA] 다형성  (0) 2023.08.10
[JAVA] 객체지향 언어  (0) 2023.08.09

+ Recent posts