🔥 람다식이란?

람다식(Lambda Expression)은 자바 8(Java 8)에서 도입된 기능으로,
익명 함수(Anonymous Function)를 보다 간결하게 표현할 수 있는 문법
함수형 프로그래밍(Functional Programming)을 지원
코드를 간결하게 작성할 수 있도록 도와주는 기법


🏗 1. 함수형 프로그래밍(Functional Programming)이란?

함수형 프로그래밍이란?

  • 프로그램을 함수(메소드) 단위로 작성하고, 데이터 처리를 함수에 맡기는 방식
  • 메소드(객체 소속)와 함수(독립적 실행 코드)의 차이
    • 메소드: 반드시 클래스 내부에 존재해야 함
    • 함수: 클래스와 무관하게 독립적으로 실행될 수 있음

📌 자바는 원래 객체지향 언어이지만, 함수형 프로그래밍을 지원하기 위해 람다식을 도입


🎯 2. 람다식의 기본 개념

람다식은 이름이 없는 함수(익명 함수)를 표현하는 방법입니다.

일반적으로 다음과 같은 형태로 작성됩니다.
📌 람다식 기본 문법

(매개변수) -> { 실행 코드 }

 
예제 1: 두 수를 더하는 람다식

(int x, int y) -> { return x + y; }

 
예제 2: 매개변수가 하나인 경우

x -> { return x * 2; }

 
예제 3: 실행 코드가 한 줄이면 중괄호 생략 가능

(x, y) -> x + y

 


🛠 3. 람다식과 익명 구현 객체의 관계

자바에서는 람다식을 익명 구현 객체(Anonymous Implementation Object)로 변환하여 실행합니다.
즉, 람다식은 사실상 익명 클래스를 줄여서 표현하는 방법입니다.
 
📌 익명 구현 객체 방식

interface Calculator {
    int calculate(int x, int y);
}

public class Main {
    public static void main(String[] args) {
        Calculator add = new Calculator() {
            @Override
            public int calculate(int x, int y) {
                return x + y;
            }
        };
        System.out.println(add.calculate(5, 3)); // 8
    }
}

 
위 코드를 람다식으로 변환

Calculator add = (x, y) -> x + y;
System.out.println(add.calculate(5, 3)); // 8

 
📌 결과는 동일하지만 코드가 훨씬 간결해짐! 🚀


🎯 4. 람다식을 사용하기 위한 조건

람다식은 함수형 인터페이스(Functional Interface)에서만 사용 가능합니다.
즉, 추상 메소드가 1개만 있는 인터페이스에서만 람다식을 사용할 수 있습니다.
 
📌 함수형 인터페이스(Functional Interface) 예제

@FunctionalInterface
interface Calculator {
    int calculate(int x, int y);
}

추상 메소드가 1개만 존재하므로 람다식 사용 가능!
만약 2개 이상의 추상 메소드가 존재하면 람다식 사용 불가능!


🏗 5. 람다식을 활용한 데이터 처리

람다식을 사용하면 데이터 처리 방식을 함수로 전달할 수 있음
즉, 함수를 변수처럼 사용 가능!
 
📌 람다식을 활용한 데이터 처리 예제

public class Main {
    public static void processNumbers(int a, int b, Calculator calculator) {
        int result = calculator.calculate(a, b);
        System.out.println("결과: " + result);
    }

    public static void main(String[] args) {
        processNumbers(5, 3, (x, y) -> x + y); // 더하기
        processNumbers(5, 3, (x, y) -> x - y); // 빼기
        processNumbers(5, 3, (x, y) -> x * y); // 곱하기
    }
}​
 

함수를 변수처럼 전달하여 유연하게 데이터 처리 가능!


🛠 6. 자바 표준 함수형 인터페이스

자바는 람다식을 쉽게 사용할 수 있도록 표준 함수형 인터페이스를 제공합니다.

📌 대표적인 함수형 인터페이스

인터페이스 추상 메소드 설명
Function<T, R>apply(T t)입력값을 받아 변환하여 반환
Consumer<T>accept(T t)입력값을 받아 처리 (반환값 없음)
Supplier<T>get()매개변수 없이 결과를 반환
Predicate<T>test(T t)조건식을 검사하여 true 또는 false 반환

 
예제: Function 인터페이스 활용

Function<String, Integer> lengthFunction = s -> s.length();
System.out.println(lengthFunction.apply("Hello")); // 5

 
예제: Consumer 인터페이스 활용

Consumer<String> printConsumer = s -> System.out.println(s);
printConsumer.accept("Hello, World!"); // Hello, World!​

 

 
예제: Predicate 인터페이스 활용

