KOO-YS / java-design-pattern

0 stars 0 forks source link

[Chapter 13] Why is the String class declared final? #2

Closed KOO-YS closed 3 years ago

KOO-YS commented 3 years ago

final 선언이 되어 있는 클래스는 하위 클래스를 생성할 수 없습니다.


java.lang.String 클래스는 final 클래스로 선언되어 있기 때문에 다음과 같이 MyString 클래스를 정의할 수 없습니다

// X 컴파일 에러가 된다
class MyString extends String {
   . . .
}

이와 같이 String 클래스는 확장에 관한 The Open-Closed Principle을 위반하고 있지만, 사실은 위반할만한 정당한 이유가 있습니다. 그 이유는 무엇입니까?



JAVA 언어로 배우는 디자인 패턴 입문(유키 히로시) chapter 13. visitor 에서 발췌
KOO-YS commented 3 years ago

final

java.lang.String 클래스는 final 클래스이기에 immutable(불변의) 오브젝트입니다.


❓ 왜 String 클래스를 final 클래스로 생성하였는지, String이 불변객체로서 얻을 수 있는 장점을 설명하겠습니다.


불변 객체

"중복으로 필요한 문장에 대해서 한 인스턴스를 참조할 수 있다"

만약 String 클래스가 final 클래스가 아니라면, 하위 클래스를 생성하고 같아보이는 두 문자열을 만들 수 있다. 같아 보일 뿐, 두개는 엄연히 다른 인스턴스가 생성된다.

Security

민감한 정보에 대해 READ-ONLY으로 설정하여, 정보가 변경될 우려를 덜 수 있습니다.

Thread-safe

스레드가 어떤 객체의 상태를 변경할 수 없도록 함으로써 모든 스레드가 이 객체를 사용하는데 안전하다.

이 3가지 장점과 함께 String 클래스는 final로 선언되었다고 합니다.


참고

stack overflow 자바의 final 스레드 안정성과 불변성