- 1. 유니코드 (Unicode):
- 유니코드는 전 세계의 문자에 대해 고유한 숫자 코드(코드 포인트)를 할당하는 문자 집합입니다.
- 예를 들어, 한글 "가"는 U+AC00이라는 코드 포인트를 가지고 있습니다.
- 유니코드는 문자와 코드 포인트를 1:1로 매핑한 코드표입니다. 즉, 유니코드는 "문자"를 숫자로 표현하는 시스템입니다.
public class UnicodeExample {
public static void main(String[] args) throws Exception {
String text = "가";
// "가"의 유니코드 값 확인
int unicodeValue = text.codePointAt(0);
System.out.println("유니코드 값: U+" + Integer.toHexString(unicodeValue).toUpperCase()); // 출력: U+AC00
// UTF-8 바이트 배열로 변환
byte[] utf8Bytes = text.getBytes("UTF-8");
for (byte b : utf8Bytes) {
System.out.printf("%02X ", b); // 출력: EA B0 80
}
}
}
- "가"의 유니코드 값은 U+AC00이고, 이를 UTF-8로 변환하면 EA B0 80이라는 3바이트 바이트 코드로 저장됩니다.
- 유니코드는 문자와 그 코드를 매핑하는 코드표이며, 문자 자체는 숫자로 표현됩니다.
- UTF-8 (Unicode Transformation Format - 8bit):
- UTF-8은 유니코드 문자 집합을 바이트로 인코딩하는 방식입니다.
- UTF-8은 1~4 바이트로 문자를 인코딩할 수 있는 가변 길이 방식을 사용합니다.
- 1바이트: ASCII 문자 (예: 영어 대소문자, 숫자 등)
- 2~4바이트: 다른 문자들 (예: 한글, 아시아 문자는 대부분 3바이트)
- UTF-8의 특징:
- ASCII와 호환됩니다.
- 가변 길이 인코딩: 문자에 따라 바이트 수가 달라집니다.
- 유니코드를 표현하는 구체적인 방법입니다.
UTF-8 문자 데이터의 인코딩 방식(데이터를 바이너리로 변환하는 것)을 말하며 직렬화는 객체(문자 뿐만 아니라 다양한 데이터 구조 포함) 를 바이트 스트림으로 변환하는 더 일반적인 과정이다.
객체 직렬화
자바 객체 직렬화 (Serializaton) 는 메모리에 있는 객체 인스턴스를 바이트 스트림으로 변환하여 파일에 저장하거나 네트워크를 통해 전송 할 수 있도록 하는 기능이다.
- 직렬화(Serialization)는 객체를 바이트 스트림으로 변환하는 과정입니다.
- 직렬화된 객체는 파일 시스템에 저장하거나 네트워크를 통해 전송할 수 있습니다.
- 직렬화된 객체는 다시 역직렬화(Deserialization)를 통해 원래의 객체로 복원될 수 있습니다.
UTF-8 vs 직렬화
비교
특징 | UTF-8 인코딩 | 직렬화 |
변환 대상 | 텍스트 (문자 데이터) | 객체, 구조화된 데이터 |
결과물 | 텍스트 → 바이너리 (가변 길이 바이트 시퀀스) | 객체 → 바이너리 데이터 |
사용 사례 | 파일 저장, 네트워크 전송 (예: JSON, XML) | Java 객체 저장, 전송 (예: Serializable) |
표준화 여부 | 국제 표준(UTF-8은 Unicode 표준의 일부) | 언어별로 구현(Java, Protocol Buffers 등) |
4. 정리:
개념설명
유니코드 | 전 세계의 문자에 대해 고유한 숫자 코드(코드 포인트)를 할당한 문자 표준. 예: "가" → U+AC00 |
UTF-8 | 유니코드를 바이트로 인코딩하는 방식. 가변 길이 인코딩(1~4 바이트로 표현) |
직렬화 | 자바 객체를 바이트 스트림으로 변환하는 과정. 파일 저장, 네트워크 전송 등에 사용 |
역직렬화 | 직렬화된 바이트 스트림을 다시 원래 객체로 복원하는 과정 |
핵심 요약:
- 유니코드: 문자에 고유한 숫자 코드를 부여하는 문자 집합.
- UTF-8: 유니코드를 바이트로 변환하는 가변 길이 인코딩 방식.
- 직렬화: 객체를 바이트 스트림으로 변환하여 파일이나 네트워크로 저장하거나 전송하는 방법.
객체 직렬화 덕분에 객체를 매우 편리하게 저장하고 불러올 수 있었다.
객체 직렬화를 사용하며 객체를 바이트로 변환 할 수 있어, 모든 종류의 스트림에 전달 할 수 있다. 이는 파일 저장하는 것만 아니라 네트워크를 통해 객체를 전송하는 것도 가능하게 한다. 이러한 특성 때문에 초기에는 분산 시스템에서 활용되었다.
그러나 객체 직렬화는 1990년대에 등장한 기술로, 초창기에는 인기가 있었지만 시간이 지나면서 여러 단점이 드러났다.
또한 대안 기술이 등장하면서 현재는 객체 직렬화를 거의 사용하지 않는다.
XML, JSON, 데이터베이스
객체와 같은 구조화된 데이터를 컴퓨터 간에 서로 주고 받을 때 사용하는 데이터 형식이 어떻게 발전해왔는지 알아 보자
- 객체 직렬화의 한계 객체 직렬화를 사용하지 않는 이유
- 버전 관리의 어려움
- 클래스 구조가 변경되면 이전에 직렬화된 객체와의 호환성 문제가 발생한다.
- serialVersionUID 관리가 복잡하다.
- 플랫폼 종속성
- 자바 직렬화는 자바 플랫폼에 종속적이어서 다른 언어나 시스템과의 상호 운용성이 떨어진다.
- 성능 이슈
- 직렬화/역직렬화 과정이 상대적으로 느리고 리소스를 많이 사용한다.
- 유연성 부족
- 직렬화된 형식을 커스터마이즈하기 어렵다.
- 크기 효율성
- 직렬화된 데이터의 크기가 상대적으로 크다.
- 버전 관리의 어려움
객체 직렬화의 대안1 - XML
<member>
<id>id1</id>
<name>name1</name>
<age>20</age>
</member>
플랫폼 종속성 문제를 해결하기 위해 2000년대 초반에 XML이라는 기술이 인기를 끌었다. 하지만 XML은 매우 유연하고 강력했지만 , 복잡성과 무거움이라는 문제가 있었다. 태그를 포함한 XML 문서의 크키가 커서 네트워크 전송 비용도 증가했다.
객체 직렬화의 대안2 - JSON
{ "member": { "id": "id1", "name": "name1", "age": 20 }
JSON은 가볍고 간결하며 , 자바스크립트와의 자연스러운 호환성 덕분에 웹 개발자들 사이에서 빠르게 확산되었다.
2000년대 후반, 웹 API와 RESTful 서비스가 대중화되면서 JSON은 표준 데이터 교환 포맷으로 자리 잡았다.
- 자바 객체 직렬화는 대부분 사용하지 않는다.
- JSON이 사실상 표준이다. JSON을 먼저 고려하자
- 성능 최적화가 매우 중요하다면 Protobuf, Avro 같은 기술을 고려하자. (대부분 JSON만 사용해도 충분하다)
참고자료 : 인프런 실전자바 고급 2편, 쳇 gpt
'JAVA' 카테고리의 다른 글
[JAVA] iterator 순회 중 만난 ConcurrentModificationException (1) | 2024.11.20 |
---|---|
[JAVA ]Set , Map 알아보기, 로드 팩터 (Load Factor)와 HashSet의 리해싱 (0) | 2024.11.19 |
[JAVA] String intern() (1) | 2024.11.15 |
[JAVA] 동기화 - synchronized (1) | 2024.11.13 |
[JAVA] 스레드 Interrupted (0) | 2024.11.13 |