Predicate<Integer> isEven = num -> num % 2 == 0;
System.out.println(isEven.test(4)); // true
System.out.println(isEven.test(5)); // false

 


🏁 정리: 람다식의 개념과 활용

📌 람다식(Lambda Expression)은 자바 8부터 도입된 기능으로, 익명 함수를 표현하는 방법
📌 함수형 인터페이스(Functional Interface)에서만 사용 가능 (추상 메소드 1개 필요)
📌 람다식을 사용하면 코드가 간결해지고, 데이터 처리 방식이 유연해짐
📌 자바에서 표준 함수형 인터페이스를 제공하여 람다식 활용을 쉽게 지원


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

  • 람다식이 무엇이며, 왜 필요한지 이해했다.
  • 기존 익명 구현 객체 방식과 비교하여 코드가 간결해지는 것을 확인했다.
  • 자바의 표준 함수형 인터페이스를 활용하면 코드 재사용성이 높아진다는 점을 배웠다.
  • 람다식을 사용하여 데이터 처리 방식을 함수로 전달할 수 있음을 학습했다.

 
 
 
 
 

참조:
이것이 자바다 _ 신용권

 
 
 

🔥 운영체제의 핵심 개념을 이해하기

이전 강의에서 운영체제가 무엇이고, 왜 중요한지에 대해 학습했다면,
이번 강의에서는 운영체제가 실제로 어떤 역할을 하는지 큰 그림을 그려보는 시간입니다.

 

📌 이번 강에서 다룰 내용
운영체제의 핵심 부분, 커널(Kernel)이란?
운영체제의 서비스 (운영체제가 프로그램에게 제공하는 기능)
이중 모드(User Mode & Kernel Mode)와 시스템 호출(System Call)의 역할


🏗 1. 운영체제의 핵심: 커널(Kernel)

운영체제는 규모가 매우 큰 프로그램이며, 다양한 기능을 제공하는 소프트웨어입니다.
운영체제 중에서도 가장 핵심적인 역할을 수행하는 부분을 커널(Kernel) 이라고 부릅니다.

 

📌 커널이란?

  • 운영체제의 심장 역할을 하는 핵심 부분
  • 프로그램과 하드웨어를 연결해주는 역할
  • 메모리 관리, 프로세스 관리, 입출력 장치 제어 등의 핵심 기능 수행

운영체제는 커널을 중심으로 작동하며, 프로그램이 커널을 통해 시스템 자원을 사용할 수 있도록 한다!


🎯 2. 운영체제의 서비스 (운영체제가 제공하는 기능)

운영체제는 응용 프로그램이 정상적으로 실행될 수 있도록 다양한 서비스를 제공합니다.

 

📌 운영체제가 제공하는 핵심 서비스

1️⃣ 자원 관리 (CPU, 메모리, 저장장치, 입출력 장치 등)
2️⃣ 프로세스 및 스레드 관리 (멀티태스킹, 프로세스 생성 및 종료)
3️⃣ 파일 시스템 관리 (파일 저장, 읽기, 삭제 기능 제공)
4️⃣ 입출력 장치 관리 (키보드, 마우스, 프린터, 네트워크 등 제어)

 

운영체제의 핵심 역할:
👉 컴퓨터 자원(메모리, CPU, 파일 시스템 등)을 효율적으로 관리하고 보호하는 것!

 

📌 운영체제가 없다면?

  • 프로그램이 CPU와 메모리를 직접 조작해야 함 → 안정성 저하, 충돌 발생
  • 여러 프로그램이 동시에 실행될 때 자원 관리가 어려워짐

운영체제가 프로그램과 하드웨어 사이에서 "관리자" 역할을 수행하기 때문에, 개발자는 시스템 자원을 직접 관리할 필요가 없다!


🛠 3. 이중 모드 (User Mode & Kernel Mode)

운영체제는 일반 프로그램과 시스템의 핵심 기능을 분리하여 보호합니다.
이를 위해 이중 모드(Two Modes) 개념을 사용합니다.

 

📌 이중 모드란?

  • 사용자 모드 (User Mode): 응용 프로그램이 실행되는 환경
  • 커널 모드 (Kernel Mode): 운영체제가 실행되는 환경

왜 이중 모드가 필요할까?

  • 사용자 프로그램이 운영체제의 핵심 기능을 마음대로 조작하는 것을 방지하기 위해
  • 예를 들어, 일반 프로그램이 CPU나 메모리를 직접 변경하면 시스템이 불안정해질 수 있음
  • 운영체제가 자원을 보호하고, 필요한 경우에만 커널 모드에서 실행되도록 관리

📌 사용자 모드 vs 커널 모드 비교

