본문 바로가기
프로그래밍 언어/java

[java] String, Wrapper 클래스

by m2162003 2021. 3. 18.

String 클래스

String 클래스를 선언하는 방법엔 2가지가 있다.

 

1 String str1 = new String("abc"); //new로 선언

 

2 String str2 = "abc"; //리터럴 선언

 

1번 방법은 인스턴스로 생성된 String이고 2번 방법은 상수풀에 있는 문자열을 가리킨다.

str1.equals(str2)를 하면 true이지만 str1 == str2를 하면 false가 나온다는 의미이다.

 

3 String str3 = "abc";

하지만 str2 == str3는 true이다. str2와 str3는 상수풀에 있는 동일한 문자열을 가리키기 때문이다.

public static void main(String[] args) {
		String s1 = new String("java");
		String s2 = "java";
		System.out.println(s1 == s2); // false

		String s3 = "java";
		System.out.println(s2 == s3); // true
	}

 

 

String은 immutable

 

한 번 선언된 문자열은 변경이 불가능하다.

"+"나 concat을 사용해서 문자열을 추가할 경우 기존의 문자열이 변경되는 것이 아니라 새로운 문자열이 생성된다.

public static void main(String[] args) {
		String s1 = new String("java");
		System.out.println(System.identityHashCode(s1));
        
		String a1 = new String("android");
		s1 = s1.concat(a1);
		System.out.println(System.identityHashCode(s1));
	}

결과: 메모리가 다르다.

 

 

String 클래스의 장점은 불변 객체이기 때문에 조회 연산에서는 타클래스보다 빠르고 멀티쓰레드 환경에서 동기화를 신경 쓸 필요가 없다는 점이다.

하지만 새로운 문자열이 생성되면 기존 문자열은 GC에 의해 제거되야 하는데 언제 제거될지 모른다. 또한 문자열 연산이 많아질수록 새로운 문자열 객체를 생성하여 오버헤드가 발생하여 성능이 떨어진다.

 

 

 

StringBuilder와 StringBuffer

immuatable한 String을 가변적으로 사용할 수 있는 방법이 있는데 StringBuilder와 StringBuffer를 이용하는 것이다.

두 클래스 모두 char[]배열을 멤버 변수로 갖고 있어서 가변적인 문자열을 다룰 수 있다.

새로운 문자열을 생성하지 않으므로 문자열 연산이 많을 때 사용하면 성능이 좋다.

 

StringBuffer는 멀티 쓰레드프로그래밍에서 동기화가 보장된다.

StringBuilder의 경우 단일 쓰레드 프로그래밍에서 사용하는 것이 좋다.

 

둘다 String타입은 아니므로 사용 후 toString()을 통해 String클래스로 변환해야 한다.

	public static void main(String[] args) {
		StringBuffer buffer = new StringBuffer("java");
		System.out.println(System.identityHashCode(buffer));
        
		buffer.append(a1);
		System.out.println(System.identityHashCode(buffer));
        
		String s1 = buffer.toString();
		System.out.println(s1);
	}

 

 

Wrapper 클래스

Integer, Byte 이런 애들이다.

사용하는 이유는 기본 타입 데이터를 객체로 요구하는 경우가 있기 때문이다.

 

8개의 기본 데이터 타입에 대해 Wrapper 클래스를 제공하여 해당 값을 가지는 객체로 만들어준다.

 

'프로그래밍 언어 > java' 카테고리의 다른 글

[java] 예외 처리  (0) 2021.04.05
[java] Class 클래스, 자바 리플렉션  (0) 2021.03.18
[java] Object 클래스  (0) 2021.03.18
[java] 인터페이스 다중 상속  (0) 2021.03.12
[java] 인터페이스  (0) 2021.03.12

댓글