🔥 네트워크에서 주소(Address)와 전송 방식이 중요한 이유

네트워크에서 데이터를 송수신할 때 어떤 기기(호스트)로 데이터를 전송할지를 결정해야 합니다.
이를 위해 네트워크에서는 주소(Address) 개념이 필수적으로 사용됩니다.

📌 주소(Address)란?

네트워크에서 송신자(보내는 쪽)와 수신자(받는 쪽)를 특정하는 정보

  • 주소가 없다면 데이터를 어디로 보내야 할지 알 수 없음
  • 네트워크에서는 다양한 주소 체계를 사용하여 데이터가 정확한 목적지에 도달하도록 설계

네트워크에서 사용되는 대표적인 주소 체계 1️⃣ IP 주소 → 인터넷에서 가장 많이 사용되는 주소
2️⃣ MAC 주소 → 로컬 네트워크에서 사용되는 장치 고유 주소

📌 이러한 주소 정보는 네트워크 패킷의 "헤더(Header)"에 포함되어 있음
📌 패킷이 송수신될 때 반드시 주소 정보가 필요함


🏗 네트워크 패킷(Packet)과 헤더(Header)의 역할

네트워크에서 데이터를 전송할 때 패킷(Packet) 단위로 전달됨
패킷은 크게 헤더(Header), 페이로드(Payload), 트레일러(Trailer) 로 구성됨.

패킷 구조

[Header] | [Payload] | [Trailer]
  • 헤더(Header): 송신자/수신자 주소, 패킷 번호 등 제어 정보 포함
  • 페이로드(Payload): 실제 전송할 데이터
  • 트레일러(Trailer): 오류 검출 정보

📌 헤더(Header)에 담기는 대표적인 정보송신자 주소 (Sender Address) → 패킷을 보낸 기기의 주소
수신자 주소 (Receiver Address) → 패킷을 받을 기기의 주소
기타 제어 정보 → 패킷 번호, 프로토콜 정보 등


🛠 네트워크의 전송 방식 (송수신 유형)

네트워크에서는 데이터를 전송할 때 수신지를 특정하는 방식이 다릅니다.
주로 네 가지 전송 방식이 존재합니다.

1️⃣ 유니캐스트(Unicast) - 1:1 전송

📌 특징

  • 네트워크에서 가장 일반적인 데이터 전송 방식
  • 송신자가 특정한 하나의 수신자에게만 데이터를 전송

📌 예제

  • 웹 브라우징 (내 PC → 구글 서버)
  • 이메일 전송 (내 PC → 상대방 이메일 서버)
[송신자] → [수신자]

일반적인 네트워크 통신 방식
특정 기기 간의 개별 통신이 필요할 때 사용


2️⃣ 브로드캐스트(Broadcast) - 1:N 전송 (모든 호스트에게 전송)

📌 특징

  • 하나의 기기가 같은 네트워크에 연결된 모든 기기에게 데이터를 전송
  • 네트워크 내부에서만 사용되며, 인터넷에서는 사용되지 않음
  • 로컬 네트워크에서 정보를 공유할 때 사용

📌 예제

  • DHCP 요청 (IP 자동 할당)
  • ARP(Address Resolution Protocol) (MAC 주소 확인)
[송신자] → [네트워크 내 모든 수신자]

네트워크 내부에서 특정 정보 공유에 유용
하지만 불필요한 트래픽을 발생시킬 수 있음

📌 브로드캐스트 도메인(Broadcast Domain)이란?

  • 브로드캐스트 메시지가 전달되는 네트워크 범위
  • 보통 하나의 LAN(Local Area Network) 을 의미
  • 라우터를 지나지 않음 (즉, 같은 네트워크 안에서만 브로드캐스트 가능)

3️⃣ 멀티캐스트(Multicast) - 1:특정 그룹 전송

📌 특징

  • 특정한 그룹(Group)에게만 데이터를 전송
  • 유니캐스트와 브로드캐스트의 중간 형태

📌 예제

  • 화상 회의 (Zoom, Webex 등)
  • 스트리밍 서비스 (IPTV, 스포츠 중계 등)
[송신자] → [특정 그룹]