모드 설명 예제
사용자 모드 (User Mode) 일반 프로그램 실행 웹 브라우저, 게임, 메모장
커널 모드 (Kernel Mode) 운영체제 핵심 기능 실행 메모리 관리, 프로세스 스케줄링

 

사용자 모드에서 실행되는 프로그램이 운영체제 기능이 필요할 때는 시스템 호출(System Call)을 통해 커널 모드로 전환된다! 


🔍 4. 시스템 호출(System Call)

운영체제는 일반 프로그램이 직접 하드웨어를 조작하지 못하도록 보호합니다.


그렇다면, 프로그램이 파일을 저장하거나 네트워크를 사용할 때 어떻게 해야 할까요?
👉 운영체제에게 요청을 보내야 합니다!


이 역할을 수행하는 것이 시스템 호출(System Call) 입니다.

 

📌 시스템 호출이란?

  • 프로그램이 운영체제의 기능을 사용하기 위해 요청하는 인터페이스
  • 파일을 열거나, 데이터를 저장하거나, 네트워크 통신을 수행할 때 사용

시스템 호출 예제

1️⃣ open() → 파일 열기
2️⃣ read() → 파일에서 데이터 읽기
3️⃣ write() → 파일에 데이터 쓰기
4️⃣ fork() → 새로운 프로세스 생성
5️⃣ exit() → 프로세스 종료

 

📌 시스템 호출이 실행되는 과정

1️⃣ 사용자가 open("file.txt") 실행
2️⃣ 운영체제에게 "파일을 열어달라"는 요청을 보냄 (System Call 발생)
3️⃣ 커널 모드로 전환되어 운영체제가 파일을 처리
4️⃣ 완료 후 사용자 모드로 돌아와 프로그램 실행 계속

 

운영체제는 시스템 호출을 통해 프로그램이 안전하게 자원을 사용할 수 있도록 관리한다!


🏁 정리: 운영체제의 큰 그림

📌 운영체제는 컴퓨터의 "관리자" 역할을 수행하는 핵심 소프트웨어
📌 운영체제의 가장 중요한 부분은 커널(Kernel)이며, 자원 관리를 담당
📌 응용 프로그램은 시스템 호출(System Call)을 통해 운영체제의 기능을 요청
📌 이중 모드(User Mode & Kernel Mode)를 사용하여 프로그램이 직접 시스템 자원을 조작하는 것을 방지

 


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

  • 운영체제의 핵심 역할과 커널(Kernel)의 중요성
  • 운영체제가 프로그램에게 제공하는 서비스(자원 관리, 파일 시스템, 프로세스 관리 등)
  • 이중 모드(User Mode & Kernel Mode)의 필요성과 시스템 보호 방식
  • 시스템 호출(System Call)의 개념과 프로그램이 운영체제의 기능을 요청하는 과정

 

 

출처:
혼자공부하는 운영체제 - 강민철

🔥 운영체제는 왜 중요한가?

이전 강의에서 컴퓨터 구조를 학습했다면, 이제는 운영체제를 이해할 차례입니다.
운영체제(OS, Operating System)는 하드웨어와 소프트웨어의 중간에서 자원을 관리하고 프로그램 실행을 지원하는 핵심 소프트웨어입니다.

 

📌 이번 강에서 배울 핵심 개념
운영체제란 무엇인가?
운영체제가 하는 역할과 주요 기능
운영체제가 없으면 어떤 일이 발생할까?
개발자가 운영체제를 알아야 하는 이유


🏗 1. 운영체제란 무엇인가?

운영체제는 컴퓨터의 핵심적인 프로그램으로, 컴퓨터가 단순한 부품의 집합이 아니라 유용한 도구로 작동하도록 만드는 중요한 역할을 합니다.

 

📌 운영체제의 예시

  • PC 운영체제: Windows, macOS, Linux
  • 스마트폰 운영체제: Android, iOS

운영체제는 단순한 소프트웨어가 아니라, 컴퓨터를 동작시키는 가장 중요한 프로그램!


🎯 2. 운영체제의 주요 기능

운영체제는 단순한 프로그램이 아니라 컴퓨터 시스템을 관리하는 관리자 역할을 합니다.
컴퓨터에서 실행되는 모든 프로그램과 하드웨어 자원을 조정하고 관리하는 역할을 합니다.

 

📌 운영체제가 하는 주요 역할
1️⃣ 자원(Resource) 관리

  • CPU, 메모리, 저장 장치, 입출력 장치 관리
  • 프로그램이 실행될 때 필요한 자원을 할당하고 조정

