[Java] String 클래스 , Wrapper 클래스

Nam_JU·2022년 7월 31일
0

Java

목록 보기
1/4

String 클래스

자바는 문자열을 관리하기 위한 여러 클래스를 제공하고 있으며 대표적인 클래스가 바로 String클래스이다.
String 클래스는 문자열 제어를 위한 다수의 메소드를 정의하고 있다.
프로그램 내에서 빈번하게 발생하는 문자열 처리를 위해서는 String클래스의 주요 기능들에 대한 이해와 특성에 대한 이해가 필요하다.

  • String 클래스는 내부적으로 byte[]을 이용해 문자열을 관리한다 (java8까지는 char[])
  • 자바의 문자형 체계는 UTF-16 코드 체계를 채택하고 있으며 2byte 기반의 문자 체계이다
  • 1byte로 표현 가능한 문자의 경우 남은 1byte에 대한 메모리 낭비가 발생하게 되며 이를 개선하기 위해 Java9부터 Compact String 개념이 도입되었다

알파벳을 사용할때는 1byte, 문자를 사용할때는 2byte를 사용


String 클래스 특징

  • String 객체의 초기화 방식은 리터럴을 이용한 방식객체 생성을 통한 초기화 방식 2가지 이다.
  • String은 불변의 특성을 가지고 있으며 내부적으로 String Pool을 통해 문자열 상수를 관리한다
  • 문자열 변경이 빈번한 로직에서 String의 사용은 메모리 누수가 발생할 수 있기 때문에 주의한다


자바는 문자열 상수를 관리할때 StringPool에서 관리를 한다.


public class StringPool {
    public static void main(String[] args) {
        //방법1
        String str1 = "Java Programming";
        //방법2
        String str2 = new String("Java Programming");
        //방법 1-1
        String str3 = "Java Programming";

        System.out.println(str1 == str2); //false
        System.out.println(str1 == str3); //true
    }
}

String 주의점

  • 같은 참조변수를 사용하는 경우 메모리 낭비가 일어날 수 있다

    사용이 끝나면 할당받은 곳을 할당해제 해줘야 하는데 GarbgeCollecter가 동작하면 할당해제가 됨. 문제는 언제 동작할지 모른다. 언제 없어질지 모름
    계속 반복하는 순간 메모리 낭비가 된다
    따라서 StringBuffer, StringBuilder 클래스 사용


StringBuilder, StringBuffer

  • StringBuilder와 StringBuffer 클래스는 동기화(Synchronized)특성을 제외하고 모든 메소드의 기능이 동일하다
  • 두 클래스는 String 클래스(불변 특성)와 달리 가변의 특성을 가지고 있다
  • StringBuilder, StringBuffer는 AbstractStringBuilder 추상 클래스를 상속하고 있으며 이 클래스는 내부적으로 문자열을 관리하기 위한 byte[]와 배열의 길이를 계산하기 위한 count속성을 갖고 있다
  • 단일 스레드 환경에서는 StirngBuilder.
    멀티 스레드 환경에서는 StringBuffer를 사용하거나 StringBuilder를 사용할때 동기화처리를 해주면 사용 가능하다


StringBuilder, StringBuffer 차이

  • StringBuilder 클래스와 StringBuffer클래스의 유일한 차이는 동기화 처리 여부이다
  • StringBuffer 클래스는 멀티 스레드 프로그램에서 데이터에 대한 동기화 문제가 발생하지 않도록 대부분의 메소드에서 동기화 처리를 하고 있다.
    이런 동기화 처리 과정은 성능에 영향을 주기 때문에 단일 스레드 프로그램에서는 StringBuilder 클래스를 사용한다


Wrapper 클래스

  • 자바 프로그램에서 관리하는 데이터의 기본 단위는 객체이다.
  • 자바에서는 int, double 등과 같은 기본 데이터 타입(Primitive data type)들을 객체로 관리할 수 있도록 하는 클래스들을 제공하며 이 클래스들을 Wrapper 클래스라고 한다.
  • Wrapper 클래스들은 기본 데이터 타입에 대한 객체화와 함께 다양한 기능을 정의하고 있다

Primitive형식과 Wrapper 차이

  • Object 타입은 모든 데이터를 하나로 묶을 수 있다. 객체를 참조할 수 있지만 "값"을 담을 수 없다. 이를 담기 위해 값을 감싸는 객체 wrapper가 등장 (Integer, Long 등등)
  • wrapper는 박싱과 언박싱이 계속 일어나면서 자원 낭비가 됨


Boxing UnBoxing

  • Wrapper class는 산술연산을 위해 정의된 클래스가 아님으로 인스턴스에 저장된 값을 변경할 수 없다.
  • 단지 값을 참조하기 위해 새로운 인스턴스를 생성하고 생성된 인스턴스의 값만을 참조할 수 있다.
  • Boxing : 기본타입의 데이터를 래퍼 클래스의 인스턴스로 변환하는 과정
  • UnBoxing : 래퍼 클래스의 인스턴스에 저장된 값을 다시 기본타입의 데이터로 꺼내는 과정
profile
개발기록

0개의 댓글