Archives
Recent Posts
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
관리 메뉴

개발도생's Blog

[Java][Class] String 본문

Java/Class

[Java][Class] String

개발도생 2023. 4. 7. 14:38

String Class는,

자바에서 문자열을 사용할 수 있도록 제공되는 기본 Class 중 하나다.

 

String Class는 문자열과 관련된 작업을 할 때 유용하게 사용할 수 있는 다양한 Method가 포함되어 있다.

 

이러한 String Class는 'java.lang' 패키지에 포함되어서 제공이 된다.

(String Class를 사용할 때는 import를 하지 않아도 선언하고 바로 사용할 수 있다.)

 

String 인스턴스는 한 번 생성되면 값을 읽기만 하고 변경할 수는 없다.

 

이러한 객체를 자바에서 불변 객체(Immutable Object)라고 한다.

 

예를 들면, 자바에서 덧셈 연산으로 문자열을 결합하게 되면 기존 문자열의 내용이 변경되는 것이 아닌 

 

내용이 합쳐진 새로운 String 인스턴스가 생성되는 개념이다.

 

String Class의 선언

String Class는 자바 사용자라면 다들 자연스럽게 사용하고 있을 것이다.

 

일반 자료형 변수들을 선언함과 같이 String Class도 선언해서 사용할 수 있다.

 

또한 객체를 생성해 객체 자체에 값을 입력해 사용할 수 있다.

 

※예시 1번

public class StringTest {

	public static void main(String[] args) {

		String str1 = new String("String Class");
		String str2 = "String Class";
		
	}
}

 

하지만 여기서 객체로 값을 입력했을 때와 변수에 값을 바로 저장했을 때 차이가 생긴다.

 

값이 저장되는 저장 공간이 달라진다.

 

그 이유는 객체를 통해 값을 입력받은  String Class의 저장 위치는 'String Constant Pool' 영역에 값을 저장하게 되고,

 

변수에 값을 바로 할당하게 되면 'Heap' 영역에 값을 저장하게 된다.

 

 

※예시 2번

public class StringTest {

	public static void main(String[] args) {

		String str1 = new String("String Class");
		String str2 = "String Class";
		
		System.out.println("객체에 직접 값을 입력하여 변수에 저장했을 때 : " + System.identityHashCode(str1));
		System.out.println("변수에 값을 입력해서 저장했을 때 : " + System.identityHashCode(str2));

	}
}
// 결과 값
객체에 직접 값을 입력하여 변수에 저장했을 때 : 681842940
변수에 값을 입력해서 저장했을 때 : 1392838282

 

String Class는 불변 객체이기 때문에 변수는 달라져도 값은 같기 때문에 값을 참조해서 반환해야 하는데,

 

위의 결과를 보면 주소 값이 다른 것을 확인할 수 있다. 

 

때문에 위와 같이 객체를 통해 값을 입력했을 때와,

 

변수에 직접 값을 할당하게 될 때는 서로 다른 영역에 값이 저장된다는 점 숙지해야겠다.

 

 

※예시 3번

public class StringTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		String str2 = "String Class";
		String str3 = "String Class";
		
		System.out.println("변수는 달라졌지만 값은 같을 때 : " + System.identityHashCode(str2));
		System.out.println("변수는 달라졌지만 값은 같을 때 : " + System.identityHashCode(str3));

	}

}
변수는 달라졌지만 값은 같을 때 : 1392838282	// str2의 주소 값
변수는 달라졌지만 값은 같을 때 : 1392838282	// str3의 주소 값

위와 같이 변수명은 달라졌지만, String Class는 intern() Method를 통해 미리 생성된 객체가 공유되어서

 

같은 값을 참조해서 반환이 되게 된다.

 

그렇다면 여기서, inter() Method는 무엇인가?

 

inter() 란,

String Constant Pool 영역에서 문자열을 조회하고, 해당 문자열이 존재할 때 그 객체를 반환하거나

 

존재하지 않는다면 등록하는 아주 친절한 Method다.

 

inter() Method 덕분에 불변 객체가 가지는 동일한 객체를 공유할 수 있는 특징이 있고, 

 

동일한 객체를 하나만 생성할 수 있는 것이다. 

 

String Class의 Method

Method 설명
char charAt(int index) 해당 문자열의 특정 인덱스에 해당하는 문자를 반환.
int compareTo(String str) 해당 문자열을 인수로 전달된 문자열과 사전 편찬 순으로 비교.
int compareToIgnoreCase(String str) 해당 문자열을 인수로 전달된 문자열과 대소문자를 구분하지 않고 사전 편찬 순으로 비교.
String concat(String str) 해당 문자열의 뒤에 인수로 전달된 문자열을 추가한 새로운 문자열을 반환.
int indexOf(int ch)
int indexOf(String str)
해당 문자열에서 특정 문자나 문자열이 처음으로 등장하는 위치의 인덱스를 반환.
int indexOf(int ch, int fromIndex)
int indexOf(String str, int fromIndex)
해당 문자열에서 특정 문자나 문자열이 전달된 인덱스 이후에 처음으로 등장하는 위치의 인덱스를 반환.
int lastIndexOf(int ch) 해당 문자열에서 특정 문자가 마지막으로 등장하는 위치의 인덱스를 반환.
int lastIndexOf(int ch, int fromIndex) 해당 문자열에서 특정 문자가 전달된 인덱스 이후에 마지막으로 등장하는 위치의 인덱스를 반환.
String[] split(String regex) 해당 문자열을 전달된 정규 표현식(regular expression)에 따라 나눠서 반환.
String substring(int beginIndex) 해당 문자열의 전달된 인덱스부터 끝까지를 새로운 문자열로 반환.
String substring(int begin, int end) 해당 문자열의 전달된 시작 인덱스부터 마지막 인덱스까지를 새로운 문자열로 반환.
String toLowerCase() 해당 문자열의 모든 문자를 소문자로 변환.
String toUpperCase() 해당 문자열의 모든 문자를 대문자로 변환.
String trim() 해당 문자열의 맨 앞과 맨 뒤에 포함된 모든 공백 문자를 제거.
length() 해당 문자열의 길이를 반환.
isEmpty() 해당 문자열의 길이가 0이면 true를 반환하고, 아니면 false를 반환.

자주 사용했지만, 개념은 알지 못했던 String Class였다.

 

하지만 String Class의 구조에 대해 아주 조금 알게 됐다.

 

역시 알고 사용하는 것과 모르고 사용하는 것은 차이가 있는 듯하다.

 

앞으로 더 나은 개발자가 되기 위해 꾸준하게 공부해야겠다.

'Java > Class' 카테고리의 다른 글

[Java][Class] Random  (0) 2023.03.20
클래스(Class), 객체(Object), 인스턴스(Instance)  (0) 2022.12.20
[Java][Class] BufferedWriter  (0) 2022.12.15
[Java][Class] StringBuilder  (0) 2022.12.09
[Java][Class] StringTokenizer  (0) 2022.12.02
Comments