자바

JAVA 자바 String 클래스 : String 생성자 /// 메서드 - 문자 추출 charAt(), 문자열 비교 equals(), 문자열을 바이트 배열로 변환getBytes()

알통몬_ 2017. 3. 15. 10:37
반응형

안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^ 

String 생성자

문자열은 String 클래스의 인스턴스로 관리됩니다. 

소스 상에서 문자열 리터럴은 String 객체로 자동 생성됩니다. 

또한 String 클래스의 다양한 생성자를 이용해서 직접 String 객체를 생성할 수도 있습니다.

 String 클래스는 Deprecated 된 생성자를 제외하면 13개 정도의 생성자를 제공합니다. 

Deprecated는 현재 버전 이후로는 사용하지 말라는 의미를 담고 있습니다. 

어떤 생성자를 이용해서 String 객체를 생성할지는 제공되는 매개값의 타입에 달려있습니다. 

아래 생성자들은 사용되는 빈도 수가 높은 생성자들입니다. 

파일의 내용을 읽거나 네트워크를 통해 받은 데이터는 보통 byte[] 배열이므로 이것을 문자열로 변환하기 위해 사용됩니다.


//배열 전체를 String 객체로 생성

String str = new String(byte[] bytes);

//지정한 문자셋으로 인코딩

String str = new String(byte[] bytes, String charsetName);


//배열의 offset 인덱스 위치부터 length만큼 String 객체로 생성

String str = new String(byte[] bytes,int offset, int length);

//지정한 문자셋으로 인코딩

String str = new String(byte[] bytes,int offset, int length, String charsetName);


바이트 배열을 문자열로 변환하는 예제를 보겠습니다.

public class ByteToStringExample {

public static void main(String[] args) {

byte[] bytes = { 72, 101, 108, 108, 111, 32, 74, 97, 118, 97  };

String str1 = new String(bytes);

System.out.println(str1);

String str2 = new String(bytes, 6, 4);

System.out.println(str2);

}

 

}


키보드로 읽은 바이트 배열을 문자열로 변환하는 예제. 

import java.io.IOException;


public class KeyboardToStringExample {

public static void main(String[] args) throws IOException {

byte[] bytes = new byte[100];

System.out.print("입력: ");

int readByteNo = System.in.read(bytes);


String str = new String(bytes, 0, readByteNo-2);//바이트를 배열로 변환,readByteNo-2  System.out.println(str);                             이유는 엔터키인 \r \n은 문자열로 

                                                                    만들 필요가 없기 때문입니다.

}

 

}


System.in.read() 메서드는 키보드에서 입력한 내용을 매개값으로 주어진 바이트 배열에 저장하고 읽은 바이트 수를 리턴합니다. 

 영어는 1바이트이고 한글이나 기타 다른 나라언어는 2바이트로 표현됩니다. 

때문에 입력된 문자 수와 읽은 바이트 수는 다를 수 있습니다. 


=======================================================================================


String 메서드

 사용 빈도수가 높은 메서드

 


문자 추출 charAt()

 매개값으로 주어진 인덱스의 문자를 리턴하는 매서드

 인덱스란 배열의 인덱스와 마찬가지로 길이-1까지의 번호입니다.

ex) String name = "네이버 블로그";

                      0 1 2 3 4 5 6

  char val = name.charAt(4);

라고 하면 charAt(4)는 인덱스에서 4번째 있는 문자를 말합니다. name에서 '블'을 가리킵니다.



문자열 비교 equals()

 문자열을 == 연산자로 비교하게 되면 각 변수에 저장된 번지를 비교하기 때문에 

원하지 않는 결과를 얻는 경우가 생깁니다.

그냥 두 문자의 문자열 만을 비교하고 싶다면 equals() 메서드를 사용해야 합니다.

원래 equals() 메서드는 Object 클래스의 번지 비교 메서드이지만 

String 클래스가 오버라이딩해서 문자열을 비교하도록 변경하였습니다.


== 연산자와 equals() 메서드의 차이를 보여주는 예제를 보겠습니다.

public class StringEqualsExample {

public static void main(String[] args) {

String strVar1 = new String("신민철");

String strVar2 = "신민철";


if(strVar1 == strVar2) {

System.out.println("같은 String 객체를 참조");

} else {

System.out.println("다른 String 객체를 참조");

}

if(strVar1.equals(strVar2)) {

System.out.println("같은 문자열을 가짐");

} else {

System.out.println("다른 문자열을 가짐");

}

}

 

}

 


문자열을 바이트 배열로 변환getBytes()

 네트워크로 문자열을 전송하거나 문자열을 암호화할 경우 문자열을 바이트 배열로 변환합니다.

문자열을 바이트 배열로 변환하는 메서드는 아래 두 가지가 있습니다. 

byte[] bytes = "문자열".getBytes();

byte[] bytes = "문자열".getBytes(Charset charset);

getBytes() 메서드는 시스템의 기본 문자셋으로 인코딩된 바이트 배열을 리턴합니다. 

특정 문자셋으로 인코딩된 바이트배열을 얻으려면 두 번째 메서드를 사용하면 됩니다.

getBytes(Charset charset);메서드는 잘못된 문자셋을 매개값으로 줄 경우 java.io.UnsupportedEncodingException예외가 발생하므로 예외처리가 필요.

try{

   byte[] bytes = "문자열".getBytes("EUC-KR");

   byte[] bytes = "문자열".getBytes("UTF-8");

}catch(UnsupportedEncodingException e) {

}

어느 문자셋으로 인코딩 하느냐에 따라 바이트 배열의 크기가 달라집니다. 

EUC-KR은 getBytes()와 마찬가지로 알파벳은 1바이트, 한글은 2바이트로 변환한고 

UTF-8은 알파벳은 1바이트 한글은 3바이트로 변환합니다.


예제)

import java.io.UnsupportedEncodingException;


public class StringGetBytesExample {

public static void main(String[] args) {

String str = "안녕하세요";

byte[] bytes1 = str.getBytes();

System.out.println("bytes1.length: " + bytes1.length);

String str1 = new String(bytes1);

System.out.println("bytes1->String: " + str1);

try {

byte[] bytes2 = str.getBytes("EUC-KR");

System.out.println("bytes2.length: " + bytes2.length);

String str2 = new String(bytes2, "EUC-KR");

System.out.println("bytes2->String: " + str2);

byte[] bytes3 = str.getBytes("UTF-8");

System.out.println("bytes3.length: " + bytes3.length);

String str3 = new String(bytes3, "UTF-8");

System.out.println("bytes3->String: " + str3);

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

}

 

}

 

바이트 배열을 다시 문자열로 디코딩할 때는 어떤 문자셋으로 인코딩된 바이트 배열이냐에 따라 다릅니다. 단순히 String(byte[] bytes)생성자로 디코딩하면 시스템의 기본 문자셋을 이용합니다. 시스템과 다른 문자셋으로 인코딩된 바이트 배열의 경우 아래 코드를 사용하면 됩니다.
String str = new String(byte[] bytes, String CharsetName);


반응형