2️⃣ 프로세스 관리 (멀티태스킹)

  • 여러 개의 프로그램을 동시에 실행하는 기능
  • CPU가 여러 프로그램을 빠르게 번갈아가며 실행

3️⃣ 메모리 관리

  • 프로그램이 실행될 때 필요한 메모리 공간을 할당
  • 사용이 끝난 메모리를 해제하여 효율적으로 활용

4️⃣ 파일 시스템 관리

  • 하드디스크(HDD, SSD)에서 파일을 생성, 삭제, 저장
  • 폴더(디렉토리) 구조를 관리하여 데이터 정리

5️⃣ 입출력 장치 관리

  • 키보드, 마우스, 프린터, 스피커 등의 하드웨어 장치를 제어

운영체제는 컴퓨터 자원을 최적화하고, 프로그램이 원활하게 실행되도록 도와주는 관리자 역할을 수행합니다!


🛠 3. 운영체제가 없다면?

운영체제가 없다면 개발자가 직접 하드웨어를 조작하는 코드를 작성해야 합니다.
예를 들어, 프로그램이 실행될 때:

  • 메모리에 프로그램을 어디에 적재할지 개발자가 직접 지정해야 함
  • CPU가 어떤 프로그램을 먼저 실행할지 직접 관리해야 함
  • 모니터에 출력하려면 하드웨어 제어 코드를 직접 작성해야 함

📌 운영체제 없이 프로그램을 실행한다면?

1과 2를 더한 결과를 모니터에 출력하는 프로그램을 작성한다고 가정하자.
운영체제 없이 개발자가 해야 하는 작업:

1. 프로그램을 실행할 메모리 주소를 직접 할당
2. CPU에게 해당 프로그램을 실행하도록 명령
3. 모니터의 픽셀을 직접 조작하여 화면에 출력
4. 실행이 끝난 후 메모리를 해제

 

운영체제가 없으면 개발자는 하드웨어 제어까지 직접 해야 하므로 매우 비효율적!


🔍 4. 운영체제를 개발자가 배워야 하는 이유

운영체제는 사용자가 직접 다루는 프로그램이 아니지만, 모든 프로그램이 운영체제 위에서 실행되기 때문에 개발자에게 필수적인 지식입니다.

 

📌 운영체제를 학습해야 하는 이유
1️⃣ 문제 해결 능력 향상

  • 프로그램 실행 중 발생하는 오류(메모리 부족, CPU 과부하)를 이해하고 해결 가능

2️⃣ 효율적인 프로그램 개발 가능

  • 메모리 관리, CPU 스케줄링을 이해하면 최적화된 코드 작성 가능

3️⃣ 시스템 프로그래밍 및 서버 관리 필수 지식

  • 네트워크 서버, 운영체제 커널 개발, 시스템 프로그래밍을 하려면 필수적으로 학습해야 함

4️⃣ 기술 면접에서 자주 출제됨

  • 많은 IT 기업이 운영체제 관련 개념을 면접에서 질문
  • 프로세스, 멀티스레딩, 메모리 관리 등 운영체제의 핵심 개념이 출제됨

운영체제를 이해하면 프로그램을 더 깊이 이해하고, 개발자로서의 역량을 향상할 수 있습니다! 🚀


🏁 정리: 운영체제가 중요한 이유

📌 운영체제는 컴퓨터 자원을 관리하고 프로그램 실행을 돕는 핵심 소프트웨어
📌 운영체제가 없다면 개발자가 직접 하드웨어를 제어해야 하므로 비효율적
📌 운영체제를 배우면 문제 해결 능력과 프로그램 최적화 능력을 키울 수 있음
📌 개발자로서 운영체제를 학습하는 것은 필수적인 과정


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

  • 운영체제가 하는 역할과 기능을 이해했다.
  • 운영체제가 없다면 프로그램 실행이 얼마나 비효율적인지 배웠다.
  • 개발자가 운영체제를 학습해야 하는 이유를 알게 되었다.
  • 기술 면접에서 운영체제 개념이 왜 중요한지 이해했다.

 

 

출처:
혼자공부하는 운영체제 - 강민철

🔥 컴퓨터가 소스코드를 실행하는 과정

우리가 사용하는 C, C++, Python, Java 같은 프로그래밍 언어는 사람이 읽고 쓰기 쉽도록 설계된 고급 언어입니다.
하지만 컴퓨터는 고급 언어를 바로 이해하지 못하며, 0과 1로 구성된 기계어로 변환해야 실행할 수 있습니다.

 

📌 이번 강에서는 고급 언어(소스코드)가 어떻게 컴퓨터가 실행할 수 있는 명령어로 변환되는지 학습합니다.
고급 언어와 저급 언어의 개념
기계어와 어셈블리어 비교
컴파일 언어 vs 인터프리터 언어
소스코드 변환 과정 (컴파일 & 인터프리트 과정 실습)