브로드캐스트보다 효율적이고, 특정 그룹만 데이터를 받을 수 있음
멀티캐스트 그룹 주소를 활용하여 특정 기기만 데이터 수신 가능


4️⃣ 애니캐스트(Anycast) - 1:가장 가까운 서버로 전송

📌 특징

  • 여러 개의 서버 중 가장 가까운 서버로 데이터 전송
  • DNS, CDN(Content Delivery Network) 같은 서비스에서 많이 사용됨

📌 예제

  • DNS 서버 요청 (Google DNS - 8.8.8.8)
  • Cloudflare CDN (웹사이트 로딩 속도 향상)
[송신자] → [가장 가까운 서버]

빠른 응답 속도를 위해 최적의 서버로 연결
글로벌 서비스에서 네트워크 부하를 줄이기 위해 사용


🎯 정리: 네트워크에서의 주소와 전송 방식

📌 네트워크에서 주소(Address)는 송수신지를 특정하는 핵심 정보
📌 헤더(Header)에 송신자/수신자 정보가 포함됨


📌 전송 방식은 네 가지로 구분됨
유니캐스트(Unicast)1:1 전송 (웹 브라우징, 이메일)
브로드캐스트(Broadcast)1:N 전송 (DHCP, ARP 요청)
멀티캐스트(Multicast)1:특정 그룹 전송 (화상 회의, IPTV 스트리밍)
애니캐스트(Anycast)1:가장 가까운 서버로 전송 (DNS 요청, CDN)

 

📌 유니캐스트와 브로드캐스트는 가장 많이 사용되는 방식
📌 멀티캐스트와 애니캐스트는 효율적인 네트워크 트래픽 관리를 위해 활용


이 블로그 포스트를 통해 배운 점

  • 네트워크에서 주소(Address)의 역할과 중요성
  • 패킷(Packet) 구조와 헤더(Header)에 포함되는 정보
  • 네트워크 전송 방식 (유니캐스트, 브로드캐스트, 멀티캐스트, 애니캐스트)
  • 실무에서 사용되는 주요 네트워크 프로토콜의 전송 방식

 

 

출처:
혼자공부하는 네트워크 - 강민철

🔥 네트워크의 분류 기준

이전 강에서는 네트워크의 기본 개념과 구조를 살펴보았습니다.
이번엔 네트워크를 어떻게 분류할 수 있는지에 대해 학습합니다.

 

📌 네트워크 분류 기준은 크게 두 가지로 나뉩니다.
1️⃣ 범위에 따른 분류 (LAN vs WAN)
2️⃣ 메시지 교환 방식에 따른 분류 (회선 교환 vs 패킷 교환)


🏗 1. 범위에 따른 네트워크 분류

네트워크는 연결된 범위에 따라 크게 두 가지로 나뉩니다.

1️⃣ LAN (Local Area Network, 근거리 통신망)

📌 특징

  • 근거리에 있는 기기들을 연결하는 네트워크
  • 한정된 공간 내에서 구축 (가정, 사무실, 학교 등)
  • 빠른 속도와 낮은 지연 시간(Low Latency)
  • 개발자가 관리하는 네트워크 대부분이 LAN

📌 예제

  • 집에서 사용하는 Wi-Fi 네트워크
  • 회사 내부의 사무실 네트워크
  • 대학교 캠퍼스 네트워크
[노트북] --- Wi-Fi --- [공유기] --- 유선 --- [사무실 네트워크]

LAN은 보통 한정된 공간에서 한 개인이나 조직이 구축한 네트워크를 의미
개발자가 구축하고 관리하는 대부분의 네트워크는 LAN


2️⃣ WAN (Wide Area Network, 광역 통신망)

📌 특징

  • 멀리 떨어진 지역까지 연결하는 네트워크
  • 다른 LAN과 연결하여 데이터를 주고받는 역할
  • 인터넷이 대표적인 WAN의 예시
  • 주로 인터넷 서비스 제공업체(ISP)가 구축하고 관리

📌 예제

  • 인터넷 (KT, SKT, LG U+ 등 ISP가 제공)
  • 기업 간 전용 회선
  • 국가 간 연결된 해저 케이블
[사무실 LAN] --- 인터넷(ISP) --- [해외 데이터 센터 LAN]

