본문 바로가기

Programming/Java

[java] String과 getBytes 메소드

반응형

오픈소스를 보다가 다음과 같은 메소드를 사용한 걸 발견했다.

byte[] res = text.getBytes("utf-8");

위 메소드를 보고 가장 처음 든 궁금증은 '왜 String을 바이트코드로 변경할까?' 였다.
궁금증을 해결하기 위해 우선 String의 getBytes 메소드가 어떤 메소드인지 찾아보았다.

String name = "김정환"; byte[] encodedName = name.getBytes("utf-8");

간단히 설명하자면, 유니코드 문자열(String)을 바이트코드로 인코딩 해주는 메소드이다.
만약 getBytes()의 인자로 캐릭터셋을 넘기지 않으면 사용자 플랫폼의 기본 charset으로 인코딩 된다.

Encodes this String into a sequence of bytes using the platform's default charset, storing the result into a new byte array.

만약 캐릭터셋을 넘겨주면 해당 캐릭터셋으로 인코딩을 하게 된다.

사용법은 위와 같은데 도대체 이게 왜 필요하고 어디에 사용되는걸까?
여러 자료를 찾던 도중 아래와 같은 내용을 볼 수 있었다.

DB 테이블의 charset이 latin1으로 되어 있을 경우, 한글로 된 정보를 테이블에 그대로 저장할 수 없다. 그대로 저장할 경우 정보가 손실된다.

DB 테이블의 charset이 latin1으로 되어 있을 경우, 한글로 된 정보를 테이블에 그대로 저장할 수 없다. 그대로 저장할 경우 정보가 손실된다.

위와 같은 경우, 테이블에 저장하기 위해서는 한글로 된 정보를 DB 테이블의 charset으로 변경하여 저장하여야 정보가 손실되지 않는다는 말이다. 이걸 코드로 간단히 작성해 보면 아래와 같다.

String name = "김정환"; String encodedName = null; try { encodedName = new String(name.getBytes("utf-8"), "latin1"); } catch (UnsupportedEncodingException e) { // .. exception }

위 코드는 
1. getBytes("utf-8")로 "김정환"이라는 이름을 바이트배열로 변환
2. 해당 바이트배열을 가지고 다시 "latin1" 캐릭터셋의 String을 생성하는 과정이다.

이제 이 String을 테이블에 저장하면 된다. 물론 이렇게 저장하면 테이블의 정보는 한글로 표시되지 않는다.
하지만, 정보가 손실된게 아니기 때문에 다시 디코딩을 하면 원래 한글 정보를 찾을수 있다.

String encodedName = "....."; // db에서 가져온 latin1 캐릭터셋의 String String decodedName = null; try { decodedName = new String(encodedName.getBytes("latin1"), "utf-8"); } catch (UnsupportedEncodingException e) { // .. exception }

DB에 저장하기 전 인코딩한 과정을 반대로 하면 디코딩을 할 수 있다. 즉, latin1 캐릭터셋의 바이트배열로 변환 후, 해당 배열을 가지고 utf-8 캐릭터셋의 String을 만든다.

위 내용들을 정리하자면, getBytes() 메소드는 인코딩 / 디코딩 과정에 필요한 바이트배열을 만드는 메소드라 생각할 수 있겠다.

DB 외에 또 무엇을 할 수 있을까? 암호화를 하는데에도 사용할 수 있지 않을까?

 

원문 : https://m.blog.naver.com/PostView.nhn?blogId=writer0713&logNo=220921933255&proxyReferer=https%3A%2F%2Fwww.google.com%2F

반응형