🏗 1. 고급 언어와 저급 언어

고급 언어 (High-Level Language)

  • 사람이 읽고 쓰기 쉽도록 설계된 프로그래밍 언어
  • 예: C, C++, Java, Python, JavaScript
  • 개발자가 이해하기 쉬운 문법을 제공

📌 예제 (Python)

print("Hello, World!")
  • 위 코드는 우리가 쉽게 읽고 이해할 수 있음
  • 하지만 컴퓨터는 이 코드를 바로 실행할 수 없음

저급 언어 (Low-Level Language)

컴퓨터가 직접 이해하고 실행할 수 있는 언어

  • 기계어 (Machine Language): 0과 1로만 이루어진 언어
  • 어셈블리어 (Assembly Language): 사람이 조금 더 읽기 쉽게 표현한 저급 언어

📌 예제 (기계어)

 
10101011 00001111 11001010 10101010

 

문제가 뭘까?

  • 사람이 읽고 이해하기 어렵다.
  • 개발자가 직접 작성하기 어렵다.
  • 컴퓨터는 기계어만 이해할 수 있기 때문에, 고급 언어 → 기계어로 변환해야 한다.

🎯 2. 기계어와 어셈블리어

기계어 (Machine Code)

  • 컴퓨터가 직접 이해할 수 있는 0과 1로 된 코드
  • CPU가 기계어를 실행하여 프로그램을 동작

📌 기계어 예제

 
10100011 01011000 11001010 01101100

 

문제점:

  • 사람이 직접 작성하기 어려움
  • 디버깅이 어렵고 유지보수가 불편함

어셈블리어 (Assembly Language)

  • 기계어를 사람이 좀 더 이해하기 쉽게 변환한 저급 언어
  • CPU 명령어를 문자 형태로 표현

📌 어셈블리어 예제

MOV AX, 5
ADD AX, 3

 

장점:

  • 기계어보다 사람이 읽기 쉬움
  • 특정 하드웨어(CPU)와 밀접하게 연관됨

단점:

  • 여전히 개발자가 직접 작성하기 어려움
  • 하드웨어에 따라 명령어가 달라지므로 이식성이 떨어짐

📌 따라서, 대부분의 프로그래머는 "고급 언어"를 사용하고, 이를 기계어로 변환하는 과정이 필요하다.


🛠 3. 컴파일 언어 vs 인터프리터 언어

고급 언어를 기계어로 변환하는 방식에는 컴파일 방식과 인터프리트 방식이 존재합니다.

컴파일 언어 (Compiled Language)

📌 특징

  • 소스코드를 한 번에 기계어로 변환한 후 실행
  • 실행 파일(.exe, .out)을 생성한 후 실행 가능
  • 프로그램 실행 속도가 빠름

📌 예제 언어

  • C, C++ (컴파일 방식 사용)

📌 컴파일 과정

소스코드 (C) → [컴파일러] → 기계어 변환 (목적 코드) → 실행 파일

장점

  • 실행 속도가 빠름
  • 배포 시 소스코드 노출 없이 실행 파일 제공 가능

단점

  • 컴파일 과정이 필요하여 실행 속도가 느릴 수 있음
  • 소스코드 수정 후 반드시 다시 컴파일해야 함

인터프리터 언어 (Interpreted Language)

📌 특징

  • 소스코드를 한 줄씩 해석하여 실행
  • 실행 파일을 만들지 않고, 코드 실행 속도가 느림

📌 예제 언어

  • Python, JavaScript, Ruby

📌 인터프리트 과정

소스코드 (Python) → [인터프리터] → 한 줄씩 기계어 변환 및 실행

 

장점

  • 즉시 실행 가능 (컴파일 과정 불필요)
  • 코드 수정 후 즉시 실행 가능 (개발 편의성 높음)

단점

  • 실행 속도가 느림
  • 프로그램을 실행할 때마다 해석해야 하므로 성능 저하

🔍 4. 컴파일 & 인터프리트 과정 실습

📌 소스코드가 컴파일 & 인터프리트 과정을 거쳐 어떻게 변환되는지 확인할 수 있는 사이트 소개
👉 godbolt.org (Compiler Explorer)

 

실습 방법

  1. 고급 언어(C, Python) 소스코드를 입력
  2. 오른쪽 창에서 어셈블리어 코드 변환 결과 확인
  3. CPU 아키텍처(x86, ARM 등)에 따라 변환된 코드가 달라지는 것도 확인 가능

