-
[Camel][Java] String 클래스에 대해서Java/개념 정리 2020. 2. 18. 20:28
String 클래스의 인스턴스 생성
우리는 Java를 사용해 개발하면서 수 없이 많이 String을 사용해왔을 꺼에요.
근데 Java에서는 문자열 또한 인스턴스로 처리하기 위해 String이라는 이름의 클래스를 정의하고 있다는 사실!
즉, Java의 문자열은 대부분의 상황에서 String의 인스턴스로 처리가 됩니다.
하지만 String 클래스의 인스턴스 생성은 다른 클래스의 인스턴스 생성과 조금 다르다는 사실 아시나요?
일반적인 클래스의 인스턴스 생성은 아래와 같이 우리가 흔히 알고있고 사용하고 있는 new 키워드를 사용합니다.
Animal camel = new Animal();
그렇다면 String 클래스는 무엇이 다를까?
String animal = "Camel";
우리가 아무런 위화감 없이 사용해왔던 String 클래스의 인스턴스는 new 키워드없이 큰따옴표 만으로도 생성이 가능했던 것입니다.
이 사실을 읽고 드는 생각은
"그럼 내가 String 인스턴스를 계속 생성하고 있었다는건가?"
맞습니다! 우리는 알게모르게 String 인스턴스를 매번 생성했던겁니다.
int len = "Camel".length(); System.out.println("len = "+ len ); String str = "Apple" int len2 = str.length(); System.out.println("len2 = "+ len2 );
위와 같은 코드를 실행시키면 "len = 5", "len2 = 5"라는 결과를 얻을 수 있습니다. 즉, 큰따옴표로 묶이는 문자열로 인해서 인스턴스가 생성된 것을 확인할 수 있습니다.
String 클래스의 인스턴스
String 클래스의 인스턴스는 상수의 성격을 갖습니다. String 인스턴스가 상수의 성격을 갖는다는 것은 즉 String 인스턴스에 저장된 문자열에 저장된 값의 변경이 불가능하다는 것입니다. 값을 바꾸는 것이 불가능할뿐더러 당연히 값을 바꾸는 메소드 또한 제공되지 않습니다.
그렇다면 왜 String 클래스의 인스턴스는 상수의 형태로 정의되어 있을까?
인스턴스의 생성은 시스템에 작업을 요청하는 것입니다. 그렇기 때문에 Java에서 문자열을 표현할 때마다 인스턴스가 생성되는 것은 시스템에 부담이 되는 요소입니다. 그래서 인스턴스의 생성을 최소화하기 위해 "문자열이 동일한 경우 하나의 String 인스턴스만 생성해서 공유하자" 라는 원칙을 기준으로 String 클래스를 정의한 것입니다.
이와 같은 기준으로 인스턴스를 생성하다보면 여러 개의 참조변수가 하나의 String 인스턴스를 참조하게 됩니다. 그런데 만약 여러개의 참조변수가 하나의 인스턴스를 참조하는 상황에서 한 참조변수를 통해 문자열을 변경해버리면 인스턴스를 참조하던 다른 참조변수는 원하지 않는 값 변경이 이루어지게 됩니다. 하지만 이러한 상황은 절대 발생하지 않으니까 걱정하시 마세요. 왜냐하면 String 인스턴스의 문자열은 상수의 형태로 정의되어 있어서 바꿀수 없기 때문입니다!
즉, 요약을 하면 다음과 같습니다.
Java는 문자열을 표현할 때마다 생성되는 인스턴스의 수를 줄이기 위해 동일한 문자열로 구성되는 String 인스턴스의 수를 1개로 제한한다. 그리고 이를 통해 발생할 수 있는 문제를 방지하기 위해 String 인스턴스의 값 변경을 허용하지 않는다.
다음 글에서는 String 클래스에 존재하는 다양하고 유용한 메소드에 대해 포스팅하겠습니다.
'Java > 개념 정리' 카테고리의 다른 글
[Camel][Java] Multi-Dimensional Array(다차원배열) feat. 2차원배열 (0) 2020.02.19 [Camel][Java] Array ( 배열 ) (0) 2020.02.19 [Camel][Java] Console Input - 콘솔 입력 (Scanner) (0) 2020.02.19 [Camel][Java] StringBuilder와 StringBuffer 클래스 (0) 2020.02.19 [Camel][Java] String 클래스의 다양하고 유용한 함수(Method) (0) 2020.02.18