WAN은 주로 ISP(인터넷 서비스 제공업체)가 관리
인터넷을 통해 LAN끼리 연결될 때 WAN이 사용됨


🛠 2. 메시지 교환 방식에 따른 네트워크 분류

네트워크에서 데이터(메시지)를 주고받는 방식에 따라 크게 두 가지로 나뉩니다.

1️⃣ 회선 교환 방식 (Circuit Switching)

📌 특징

  • 메시지를 주고받기 전에 고정된 경로(회선)를 먼저 설정
  • 설정된 회선을 통해서만 데이터를 전송
  • 전송로를 예약하고 사용하기 때문에 전송 속도가 일정함

📌 예제

  • 전통적인 유선 전화망 (PSTN, Public Switched Telephone Network)
  • 전화 통화를 할 때, 상대방과 연결되면 하나의 회선이 유지
  • 통화가 끝나기 전까지 다른 데이터는 해당 회선을 사용하지 못함
[A 사용자] ----- (고정된 회선) ----- [B 사용자]
 

장점:

  • 전송 속도가 일정하고 안정적
  • 실시간 음성 통신에 적합 (전화, 음성 회의 등)

단점:

  • 회선이 예약된 동안 비효율적 (데이터가 전송되지 않더라도 회선 점유)
  • 네트워크 자원 낭비가 발생할 가능성이 있음

2️⃣ 패킷 교환 방식 (Packet Switching)

📌 특징

  • 메시지를 여러 개의 작은 패킷(Packet) 단위로 쪼개서 전송
  • 각 패킷은 최적의 경로를 찾아 독립적으로 이동
  • 네트워크의 이용 효율이 높음

📌 예제

  • 인터넷 (TCP/IP 기반 네트워크)
  • 웹사이트 요청, 파일 다운로드, 이메일 송수신
[A 사용자] ----> [라우터] ----> [B 사용자]  
(A → B로 패킷이 여러 경로를 통해 이동)

장점:

  • 네트워크 자원을 효율적으로 사용 (여러 사용자가 하나의 네트워크를 공유 가능)
  • 대용량 파일 전송 가능 (예: 영화 다운로드)
  • 인터넷에서 널리 사용되는 방식

단점:

  • 패킷이 다른 경로로 이동하므로, 도착 순서가 다를 수 있음
  • 일시적인 네트워크 지연(Jitter) 가능

📌 현대 인터넷 환경에서는 대부분 패킷 교환 방식이 사용됨
📌 웹 개발자라면 패킷 구조와 데이터 흐름을 이해하는 것이 중요


🎯 정리: 네트워크의 분류

📌 네트워크는 범위와 메시지 교환 방식에 따라 분류 가능

범위에 따른 네트워크 분류

분류 설명 예제
LAN (근거리 네트워크) 한정된 공간 내에서 연결 가정, 사무실 Wi-Fi
WAN (광역 네트워크) 멀리 떨어진 지역까지 연결 인터넷 (ISP 제공)

 

메시지 교환 방식에 따른 분류

분류 설명 예제
회선 교환 방식 고정된 회선을 먼저 설정 후 메시지 전송 전화 통화 (PSTN)
패킷 교환 방식 데이터를 여러 패킷으로 나눠 최적 경로로 전송 인터넷 (TCP/IP)

📌 오늘날 인터넷에서 사용되는 네트워크는 "패킷 교환 방식"
📌 앞으로의 강의에서는 패킷의 구조와 데이터 흐름을 집중적으로 다룰 예정


이 블로그 포스트를 통해 배운 점

  • 네트워크의 기본적인 분류 (LAN vs WAN)
  • 메시지 교환 방식 (회선 교환 vs 패킷 교환)
  • 현대 인터넷이 패킷 교환 방식을 사용하는 이유
  • 개발자가 네트워크의 흐름을 이해해야 하는 이유

 

출처:
혼자공부하는 네트워크 - 강민철

🔥 네트워크를 거시적으로 바라보기

컴퓨터 네트워크를 학습하기 전에, 네트워크의 기본 개념과 큰 그림을 먼저 이해해야 합니다.
이번엔 네트워크의 기본 구조핵심 요소를 거시적으로 살펴봅니다.

 

