2018년 9월 23일 일요일

Java 문자를 ASCII코드로 표현하기

이번시간에는 Java에서 아스키코드를 사용하는 방법에 대해서 살펴보겠다.

그전에 한가지 스트림이라는 지식에 대해 살펴보고 진행하자.

우리가 작성하는 문자들은 데이터들은 컴퓨터가 문자하나하나를 인식할 수 있을까?
다음의 예를 살펴보자.

 - Stream과정

① 'h'라는 문자를 키보드 클릭 → ②운영체제(OS)에 전달(동작 : 사용자가 키보드 'h' 클릭) → ③메모장에 'h'라는 문자를 보여줌

이 과정에서 컴퓨터가 h라는 데이터를 입력받은것을 어떻게 인식할 수 있을까?
바로 이 문자 h라는 것을 컴퓨터가 이해할 수 있도록 바이트단위로 변환시킨뒤 데이터가 전달되는 것이다. (Input Stream)
그리고 컴퓨터는 이것을 다시 사용자들이 인식할 수 있도록 바이트 단위로 표현된 문자를  원래의 값으로 변환시킨뒤 메모장 'h'라는 문자를 보이도록 하는 것이다.

즉, 입력/출력하는(InputStream / OutputStream) 동안에 컴퓨터들에게는 바이트 단위로 문자를 인식시키는것이다. 컴퓨터는 0과 1밖에 모르기 때문이다.
그리고 바이트 단위 → 문자형, 문자형 → 바이트 단위로 바꿔주는 것을 인코딩이라고 하며, 이 인코딩하는 다양한 방식들이 존재한다.
- 대표적으로 ASCII, Unicode, UTF-8 등이 있다.

- java에서 문자를 바이트 단위로 표현하기

예제 1) 문자와 숫자를 바이트 단위로 저장한 뒤 출력하기.
  1. package org.java.project;
  2.  
  3. public class Onebyte{
  4.     public static void main(String[] args) {
  5.  
  6.         byte byte_a = 'a';
  7.         byte byte_b = 'b';
  8.        
  9.         byte byte_A = 'A';
  10.         byte byte_B = 'B';
  11.        
  12.         byte byte_0 = '0';
  13.         byte byte_9 = '9';
  14.         System.out.println("문자 a를 바이트 단위로 표현 : " + byte_a);
  15.         System.out.println("문자 b를 바이트 단위로 표현 : " + byte_b);
  16.         System.out.print("\n");
  17.         System.out.println("문자 A를 바이트 단위로 표현 : " + byte_A);
  18.         System.out.println("문자 B를 바이트 단위로 표현 : " + byte_B);
  19.         System.out.print("\n");
  20.         System.out.println("숫자 0을 바이트 단위로 표현 : " + byte_0);
  21.         System.out.println("숫자 9를 바이트 단위로 표현 : " + byte_9);
  22.     }
  23. }
▶실행결과











: 실행결과 인코딩방식은 ASCII이며, 문자와 숫자가 해당하는 ASCII코드표에 있는 값의 데이터를 출력한다. 그래서 숫자로 입력받은 값 byte_0과 byte_9는 사실 숫자가 아닌 문자 '0', 문자 '9'로 인식하여 아스키 코드표에 해당하는 값 0~9는 아스키코드표에서 48~57에 으로 저장한다.
0을 아스키코드값 : 48( 48 : 2진수 0011 0000으로 컴퓨터가 인식)
9를 아스키코드값 : 57( 57 : 2진수 0011 1001으로 컴퓨터가 인식)

예제 2) 한문자씩 바이트코드 데이터형의 배열에 저장한 뒤 출력방법 - 1
  1. package org.java.project3.hanbat;
  2.  
  3. public class Onebyte{
  4.     public static void main(String[] args) {
  5.        
  6.         String str = "Hello world";
  7.         int j = 0;
  8.        
  9.         byte[] byte_str = new byte[str.length()]; // 문자열 갯수만큼 바이트코드로 인식함.
  10.        
  11.         // 문자열의 한문자씩 byte단위로 byte배열 byte_str에 저장하기.
  12.         for(int i = 0; i < str.length(); i++)
  13.             byte_str[i] = (byte)str.charAt(i); //바이트의 단위로 인식할 수 있게 형변환.
  14.        
  15.         // 자료형 문자, byte단위의 문자 비교하기  
  16.         for(byte value : byte_str)
  17.             System.out.println(str.charAt(j++) + " : " + value);       
  18.     }
  19. }
▶실행결과




















예제 3) 문자열을 바이트코드로 인코딩한뒤 바이트코드를 문자열로 디코딩하기
  1. package org.java.project;
  2. public class Onebyte{
  3.     public static void main(String[] args) {
  4.         String Text = "Hello World";
  5.         byte[] byteText = Text.getBytes(); // 문자열을 바이트코드로 변환시켜서 배열 하나하나에 저장시킴.
  6.        
  7.         System.out.println("---문자열과, 바이트코드로 인코딩한 결과---");
  8.         System.out.println("Text : " + Text);
  9.         System.out.println("byte_Text : " + byteText); // 바이트코드로 인코딩한 배열의 주소를 출력하고있음.
  10.         System.out.println("byte_Text.toString() : " + byteText.toString());
  11.        
  12.         System.out.println("\r---문자를 바이트코드로 표현한 결과---");
  13.         for(int i=0; i<Text.length(); i++)
  14.             System.out.println("Character [" + Text.charAt(i) + "] To ASCII Code : " + byteText[i]);
  15.        
  16.         String byteToText = new String(byteText);
  17.         System.out.println("\r---바이트코드에서 문자열로 디코딩한 결과---");
  18.         System.out.println(byteToText);
  19.     }  
  20. }
▶실행결과




















이로써 자바에서는 문자에서 바이트코드로 인코딩할때 8bit로 2의 7승까지 표현 할 수 있는 ASCII방식을 사용한다는 것을 살펴보았다.

댓글 없음:

댓글 쓰기

[Java] N-I/O(Non-Blocking) 파일 읽기 쓰기 - GatheringByteChannel, ScatteringByteChannel, ByteBuffer 사용.

우리는 지금까지 다음과 같이 살펴보았다. 1.  InputStream / OutputStream : 입, 출력 스트림을 바이트로 처리하여 읽기, 쓰기. 2.  FileInputStream / FileOutputStream : 입, 출력 스트림을 ...