본문 바로가기

IT/Java

[Java] java.lang패키지와 String 클래스

Object 클래스와 마찬가지로 java.lang.패키지에 포함되어있기 때문에 import문 없이도 사용할 수 있도록 되어 있다.

 

2. String 클래스

문자열을 저장하기 위해서 문자형 배열 변수(char[] value)를 인스턴스 변수로 정의해 놓고, 인스턴스 생성 시 생성자의 매개변수로 입력받는 문자열은 이 인스턴변수에 문자형 배열로 저장되는 것이다. 그리고 String 클래스는 다양한 형태의 생성자를 제공해준다. 문자열 상수를 생성자에 전달해서 String 객체를 생성한 예이다.


String str01 = new String("FUCK_JAVA");


문자형 배열로 저장되는 것이라 다음과 같이 char[]를 매개 변수로 갖는 생성자를 이용할 수 있다.


char []c = {'F','C','K','_','J','A','V','A'};

String str02 = new String(c);


String 객체를 생성하는 데 있어서 다른 클래스와 비교해 특이한 점은 new를 사용하지 않고도 다음과 같이 String 객체에 문자열 리터럴을 저장할 수 있다는 점이다.


String str03 = "FUCK_JAVA";


new를 사용하지 않고도 프로그램 내부에 기술된 문자열 리터럴은 자동으로 String 객체로 생성되어 힙 영역에 메모리가 할당된다.

이미 존재하는 문자열 리터럴로 다시 Stirng객체를 생성하게 되면 메모리할당을 하지 않고 이미 존재하는 문자열을 공유하게 된다.


String str04 = "FUCK_JAVA";


 

 이것은 문자열 리터럴을 바로 String으로 선언한 레퍼런스 변수의 초기값으로 주었을 경우이고, new로 String 객체를 생성하게 되면 별도의 기억 공간(힙 영역)에 생성된다.


String str05 = new String("FUCK_JAVA");



3. 불변 객체 Stirng

String 클래스가 제공해주는 다양한 메소드를 사용하여 String 객체를 조작할 수 있다. 그런데 이런 메소드는 String 객체가 가지고 있는 문자열의 내용을 바꾸는 것이 아니라 바뀐 내용을 갖는 새로운 Stirng 객체를 생성해 내는 것이다.


String str01 = "FUCK";

System.out.println(str01.replace("FUCK", "JOT"));

System.out.println(str01);



 String 객체 내에 저장된 문자열이 변경될 수 없다는 것은 String 인스턴스 내용이 생성후에 변경될 수 없다는 것을 의미한다. 하지만 String 레퍼런스 변수는 언제든지 다른 Stirng 객체를 가리킬 수 있다.

만일 str01로 replace 메소드를 호출한 후에 그 다음 문장에서 str01이 변경된 문자열이 출력되록 하려면 다음과 같이 기술해야 한다


String str01 = "FUCK";

str01 = str01.replace("FUCK", "JOT");

System.out.println(str01);



4. String 관련 메소드

일일이 메서드를 보는 것은 너무 시간이 오래 걸린다. 예제를 풀ㄸ ㅐ 필요하다 싶은 것은 그때 가서 보면 되지 않나 ㅅ.ㅍ 그렇기 때문에 아~아!이런 메소들이 있구만 하고 정도로 구경 하면된다. API Go!

 

5. StringBuffer 클래스 와 StringBuilder 클래스

StringBuilder 클래스와 StringBuffer 클래스는 문자열 조작에 적합하게 만들어진 클래스이다. String 클래스가 있는데도 이런 클래스들은 제공하는 이유는 String의 단점을 해결하기 위해서이다. String 클래스는 불변 객체로서 자기 자신은 변하지 않고 메소드에 의해 처리된 결과를 저장할 문자열을 새롭게 생성하는 것이었다. 그렇기 때문에 문자열 조작을 많이 하는 프로그램에서 이런 메소드를 많이 사용하면 Stirng 객체가 너무 많이 생기기 때문에 효율적이지 않다. 많은 객체를 만들게 되면 메모리도 많이 쓰게 되고, 프로그램의 성능도 떨어지기 때문이다. 이럴 때에는 문자열 조작을 적합하게 하는 이 클래스들을 사용하는 것이 좋다.


StringBuilder sb01 = new StringBuilder("Hello");

StringBuffer sb02 = new StringBuffer("Good!!");


가변의 문자열을 저장하며, 프로그래머가 변경하고자 하는 대로 원본 문자열에 그대로 반영된다. StringBuffer 와 StringBuilder 객체는 문자나 문자열을 중간에 삽입하거나 삭제하기 위한 공간을 미리 가지고 있다. 따라서 필요한 공간보다 더 많이 할당 받는다(16 문자를 더 받는다). 그렇기 때문에 Stirng 클래스에서 제공되었던 length() 메소드외에 capacity()란 메소드가 제공된다.


StringBuilder sb01 = new StringBuilder("Hello");

System.out.println(sb01);

System.out.println(sb01.length());

System.out.println(sb01.capacity()); 


5-1 StringBuffer 클래스 와 StringBuilder 클래스 차이

StringBuffer 클래스는 동기화가 된다. 하지만 StringBuilder 클래스는 동기화가 되지 않는다. 즉 멀티 쓰레드 환경이라면 StringBuffer 클래스이고 그렇지 않다면 StringBuilder 클래스를 쓰는 것이 바람직하다. 하지만 넷빈은 StirngBuffer을 쓰면 경고 뜬다. StirngBuilder으로 대체 되었다고 ㅎㅎ;

 

5-2 StringBuffer Method 와 StringBuilder Method

a 역시 어떤 메소드가 있는지만 가볍게 보규 skip 필요할때 API Go!