📌 네트워크를 거시적으로 이해해야 하는 이유
✅ 네트워크는 데이터가 어떻게 전달되는지 파악하는 핵심 요소
✅ 전체 구조를 이해하면, 세부적인 기술과 프로토콜을 쉽게 학습할 수 있음
✅ 네트워크의 핵심 개념이 계속 반복되므로 처음부터 모든 용어를 암기할 필요 없음


🏗 네트워크의 기본 구조

1️⃣ 네트워크는 그래프(Graph) 형태를 띔

네트워크는 자료구조에서의 "그래프(Graph)" 형태로 표현할 수 있습니다.
즉, 노드(Node)와 간선(Edge)로 이루어진 연결 구조를 가집니다.

 

🔹 그래프 구조 이해하기

  • 노드(Node) = 컴퓨터, 서버, 스마트폰, 네트워크 장비 등
  • 간선(Edge) = 유선 또는 무선 연결 (LAN, Wi-Fi, 광케이블 등)

 

📌 그래프 형태의 네트워크 예시

[스마트폰] --- Wi-Fi --- [공유기] --- 유선 --- [인터넷]

노드와 간선이 연결되며 네트워크를 형성
네트워크는 노드와 간선의 조합으로 동작


2️⃣ 네트워크의 주요 구성 요소

📌 네트워크는 기본적으로 네 가지 요소로 구성됨
1. 호스트 (Host) → 사용자가 직접 사용하는 기기 (컴퓨터, 스마트폰, 서버 등)
2. 네트워크 장비 → 라우터, 스위치, 허브 등 중간 노드 역할
3. 통신 매체 → 유선(LAN, 광케이블) / 무선(Wi-Fi, 5G)
4. 메시지 (Message) → 네트워크에서 주고받는 데이터

 

🔹 네트워크의 구조를 쉽게 이해하려면?
가장자리에 위치한 노드호스트 (Host)
중간에 위치한 노드네트워크 장비 (Network Device)
호스트와 장비를 연결하는 선통신 매체 (유선/무선)
연결된 노드들이 주고받는 데이터메시지 (Message)


3️⃣ 호스트 (Host)의 개념

📌 호스트(Host)란?

  • 네트워크에서 최초로 데이터를 송신하거나 최종적으로 데이터를 수신하는 장치
  • 사용자의 컴퓨터, 스마트폰, 서버 등이 대표적인 예

🔹 예제: 이메일 전송 과정

[스마트폰] → (이메일 전송) → [인터넷] → [상대방 컴퓨터]
 
이메일을 전송한 스마트폰 = 호스트

이메일을 수신한 상대방 컴퓨터 = 호스트


4️⃣ 클라이언트(Client)와 서버(Server)

📌 클라이언트(Client)와 서버(Server) 개념

  • 클라이언트 → 요청을 보내는 호스트
  • 서버 → 요청을 처리하고 응답을 보내는 호스트

🔹 클라이언트-서버 모델 예시

[웹 브라우저] → (HTTP 요청) → [웹 서버] → (응답) → [웹 브라우저]

웹 브라우저(Chrome, Edge 등) = 클라이언트
웹 페이지를 제공하는 서버(AWS, Nginx 등) = 서버

 

📌 중요한 점:

  • 클라이언트와 서버는 역할이 다를 뿐, 같은 장비에서 동작 가능
  • 하나의 컴퓨터가 클라이언트이면서 서버 역할도 할 수 있음
  • 예) 개발자가 자신의 노트북에서 서버와 클라이언트를 동시에 실행 가능

5️⃣ 네트워크 장비 (Network Devices)

📌 네트워크 장비란?
네트워크 내에서 데이터가 안전하고 안정적으로 전달되도록 돕는 장치

  • 라우터(Router) → 네트워크 간 데이터 전송을 담당
  • 스위치(Switch) → 같은 네트워크 내에서 데이터 전송
  • 방화벽(Firewall) → 보안 및 네트워크 보호 역할

네트워크 장비는 중간 노드 역할을 수행
호스트 간의 통신을 원활하게 하기 위해 필수적인 요소


6️⃣ 통신 매체 (Transmission Medium)

📌 통신 매체란?
네트워크에서 데이터를 전송하는 물리적인 연결 방식

  • 유선 통신 매체 (LAN, 광케이블, 이더넷 등)
  • 무선 통신 매체 (Wi-Fi, 블루투스, 5G 등)