📌 실습을 통해 확인할 수 있는 것

  • 고급 언어가 어셈블리어로 변환되는 과정
  • CPU 아키텍처별 명령어 차이
  • 컴파일러 옵션에 따라 기계어 코드 최적화 여부

🏁 정리: 소스코드와 명령어 변환 과정

📌 고급 언어 → 기계어로 변환하는 과정이 필요함


📌 컴파일 언어 vs 인터프리터 언어 비교

비교 항목
컴파일 언어 인터프리터 언어
변환 방식 전체 코드 변환 후 실행 한 줄씩 변환하여 실행
실행 속도 빠름 느림
예제 언어 C, C++ Python, JavaScript
장점 빠른 실행 속도 개발 편의성 높음
단점 수정 후 재컴파일 필요 실행 속도가 느림

 

📌 고급 언어 → 어셈블리어 → 기계어(0과 1) 변환 과정을 이해하는 것이 중요! 🚀


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

  • 컴퓨터는 0과 1로 된 기계어만 이해한다.
  • 고급 언어(소스코드)를 기계어로 변환하는 과정이 필요하다.
  • 컴파일 언어(C, C++)와 인터프리터 언어(Python, JavaScript)의 차이점
  • 컴파일 과정과 인터프리트 과정이 어떻게 진행되는지 이해했다.

 

 

출처:
혼자공부하는 운영체제 - 강민철

🔥 컴퓨터가 문자를 이해하는 방법

컴퓨터는 기본적으로 0과 1(이진수)만 이해할 수 있는 기계입니다.
하지만 우리는 컴퓨터를 사용할 때 알파벳, 한글, 특수문자, 이모티콘까지 다양하게 입력하고 출력할 수 있습니다.

 

📌 이번 강에서는 컴퓨터가 문자를 표현하는 방법을 학습합니다.
문자 집합, 인코딩, 디코딩 개념 이해
아스키 코드(ASCII)와 한글 인코딩 방식(EUC-KR, UTF-8) 비교
유니코드(Unicode)와 다국어 표현 방식
인코딩 문제 발생 시 해결 방법(문자 깨짐 해결 팁)


🏗 1. 문자 집합과 인코딩의 개념

1️⃣ 문자 집합 (Character Set)

문자 집합(Character Set)이란?

  • 컴퓨터가 이해할 수 있는 문자들의 모음
  • 컴퓨터는 문자 집합에 속한 문자만 인식 가능

예를 들어, A, B, C만 지원하는 문자 집합이라면 D, E, F는 표현할 수 없음
👉 문자 집합이 어떤 문자를 포함하는지에 따라 컴퓨터가 이해할 수 있는 문자가 달라짐.


2️⃣ 인코딩(Encoding)과 디코딩(Decoding)

📌 인코딩(Encoding)이란?

  • 사람이 사용하는 문자를 컴퓨터가 이해할 수 있도록 0과 1로 변환하는 과정
  • 예: A → 01000001 (ASCII 코드)

📌 디코딩(Decoding)이란?

  • 컴퓨터가 저장한 0과 1을 사람이 이해할 수 있는 문자로 변환하는 과정
  • 예: 01000001 → A

정리하면?

개념
설명
인코딩 문자를 0과 1로 변환
디코딩 0과 1을 문자로 변환

 

📌 즉, 인코딩과 디코딩이 있어야 사람이 컴퓨터와 원활하게 소통 가능! 🚀


🎯 2. 대표적인 문자 인코딩 방식

컴퓨터는 다양한 문자 인코딩 방식을 사용하여 영어, 한글, 이모티콘 등 다양한 문자 표현이 가능합니다.

 

📌 대표적인 문자 인코딩 방식 3가지

1️⃣ 아스키 코드(ASCII)
2️⃣ EUC-KR (한글 인코딩 방식, 완성형/조합형)
3️⃣ 유니코드(Unicode) 및 UTF-8


🛠 3. 아스키 코드(ASCII)

📌 아스키(ASCII)란?

  • 초기 컴퓨터에서 사용된 가장 기본적인 문자 인코딩 방식
  • 영어 알파벳, 숫자, 특수문자(일부 기호)만 표현 가능
  • 7비트(128개 문자)로 표현

아스키 코드의 문제점?

  • 영어 및 일부 특수문자만 표현 가능
  • 한글, 중국어, 일본어, 이모티콘 등 다국어 지원 불가

📌 아스키 코드 예시

문자 10진수 2진수
A 65 01000001
B 66 01000010
a 97 01100001
0 48 00110000

 

🔹 한글이 표현되지 않기 때문에, 한국에서는 별도의 한글 인코딩 방식이 필요하게 됨.


