728x90
상속을 금지 시킨 클래스를 정의할 때는 final 키워드를 사용하고, 그 대표적인 예로 String 클래스가 있다.
public final class String{..}
그리고 String 클래스는 불변 객체이다. 다음과 같이 코드가 있다.
package theory.util;
public class StringExam {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
String str4 = new String("hello");
if (str1 == str2) {
System.out.println("str1 == str2");
}
if (str1 == str3)
System.out.println("str1 == str3");
if (str3 == str4)
System.out.println("str3 == str4");
}
}
이때, new로 생성하지 않으면 "hello"는 상수처럼 취급이 된다. 즉, str1과 str2는 같은 값을 참조하는 것이다.
하지만 new로 생성하면 항상 heap 메모리에 새로운 객체가 만들어진다.
그리고 여기서 == 의 의미는 같은 것을 참조하느냐? 라는 의미이다.
그럼 String 을 사용할 때는 어떻게 사용해야 하는가? 이 답은 "hello"처럼 사용하라는 것이다. 왜냐하면, 이 방법을 사용하면 메모리 더 적게 사용하기 때문이다.
그렇다면 str1과 str3의 값이 같은지?는 어떻게 비교할 수 있는가? 이에 대한 답은 equals를 사용하는 것이다.
if (str1.equals(str3)) {
System.out.println("str1.equals(str3)");
}
String은 불변 클래스
그렇다면 만약 str1의 toUpperCase() 메서드를 호출해주면 str1이 참조하는 hello값이 바뀔까? 이에 대한 답은 그렇지 않다이다.
String은 불변 클래스이다. String의 어떤 메서드를 호출해줘도 str1이 참조하는 값은 변하지 않는다.
즉, String은 내부적으로 항상 새로운 문자열을 만들어서 return한다.
String s = str1.toLowerCase();
String substringed = str1.substring(3);
System.out.println("str1 = " + str1);
String과 비슷하지만 내부가 변하는 StringBuffer 클래스
인용
https://youtu.be/4DzmTInsRUs?si=VZbFFjAizRFLy8ej
728x90
'Language > Java' 카테고리의 다른 글
팩토리 메서드 패턴과 Java Reflection (0) | 2023.09.15 |
---|---|
인터페이스 (0) | 2023.09.15 |
추상클래스 (0) | 2023.09.15 |
super() 생성자와 불변 객체 (0) | 2023.09.14 |
상속 (0) | 2023.09.14 |