📌 왜 개발자가 통신 매체를 알아야 할까?
✅ 네트워크 속도와 성능에 영향을 줌
✅ 개발한 프로그램이 특정 네트워크 환경에서 어떻게 동작할지 예측 가능
✅ 와이파이와 이더넷의 차이를 이해하면 최적화된 네트워크 설정이 가능


7️⃣ 네트워크에서 주고받는 메시지 (Message)

📌 메시지란?
네트워크에서 호스트 간에 주고받는 데이터

  • 웹 페이지 요청 및 응답 (HTTP Request / Response)
  • 이메일 (SMTP, IMAP)
  • 파일 전송 (FTP)
  • 영상 스트리밍 (RTSP)

네트워크를 통해 다양한 형태의 데이터가 전송됨
5장에서 HTTP 및 다양한 메시지 형식에 대해 학습할 예정


🏁 정리: 네트워크의 기본 구조

📌 네트워크는 그래프(Graph) 형태의 구조를 가짐


📌 네트워크의 주요 요소
호스트 (Host) → 데이터를 송수신하는 기기
네트워크 장비 (Router, Switch) → 데이터 전달을 돕는 중간 노드
통신 매체 (Wired, Wireless) → 데이터를 주고받는 경로
메시지 (Message) → 실제로 네트워크에서 전송되는 데이터

 

📌 클라이언트(Client)와 서버(Server)의 개념을 이해해야 함


📌 개발자가 네트워크 성능과 데이터 흐름을 이해하면 더욱 최적화된 프로그램 개발 가능

 

이 블로그 포스트를 통해 배운 점

  • 네트워크의 기본 구조와 그래프 개념
  • 네트워크의 주요 요소 (호스트, 네트워크 장비, 통신 매체, 메시지)
  • 클라이언트와 서버의 역할 및 상호 작용 방식
  • 개발자가 네트워크 개념을 이해해야 하는 이유

 

 

출처:
혼자공부하는 네트워크 - 강민철

🔥 컴퓨터 네트워크란?

컴퓨터 네트워크란 여러 개의 장치가 마치 그물처럼 서로 연결되어 정보를 주고받을 수 있는 통신망을 의미합니다.
쉽게 말해, 우리가 사용하는 인터넷도 하나의 거대한 컴퓨터 네트워크입니다.

 

📌 네트워크의 특징
그래프(Graph) 구조로 이루어짐

  • 네트워크는 자료구조 중 그래프 형태를 띄고 있음.
  • 노드(Node): 컴퓨터, 서버, 스마트폰 등 네트워크에 연결된 장치
  • 간선(Edge): 유무선 연결 매체 (LAN, Wi-Fi, 광케이블 등)

여러 개의 네트워크가 존재할 수 있음

  • 예를 들어, A 네트워크와 B 네트워크는 각각 독립적으로 존재 가능
  • 이러한 네트워크가 연결된 것이 "인터넷"

네트워크 간 통신이 가능

  • 같은 네트워크 내 통신뿐만 아니라,
  • 서로 다른 네트워크 간에도 데이터를 주고받을 수 있음.

🎯 왜 개발자는 네트워크를 배워야 할까?

오늘날 대부분의 프로그램은 네트워크와 연결되어 동작합니다.
즉, 네트워크 없이 사용할 수 있는 프로그램이 거의 없다는 것!
개발자가 네트워크를 잘 이해하면 프로그램 개발 및 유지보수 시 큰 도움이 됩니다.

개발자가 네트워크를 활용하는 경우

📌 1️⃣ 새로운 프로그램을 개발할 때

  • 네트워크 프로그래밍이 필수적
  • 예제: TCP, UDP, HTTP 등의 프로토콜을 활용하는 기능 개발
  • 공식 문서에서 네트워크 관련 내용을 이해해야 함
// 네트워크 소켓을 활용한 간단한 서버 코드 예제 (Java)
ServerSocket serverSocket = new ServerSocket(8080);
Socket clientSocket = serverSocket.accept();

 

