☕JAVA/🐣 강의 [JAVA]

[JAVA][기초] String 클래스

디카페인라떼 2022. 11. 9. 17:34

[기초] 시리즈는 본강의를 수강후 정리한 글들 입니다.

Java for Beginner - YouTube

 

Java for Beginner

[교재 link] https://github.com/namoosori/java-for-beginner/tree/master/doc Java for Beginner 강의에서 다루는 내용은 다음과 같습니다. - Java 개요 : Java 언어가 어떤 언어이고 Java 언어를 이용해 프...

www.youtube.com


💡문자열 클래스 - String 클래스

  • 자바의 문자열을 관리하기 위한 대표적인 클래스
  • String 클래스는 문자열 제어를 위한 다수의 메소드를 정의
  • 문자열은 character 배열로 메모리에서 관리된다.
    • 하나의 character가 메모리 내에서 어떤 구조를 가졌는지 이해 필요
    •  문자 체계 이해 필요  : 유니 코드 체계(세상의 모든 문자를 관리하기 위한 체계), 아스키 코드 체계
    •  문자 열이 배열로 이루어졌다!! ( ex. substring index )
  •  프로그램 내에서 빈번하게 발생하는 문자열 처리를 위해서는 String 클래스의 주요 기능들에 대한 이해와 특성에 대한 이해가 필요
// Creating Strings
String str1 = "Java Programming";
String str2 = new String("Java Programming");
char[] charAry = {'J', 'A', 'V', 'A'};
String str3 = new String(charAry);
// String's Methods
System.out.println(str1.length()); //16
System.out.println(str1.toUpperCase()); //JAVA PROGRAMMING

 String 클래스 문자 체계

  • String 클래스는 내부적으로 byte[]을 이용해 문자열을 관리 (~Java8 까지는 char[])
  • 자바의 문자형 체계는 UTF-16 코드 체꼐를 채택하고 있으며 이는 2byte 기반의 문자체계
  • 1byte로 표현 가능한 문자의 경우 남은 1byte에 대한 메모리 낭비가 발생하게 되며 이를 개성하기 위해 Java9부터 Compact String 개념이 도입됨.
  • 🚩String클래스가 문자열을 관리할 때 내부적으로 character배열을 사용하여 관리하였다면 이제는 byte 배열로 관리함!

 

💡String 클래스 특징

  • String 객체의 초기화 방식
    • 리터럴을 이용한 방식
    • 객체 생성을 통한 초기화 방식
  •  String은 불변의 특성을 갖고 있으며 내부적으로 String pool을 통해 문자열 상수를 관리
    •  문자열 상수는 Heap 영역에 String pool 에 메모리가 잡혀서 따로 관리됨.
    •  동일한 문자열 상수를 사용한다면 String pool에 또 따로 메모리를 잡지 않고 기존에 사용하던 상수의 참조정보를 넘겨줌.
    •  만약 new 동적 할당자를 사용하여 초기화 하였다면 동일한 문자열 상수라 할지라도 따로 메모리를 잡기 때문에 == 시 false가 뜸(참조 정보가 다름)
  • 문자열의 변경이 빈번한 로직에서 String의 사용은 메모리 누수 memory leak이 발생할 수 있기 때문에 주의
    •  str.concat(" Programming");을 통해서 새로 만들어진 객체가 str 참조변수로 변경되면서 기존에 참조되었던  "Java" 부분은 메모리에 그대로 남아 불필요한 메모리 사용이 계속 되어있음.
    •  GC가 동작하는 순간에 할당해제가 되어 사라져야하지만 언제 GC가 동작하는지 모름
    •  그동안 메모리는 낭비되어 있음.
    •  🚩그러므로 StringBuilder 나 StringBuffer를 사용해야함!
String str = "Java";
str = str.concat(" Programming");
System.out.println(str.toString());// Java Programming

메모리 누수


💡StringBuilder, StringBuffer 클래스

  • StringBuilder와 StringBuffer 클래스는 동기화 특성을 제외하고 모든 메소드의 기능이 동일
    • 단일 쓰레드 환경에서는 StringBuilder
    •  멀티 쓰레드 환경에서는 StringBuffer 사용하거나 StringBuilder 동기화 해제
  •  이 두 클래스는 String 클래스와 달리 가변의 특성을 가짐
  •  StringBuilder, StringBuffer 두 클래스는 AbstractStringBuilder 추상 클래스를 상속하고 있으며 이 클래스는 내부적으로 문자열을 관리하기 위한 byte[]과 배열의 길이를 계산하기 위한 count 속성을 갖고 있음.
    •  string으로 실제로 참조하고있는 메모리 뿐만아니라 capacity라는 확장가능한 별도의 용량을 가지고 있음.
    •  만약 문자열이 더해지면 따로 새로 참조하는 것이 아니라 메모리가 확장되어 문자열이 더해져서 저장됨.
    • 즉, 참조 변수는 동일함.
StringBuilder sb = new StringBuilder("Java"); //리터럴을 이용한 초기화 방식은 안됨.
System.out.println(sb.capacity()); // 20
sb.append("Programming Study"); // sb = sb.append("Programming"); X
System.out.println(sb.capacity()); // 42

capacity

💡StringBuilder, StringBuffer 클래스의 차이

🧨멀티스레드 프로그래밍에 대한 개념이 선행되어야 함!!

  • 멀티 태스킹 Multi Tasking
    • 한가지 일만 하는 게 아닌 여러가지 일을 동시에 하는 것. 
    • 프로세스 단위
    • 프로세스 단위로 프로그램이 실행됨.
    • 여러 작업 = 여러 프로세스가 경쟁적으로 실행되고 cpu가 이를 관여하여 실행시킴. 이 과정이 너무 빨라서 동시에 이루어지는 것으로 보임.
  • 멀티 스레드 Multi thread
    • 프로세스 내부에 스레드 단위로 실행을 구분. 
    • 각각의 스레드들이 경쟁적으로 이루어지는 형태 = 멀티스레드
      • ex) 채팅 프로그램 -> 발신과 수신이 경쟁적으로 이루어짐. (동시에)
      • => 데이터에 대한 관리가 중요
        • 동기화 문제 :  한 데이터를 가지고 쓰레드들이 경쟁적으로 작업을 진행한다고 했을 때 데이터가 누락되거나 문제가 생길 수 있음.
          • T1이 진행 중인데 T2가 그 사이에 데이터를 변경했을 경우 데이터가 오염됨.
          • 그러므로 동기화 처리가 따로 필요함.
        • 동기화 처리 : 멀티스레드에서 한 스레드가 작업을 할 때 다른 스레드가 작업을 하지 못하게 따로 표식을 해두는 작업

 

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

StringBuilder, StringBuffer 클래스의 차이

 


💡String클래스의 +- 연산자

  • 자바의 +연산자는 피연산자 문자열일 경우 두 피연산자를 문자열로 연결해 주는 기능을 갖고 있음.
  • 문자열의 연결은 String 클래스의 concat(), StringBuilder 클래스의 append()와 동일한 기능
  •  Java8까지 문자열에 대한 + 연산은 StringBuilder 클래스의 append() 기능을 이용해 수행했음.
  •  Java9부터는 StringConcatFactory 라는 새로운 클래스의 기능을 이용해 문자열에 대한  +연산을 진행