🏗 4. 한글 인코딩 방식 (EUC-KR)

📌 한글을 표현하는 대표적인 방법:

1️⃣ 완성형 인코딩 (EUC-KR)
2️⃣ 조합형 인코딩


1️⃣ 완성형 인코딩 (EUC-KR)

  • 한글을 미리 정의된 문자 조합(완성된 형태)로 저장
  • 한 글자당 2바이트(16비트) 사용
  • 2,350여 개의 한글 표현 가능

📌 문제점?

  • 표현할 수 있는 한글이 제한됨
  • 예를 들어, ‘뷁’, ‘쩝’ 같은 글자는 표현 불가능
  • 일부 사용자는 이름이나 단어가 인코딩되지 않는 문제 발생

한글이 깨지는 이유 중 하나!
👉 EUC-KR 방식이 모든 한글을 표현하지 못하기 때문


2️⃣ 조합형 인코딩

  • 초성, 중성, 종성을 따로 저장하고 조합하여 한글 표현
  • 이론적으로 모든 한글을 표현 가능
  • 하지만 저장 공간 낭비복잡한 연산이 필요해 널리 사용되지 않음

📌 결론:
👉 EUC-KR이 표준으로 자리 잡았지만, 표현할 수 있는 글자 수가 한정적이었음.
👉 이를 해결하기 위해 유니코드(Unicode)가 등장!


🔥 5. 유니코드(Unicode)와 UTF-8

📌 유니코드(Unicode)란?

  • 모든 언어와 특수문자를 포함하는 글로벌 문자 표준
  • 한글, 중국어, 일본어, 아랍어, 심지어 이모티콘까지 표현 가능
  • UTF-8, UTF-16, UTF-32 등의 인코딩 방식으로 저장 가능

UTF-8 (가장 널리 사용되는 인코딩)

  • 유니코드의 대표적인 인코딩 방식
  • 영어는 1바이트, 한글은 2~3바이트, 특수문자는 4바이트
  • 웹 및 현대 시스템에서 가장 많이 사용됨

📌 UTF-8의 특징

  • 가변 길이 인코딩 (1~4바이트)
  • 아스키와 호환됨 (영어는 1바이트로 동일하게 저장됨)
  • 다국어 지원 가능

한글 인코딩 방식 비교

인코딩 방식
특징 단점
EUC-KR 한글 2,350자 표현 가능 일부 한글 표현 불가
UTF-8 모든 한글 및 다국어 표현 가능 한글은 2~3바이트 필요

 

📌 현대 시스템(웹, 운영체제 등)에서는 대부분 UTF-8을 사용! 🚀


🏁 6. 정리: 컴퓨터의 문자 표현 방식

📌 컴퓨터는 0과 1(이진수)로 문자를 저장하고 표현
📌 아스키 코드(ASCII)는 영어 및 기본 특수문자만 표현 가능
📌 한글 인코딩 방식(EUC-KR)은 일부 한글만 표현 가능
📌 유니코드(UTF-8)는 전 세계 모든 언어 및 이모티콘까지 표현 가능
📌 웹 개발 및 시스템 설정 시 인코딩 깨짐 문제 발생 가능 → UTF-8 설정 필수


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

  • 컴퓨터가 문자를 표현하는 원리 (인코딩과 디코딩 개념 이해)
  • 아스키 코드(ASCII), EUC-KR(완성형), UTF-8(유니코드) 차이점 비교
  • 웹 개발에서 한글 깨짐 문제의 원인과 해결 방법

 

 

출처:
혼자공부하는 운영체제 - 강민철

 

🔥 컴퓨터가 숫자를 이해하는 방식

컴퓨터는 기본적으로 0과 1밖에 이해하지 못하는 기계입니다.
우리가 일반적으로 사용하는 숫자(10진수)를 컴퓨터가 이해할 수 있는 형태(2진수, 16진수 등)로 변환하는 과정이 필요합니다.

 

📌 이번 강에서는 컴퓨터가 숫자를 표현하는 방법을 학습합니다.
정보 단위 (비트, 바이트 등) 이해하기
이진법(2진수)와 십육진법(16진수)의 개념
2진수 ↔ 16진수 변환 방법
음수를 표현하는 방법 (2의 보수법)


🏗 1. 컴퓨터가 이해하는 정보 단위

비트(Bit)와 바이트(Byte)

📌 비트(Bit)란?

  • 컴퓨터가 이해할 수 있는 가장 작은 정보 단위
  • 0과 1, 즉 전기 신호의 "꺼짐(0)"과 "켜짐(1)"을 나타내는 최소 단위
  • 1비트는 두 가지(0 또는 1) 정보를 표현 가능