📌 2️⃣ 기존 프로그램을 유지보수할 때

  • 네트워크 오류를 해결해야 하는 경우가 많음
  • 예제: 404 Not Found 오류가 발생했을 때 원인을 분석하고 수정
  • 네트워크 명령어 및 디버깅 도구 활용 (ex: ping, traceroute, Wireshark)
ping google.com   # 네트워크 연결 상태 확인
traceroute google.com  # 경로 추적

🛠 네트워크 지식이 필요한 실제 사례

웹 개발자:

  • API 통신 (REST API, GraphQL)
  • HTTP 요청 & 응답 처리
  • 쿠키, 세션, 인증 관련 개념 이해

서버 개발자:

  • 서버 간 데이터 전송 (TCP/IP, UDP)
  • 로드 밸런싱, 트래픽 관리
  • 데이터베이스 네트워크 연결 설정

보안 전문가:

  • 네트워크 패킷 분석
  • 방화벽, VPN 설정 및 보안 정책 수립

네트워크 엔지니어:

  • 네트워크 장비(스위치, 라우터) 설정
  • 기업 네트워크 구축 및 관리

📌 네트워크 관련 채용 공고 & 면접

많은 IT 기업들은 네트워크 관련 기초 지식을 평가합니다.

  • 기술 면접에서 네트워크 개념 질문 (TCP vs UDP, HTTP 상태 코드)
  • 코딩 테스트에서 API 개발 문제 출제
  • 실무에서 HTTP 통신 및 데이터 전송을 다룰 일이 많음

📌 예제: 기술 면접 질문

1️⃣ TCP와 UDP의 차이점은?
2️⃣ HTTP와 HTTPS의 차이점은?
3️⃣ 404 Not Found 오류는 언제 발생하는가?
4️⃣ 네트워크 패킷 캡처 도구(Wireshark) 사용법


🏁 결론: 네트워크를 공부해야 하는 이유

  • 네트워크는 현대 IT 기술의 핵심 개념
  • 대부분의 프로그램이 네트워크 기반으로 동작
  • 개발자로서 네트워크 개념을 이해하면 업무 생산성이 향상
  • 코딩 테스트 & 기술 면접에서도 자주 출제되는 중요 개념

📌 "컴퓨터 네트워크를 공부하는 것은 선택이 아니라 필수!" 🚀


이 블로그 포스트를 통해 배운 점

  • 컴퓨터 네트워크의 기본 개념 (그래프 구조, 인터넷)
  • 개발자가 네트워크 개념을 학습해야 하는 이유
  • 실제 개발 업무에서 네트워크가 어떻게 활용되는지
  • 네트워크 관련 채용 공고 및 면접에서 다뤄지는 주요 개념

 

출처:
혼자공부하는 네트워크 - 강민철

MurmurHash3

1. MurmurHash3란?

MurmurHash3는 높은 성능과 뛰어난 해시 품질을 제공하는 비암호학적 해시 함수이다.

원래 Austin Appleby에 의해 개발되었으며, 특히 해시 테이블과 같은 데이터 구조에서 균등한 해시 분포를 제공하는 데 최적화되어 있다.

자바에서는 Apache Commons Codec 또는 Guava 라이브러리를 활용하여 MurmurHash3을 사용할 수 있다.


2. MurmurHash3의 특징

  • 비암호학적 해시 함수: 보안이 아닌 빠르고 균일한 해싱을 목표로 함
  • 우수한 해시 분포: 충돌 가능성이 낮고, 데이터 분포가 고르게 퍼짐
  • 빠른 성능: CPU 친화적인 설계로 매우 빠르게 해시 값을 생성
  • 고정된 크기의 해시 출력: 32비트 또는 128비트 해시 값 제공
  • 엔디언(Endianness) 독립적: x86과 x64 아키텍처에서 일관된 결과 보장

3. MurmurHash3 구현 방법

3.1. Apache Commons Codec을 이용한 MurmurHash3

Apache Commons Codec 라이브러리는 MurmurHash3을 쉽게 사용할 수 있도록 제공한다.

Maven 의존성 추가

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.15</version>
</dependency>

Java 코드 예제

import org.apache.commons.codec.digest.MurmurHash3;

