💻 프로그래밍

Binary

이진

0과 1로 구성된 수 체계. 컴퓨터의 기본 언어. 바이너리 파일은 실행 가능 코드.

📖 상세 설명

Binary(이진)는 0과 1 두 가지 숫자만으로 모든 정보를 표현하는 수 체계입니다. 컴퓨터의 가장 기본적인 언어이며, 모든 디지털 데이터는 궁극적으로 이진수로 저장되고 처리됩니다. 전기 신호의 ON(1)과 OFF(0) 상태로 물리적으로 구현되어 하드웨어와 소프트웨어의 연결고리 역할을 합니다.

이진수의 각 자릿수를 비트(bit)라고 하며, 8비트가 모여 1바이트(byte)를 구성합니다. 예를 들어 문자 'A'는 ASCII 코드로 65이며, 이진수로는 01000001입니다. 이처럼 텍스트, 이미지, 영상, 음성 등 모든 디지털 데이터는 0과 1의 조합으로 인코딩됩니다.

프로그래밍에서 이진 연산은 비트 단위 조작을 의미하며, AND(&), OR(|), XOR(^), NOT(~), 시프트(<<, >>) 연산이 있습니다. 비트 연산은 일반 산술 연산보다 빠르고, 플래그 관리, 권한 시스템, 암호화, 압축 알고리즘 등에서 필수적으로 사용됩니다.

바이너리 파일은 텍스트가 아닌 이진 데이터로 구성된 파일을 말합니다. 실행 파일(.exe), 이미지(.jpg, .png), 동영상(.mp4), 컴파일된 프로그램 등이 바이너리 파일입니다. 반면 소스 코드, HTML, JSON 같은 텍스트 파일은 사람이 읽을 수 있는 문자로 구성되어 있습니다.

💻 코드 예제

# 1. 10진수를 2진수로 변환
decimal = 42
binary_str = bin(decimal)          # '0b101010'
binary_clean = bin(decimal)[2:]    # '101010'
print(f"10진수 {decimal} → 2진수 {binary_clean}")

# 2. 2진수를 10진수로 변환
binary = "101010"
decimal_back = int(binary, 2)      # 42
print(f"2진수 {binary} → 10진수 {decimal_back}")

# 3. 비트 연산 (Bitwise Operations)
a = 0b1100  # 12
b = 0b1010  # 10

print(f"AND: {bin(a & b)} = {a & b}")   # 0b1000 = 8
print(f"OR:  {bin(a | b)} = {a | b}")   # 0b1110 = 14
print(f"XOR: {bin(a ^ b)} = {a ^ b}")   # 0b0110 = 6
print(f"NOT: {bin(~a & 0xFF)} (8비트)")  # 0b11110011

# 4. 비트 시프트 연산
x = 1
print(f"좌측 시프트: {x} << 4 = {x << 4}")  # 16 (2의 4승)
print(f"우측 시프트: 16 >> 2 = {16 >> 2}")  # 4 (16/4)

# 5. 실무 활용: 권한 플래그 시스템
READ = 0b100    # 4
WRITE = 0b010   # 2
EXEC = 0b001    # 1

user_perm = READ | WRITE  # 0b110 = 6 (읽기+쓰기)
if user_perm & READ:
    print("읽기 권한 있음")
if user_perm & EXEC:
    print("실행 권한 있음")
else:
    print("실행 권한 없음")

# 6. 바이너리 데이터 다루기
data = bytes([0x48, 0x65, 0x6C, 0x6C, 0x6F])  # "Hello"
print(f"바이트: {data}, 문자열: {data.decode('utf-8')}")

🗣️ 실무에서 이렇게 말하세요

💬 회의에서
"이 설정값들은 비트 플래그로 관리하면 좋겠습니다. 8가지 옵션을 1바이트로 저장할 수 있고, 비트 연산으로 빠르게 확인할 수 있어서 메모리와 성능 모두 효율적입니다."
💬 면접에서
"컴퓨터가 이진수를 사용하는 이유는 전기 신호의 ON/OFF 두 상태를 안정적으로 구분할 수 있기 때문입니다. 2의 보수 표현법으로 음수를 처리하고, IEEE 754 표준으로 부동소수점을 표현합니다."
💬 코드 리뷰에서
"여기서 2를 곱하는 대신 좌측 시프트를 쓰셨네요. 최신 컴파일러는 자동 최적화하므로 가독성을 위해 일반 곱셈을 쓰는 게 좋겠습니다. 다만 비트마스킹 로직에서는 의도가 명확하니 시프트 연산이 적절합니다."

⚠️ 흔한 실수 & 주의사항

부호 있는 정수의 시프트 연산

음수에 대한 우측 시프트는 언어마다 다르게 동작합니다. 산술 시프트(부호 유지)와 논리 시프트(0 채움)를 구분하고, 부호 없는 타입을 명시적으로 사용하세요.

엔디안(Endianness) 무시

멀티바이트 데이터는 리틀 엔디안(Intel)과 빅 엔디안(네트워크)에서 바이트 순서가 다릅니다. 네트워크 통신이나 파일 포맷 파싱 시 반드시 엔디안을 확인하세요.

비트 연산 우선순위 주의

비트 연산자는 비교 연산자보다 우선순위가 낮습니다. `if (flags & MASK == MASK)`는 예상과 다르게 동작하므로 `if ((flags & MASK) == MASK)`처럼 괄호를 사용하세요.

🔗 관련 용어

📚 더 배우기