📌 비트(Bit) 개수에 따른 정보 표현 가능성

비트 개수 표현 가능한 정보 개수
1비트 2가지 (0, 1)
2비트 4가지 (00, 01, 10, 11)
3비트 8가지 (000~111)
n비트 2^n 개

 

📌 바이트(Byte)란?

  • 8비트(Bit) = 1바이트(Byte)
  • 하나의 문자(예: 'A')를 저장할 때 보통 1바이트 사용

더 큰 정보 단위

단위
크기
1 Byte 8 Bits
1 KB (킬로바이트) 1,000 Bytes
1 MB (메가바이트) 1,000 KB
1 GB (기가바이트) 1,000 MB
1 TB (테라바이트) 1,000 GB

 

📌 1024 vs 1000 기준?

  • 과거에는 1024 단위(2^10)를 기준으로 사용했지만,
  • 최근에는 1000 단위(KB=1000B)로 표기하는 경우가 많음.
  • 하지만 정확한 표기는 1024 단위를 따르는 것이 원칙 (예: 1 KiB = 1024 Bytes).

🎯 2. 이진법(2진수)이란?

컴퓨터는 0과 1만으로 숫자를 표현합니다.
이진법(Binary, 2진수) 이란, 숫자가 '2'가 될 때마다 자리 올림이 발생하는 진법입니다.

 

📌 이진법 변환 예시

10진수
2진수
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000

 

10진수 → 2진수 변환 방법

  1. 10진수를 2로 나눈 나머지를 기록
  2. 몫이 0이 될 때까지 반복
  3. 거꾸로 읽으면 2진수 완성

예) 10을 2진수로 변환

10 ÷ 2 = 5 ... 0  
5 ÷ 2 = 2 ... 1  
2 ÷ 2 = 1 ... 0  
1 ÷ 2 = 0 ... 1  
(위에서 아래로 읽으면 1010 → 10진수 10 = 2진수 1010)

 

🔢 3. 십육진법(16진수)

16진법이란?

  • 숫자가 16이 될 때 자리 올림이 발생하는 진법
  • 2진수로 표현하면 너무 길어지기 때문에 간결하게 표현하기 위해 사용
  • 0~9 이후 A(10), B(11), C(12), D(13), E(14), F(15)로 표현

📌 16진법 예시

10진수 2진수 16진수
0 0000 0
1 0001 1
10 1010 A
15 1111 F
16 0001 0000 10

2진수 ↔ 16진수 변환 방법

  • 2진수를 4비트씩 끊어서 변환하면 손쉽게 16진수로 변환 가능

예) 2진수 → 16진수 변환

1010  1101    1111  (2진수)
[A]    [D]    [F]  (16진수)
=> 16진수로 A D F

예) 16진수 → 2진수 변환

A = 1010,  D = 1101,  F = 1111
A D F = 1010 1101 1111 (2진수)

📌 16진수 표기 방법

  • 0x 접두사를 붙여 표기 → 예: 0xA3F
  • C언어나 Python 코드에서 사용되는 표기법

4. 음수를 표현하는 방법 (2의 보수)

📌 컴퓨터는 0과 1만 이해하기 때문에, 음수를 표현할 수 있는 방법이 필요
📌 현재 가장 많이 사용되는 방식은 '2의 보수(Two’s Complement)'

 

2의 보수 구하는 방법 1️⃣ 모든 비트를 반전(0↔1, 1↔0) 2️⃣ 1을 더하기

예) 2진수 5(0101)의 음수(-5)를 구하는 과정

 

1. 0101 (5의 2진수)
2. 1010 (비트 반전)
3. 1011 (1 더하기)
=> 1011이 -5를 표현하는 2진수!​

 

📌 2의 보수 방식의 장점

  • 덧셈과 뺄셈을 동일한 연산 방식으로 처리 가능
  • 컴퓨터에서 음수를 쉽게 다룰 수 있도록 설계됨

🏁 정리: 컴퓨터가 숫자를 표현하는 방식

📌 컴퓨터는 0과 1(이진수)로 모든 데이터를 처리
📌 비트(Bit) → 바이트(Byte) → 킬로바이트(KB) 순으로 정보 단위 증가
📌 16진법을 사용하면 2진수를 더 쉽게 표현 가능
📌 2의 보수법을 이용하여 음수를 표현


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

  • 컴퓨터는 0과 1(비트)로 정보를 처리한다
  • 2진수(이진법)와 16진수의 개념과 변환 방법
  • 음수를 표현하는 2의 보수법을 이해함

 

 

출처:
혼자공부하는 운영체제 - 강민철

+ Recent posts