public class MurmurHashExample {
    public static void main(String[] args) {
        String input = "Hello, MurmurHash3!";
        int hash32 = MurmurHash3.hash32x86(input.getBytes());
        long[] hash128 = MurmurHash3.hash128x64(input.getBytes());

        System.out.println("32-bit Hash: " + hash32);
        System.out.println("128-bit Hash: " + hash128[0] + ", " + hash128[1]);
    }
}

3.2. Guava 라이브러리를 이용한 MurmurHash3

Google Guava 라이브러리에도 MurmurHash3 기반 해시 기능이 포함되어 있다.

Maven 의존성 추가

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>32.0.1-jre</version>
</dependency>

Java 코드 예제

import com.google.common.hash.HashFunction;
import com.google.common.hash.Hashing;
import java.nio.charset.StandardCharsets;

public class GuavaMurmurHashExample {
    public static void main(String[] args) {
        HashFunction murmur3_32 = Hashing.murmur3_32();
        int hashValue = murmur3_32.hashString("Hello, Guava MurmurHash3!", StandardCharsets.UTF_8).asInt();
        
        System.out.println("MurmurHash3 (32-bit) using Guava: " + hashValue);
    }
}

4. MurmurHash3의 다양한 활용 사례

활용 사례 설명
해시 테이블 균일한 해시 분포로 충돌을 최소화
Bloom Filter 빠른 해싱으로 효율적인 확률적 데이터 구조 구현
데이터 샘플링 대규모 데이터에서 균등한 샘플 추출
로그 분석 대량의 로그 데이터를 효과적으로 해싱하여 색인
게임 및 그래픽 무작위 값 생성, 셰이딩 기법 등에서 활용

5. MurmurHash3와 다른 해시 함수 비교

해시 함수 속도 충돌 가능성 암호학적 보안
MurmurHash3 빠름 매우 낮음 보안 목적 X
MD5 중간 높음 보안 취약
SHA-256 느림 극히 낮음 암호학적 안전
CRC32 매우 빠름 높음 보안 목적 X

MurmurHash3는 보안이 아닌 빠른 데이터 해싱과 균등한 분포가 필요한 경우에 최적화된 해시 함수이다.


6. 결론

MurmurHash3는 빠르고 균일한 해시 값을 생성하는 비암호학적 해시 함수로, 해시 테이블, Bloom Filter, 로그 분석 등의 다양한 분야에서 활용된다.
Java에서는 Apache Commons Codec이나 Google Guava 라이브러리를 통해 손쉽게 구현할 수 있으며, 성능과 균일한 해시 분포가 필요한 경우 최적의 선택이 될 수 있다.

자바 BitSet 클래스

1. BitSet이란?

BitSet은 자바에서 비트 배열을 다룰 수 있도록 제공하는 클래스이다.

boolean 값을 저장하는 boolean[] 배열보다 메모리를 효율적으로 사용할 수 있으며, 비트 연산을 활용하여 빠르게 데이터를 조작할 수 있다.

BitSet은 내부적으로 long[] 배열을 사용하여 비트를 저장하며, 필요에 따라 크기를 동적으로 조정할 수 있다.


2. BitSet의 주요 특징

  • 비트 단위로 저장: 0과 1로 이루어진 비트 배열을 저장 및 관리할 수 있음
  • 자동 크기 조정: 선언 시 크기를 지정하지 않아도 필요에 따라 크기가 자동으로 확장됨
  • 효율적인 메모리 사용: boolean[] 배열보다 메모리 사용량이 적음
  • 빠른 연산 속도: 비트 단위 연산 (AND, OR, XOR 등)을 지원하여 빠른 연산 가능
  • 0 기반 인덱스: 비트는 0부터 시작하는 인덱스로 접근 가능

3. BitSet 기본 사용법

3.1. BitSet 생성

import java.util.BitSet;

public class BitSetExample {
    public static void main(String[] args) {
        BitSet bitSet = new BitSet(); // 기본 크기로 BitSet 생성
        BitSet bitSetWithSize = new BitSet(10); // 초기 크기 10으로 생성
    }
}

3.2. 비트 설정 및 조회

BitSet bitSet = new BitSet();
bitSet.set(0); // 0번 비트를 1로 설정
bitSet.set(3); // 3번 비트를 1로 설정
bitSet.set(5, true); // 5번 비트를 1로 설정

System.out.println(bitSet); // 출력: {0, 3, 5}
System.out.println(bitSet.get(3)); // true (3번 비트는 1)
System.out.println(bitSet.get(4)); // false (4번 비트는 0)

3.3. 비트 해제 및 토글

bitSet.clear(3); // 3번 비트를 0으로 설정
bitSet.flip(5); // 5번 비트를 반전 (1 → 0 또는 0 → 1)
System.out.println(bitSet); // 출력: {0}

3.4. 논리 연산

BitSet bitSet1 = new BitSet();
bitSet1.set(0);
bitSet1.set(2);

BitSet bitSet2 = new BitSet();
bitSet2.set(1);
bitSet2.set(2);

bitSet1.and(bitSet2); // AND 연산 (둘 다 1인 경우만 유지)
System.out.println(bitSet1); // 출력: {2}

bitSet1.or(bitSet2); // OR 연산 (하나라도 1이면 유지)
System.out.println(bitSet1); // 출력: {0, 1, 2}

bitSet1.xor(bitSet2); // XOR 연산 (둘 다 1이면 0, 하나만 1이면 유지)
System.out.println(bitSet1); // 출력: {0, 1}

4. BitSet의 기타 유용한 메서드

메서드 설명
set(int index) 특정 비트를 1로 설정
clear(int index) 특정 비트를 0으로 설정
flip(int index) 특정 비트를 반전 (0↔1)
get(int index) 특정 비트의 값을 반환 (true/false)
cardinality() 1로 설정된 비트의 개수 반환
length() 가장 높은 1의 인덱스 + 1 반환
size() 내부적으로 사용되는 비트 배열 크기 반환
isEmpty() 모든 비트가 0인지 확인
toString() 1로 설정된 비트 목록을 문자열로 반환

 

예제:

BitSet bitSet = new BitSet();
bitSet.set(0);
bitSet.set(3);
bitSet.set(5);

System.out.println(bitSet.cardinality()); // 1로 설정된 비트 개수: 3
System.out.println(bitSet.length()); // 가장 높은 1의 인덱스 + 1: 6
System.out.println(bitSet.isEmpty()); // false (비트가 하나 이상 1임)
System.out.println(bitSet); // 출력: {0, 3, 5}

5. BitSet과 배열 비교

비교 항목 BitSet boolean 배열
메모리 효율성 높음 낮음 (각 요소가 1 byte)
크기 조정 자동 확장 고정 크기
논리 연산 지원 (AND, OR, XOR) 직접 구현해야 함
사용 용도 비트 플래그, 집합 연산 단순한 논리 값 저장

6. BitSet의 활용 예제

6.1. 중복 검사 (빠른 중복 체크)

int[] numbers = {1, 3, 5, 7, 3, 1};
BitSet seen = new BitSet();

for (int num : numbers) {
    if (seen.get(num)) {
        System.out.println("중복된 숫자: " + num);
    }
    seen.set(num);
}

6.2. 소수 판별 (에라토스테네스의 체)

int n = 50;
BitSet primes = new BitSet(n + 1);
primes.set(2, n + 1);

for (int i = 2; i * i <= n; i++) {
    if (primes.get(i)) {
        for (int j = i * i; j <= n; j += i) {
            primes.clear(j);
        }
    }
}
System.out.println("소수: " + primes);

7. 결론

BitSet은 메모리를 절약하면서도 빠른 비트 연산을 수행할 수 있도록 도와주는 강력한 도구이다.

boolean[] 배열보다 훨씬 효율적으로 데이터를 저장하고 연산할 수 있으며, 대량의 데이터를 다루는 경우 특히 유용하다.

데이터 중복 검사, 논리 연산, 집합 연산, 비트 플래그 등 다양한 활용이 가능하므로, 적절한 상황에서 BitSet을 적극 활용하면 성능을 크게 향상시킬 수 있다!

'Web Programming Language > JAVA' 카테고리의 다른 글

람다식(Lambda Expression)이란?  (0) 2025.03.05
MurmurHash3  (1) 2025.02.17
DTO와 VO  (0) 2025.02.12
Records  (1) 2025.02.12
orElse vs orElseGet 차이점  (0) 2025.02.12

+ Recent posts