ποΈ [CS50] Lecture 2 μμ½: λ©λͺ¨λ¦¬μ λ°°μ΄
νλ²λ λνκ΅ CS50 μΈ λ²μ§Έ κ°μ - David Malan κ΅μ
π κ°μ κ°μ
ν μ€νΈ μ½κΈ° μμ€ λΆμ
- 1νλ μμ€: βOne fish, two fish, red fish, blue fishβ
- 3νλ μμ€: βCongratulations. Today is your dayβ¦β
- 10νλ μμ€: μ‘°μ§ μ€μ°μ 1984 첫 ꡬμ
- ν μ€νΈ νΉμ± λΆμ: λ¨μ΄ κΈΈμ΄, λ¬Έμ₯ κΈΈμ΄, ꡬλμ μΌλ‘ μ½κΈ° μμ€ νλ¨ κ°λ₯
μ΄λ² μ£Ό ν΅μ¬ μ£Όμ
- μ»΄νμΌ κ³Όμ μ μ¬ν μ΄ν΄: μμ€μ½λμμ κΈ°κ³μ΄κΉμ§μ 4λ¨κ³
- λ©λͺ¨λ¦¬ ꡬ쑰: μ»΄ν¨ν°κ° λ°μ΄ν°λ₯Ό μ μ₯νλ λ°©λ²
- λ°°μ΄κ³Ό λ¬Έμμ΄: μ°μλ λ°μ΄ν° ꡬ쑰μ μ΄ν΄
- μνΈν κΈ°μ΄: λ°μ΄ν° 보μμ κΈ°λ³Έ μ리
π§ μ»΄νμΌ κ³Όμ μ 4λ¨κ³
κΈ°μ‘΄ μ΄ν΄: makeμ μ§μ€
# κΈ°μ‘΄ λ°©μ
make hello
./hello
# μ€μ λ‘λ μ΄λ κ² λμ
clang hello.c -o hello
./hello
Clang μ»΄νμΌλ¬ μ§μ μ¬μ©νκΈ°
# κΈ°λ³Έ μ»΄νμΌ (a.out μμ±)
clang hello.c
# μΆλ ₯ νμΌλͺ
μ§μ
clang -o hello hello.c
# CS50 λΌμ΄λΈλ¬λ¦¬ λ§ν¬
clang -o hello hello.c -l cs50
μ»΄νμΌμ 4λ¨κ³ λΆν΄
1λ¨κ³: μ μ²λ¦¬ (Preprocessing)
#include <stdio.h> // μ΄ λΌμΈμ΄
// μ€μ λ‘λ printfμ νλ‘ν νμ
μΌλ‘ κ΅μ²΄λ¨:
// int printf(const char *format, ...);
#include <cs50.h> // μ΄ λΌμΈμ΄
// μ€μ λ‘λ get_stringμ νλ‘ν νμ
μΌλ‘ κ΅μ²΄λ¨:
// string get_string(const char *prompt);
μ μ²λ¦¬κΈ° μν :
-
#includeμ§μλ¬Έμ μ°Ύμ ν΄λΉ νμΌ λ΄μ©μ 볡μ¬-λΆμ¬λ£κΈ° - ν€λ νμΌμ ν¨μ νλ‘ν νμ μ μμ€μ½λμ μ½μ
2λ¨κ³: μ»΄νμΌ (Compiling)
- C μμ€μ½λλ₯Ό μ΄μ λΈλ¦¬ μΈμ΄λ‘ λ³ν
- μ΄μ λΈλ¦¬: κΈ°κ³μ΄λ³΄λ€λ μ½κΈ° μ½μ§λ§ μ¬μ ν μ μμ€ μΈμ΄
- κ³Όκ±°μλ νλ‘κ·Έλλ¨Έκ° μ§μ μ΄μ λΈλ¦¬λ‘ μ½λ©
3λ¨κ³: μ΄μ λΈλ§ (Assembling)
- μ΄μ λΈλ¦¬ μ½λλ₯Ό κΈ°κ³μ΄(0κ³Ό 1)λ‘ λ³ν
-
a.outνμΌλͺ μ μ λ: βassembler outputβ
4λ¨κ³: λ§νΉ (Linking)
- μ¬λ¬ κ°μ κΈ°κ³μ΄ νμΌμ νλλ‘ κ²°ν©
-
hello.c,cs50.c,stdio.cμ κΈ°κ³μ΄λ₯Ό μ°κ²° - μ΅μ’ μ€ν κ°λ₯ν νμΌ μμ±
π λλ²κΉ κΈ°λ²
1. printf λλ²κΉ (κΈ°μ΄)
for (int i = 0; i <= 3; i++) // λ²κ·Έ: <= μ¬μ©
{
printf("i is %i\n", i); // λλ²κΉ
μ© μΆλ ₯
printf("#\n");
}
// μΆλ ₯: i=0,1,2,3 μ΄ 4λ² (μλ: 3λ²)
printfμ νκ³:
- λ§€λ² μ¬μ»΄νμΌ νμ
- μμ μ½λ μΆκ°/μμ μ λ²κ±°λ‘μ
- 볡μ‘ν λ²κ·Έμλ λΉν¨μ¨μ
2. debug50 μ¬μ© (κΆμ₯)
# λλ²κ±° μ€ν
debug50 ./program_name
λλ²κ±° μ¬μ©λ²:
- λΈλ μ΄ν¬ν¬μΈνΈ μ€μ : μ½λ μΌμͺ½ μ¬λ°± ν΄λ¦
- Step Over: νμ¬ λΌμΈ μ€ν ν λ€μ λΌμΈμΌλ‘
- Step Into: ν¨μ λ΄λΆλ‘ λ€μ΄κ°κΈ°
- λ³μ λͺ¨λν°λ§: μ€μκ°μΌλ‘ λ³μ κ° νμΈ
λλ²κ±°μ μ₯μ :
- μ½λ μμ μμ΄ μ€ν μν νμΈ
- λ³μ κ°μ μ€μκ° μΆμ
- λ¨κ³λ³ μ€νμΌλ‘ λ Όλ¦¬ μ€λ₯ λ°κ²¬
3. λ¬λ²λ λλ²κΉ
- κ°λ : 무μλ¬Ό(κ³ λ¬΄ μ€λ¦¬)μκ² μ½λ μ€λͺ νκΈ°
- ν¨κ³Ό: λ§λ‘ μ€λͺ νλ κ³Όμ μμ λ Όλ¦¬μ μ€λ₯ λ°κ²¬
- CS50 Duck: cs50.aiμμ AI λμ λ°κΈ°
πΎ λ©λͺ¨λ¦¬μ λ°μ΄ν° νμ
λ°μ΄ν° νμ λ³ λ©λͺ¨λ¦¬ ν¬κΈ°
bool // 1 byte (λΉν¨μ¨μ : 1 bitλ©΄ μΆ©λΆνμ§λ§)
char // 1 byte
int // 4 bytes (32 bits)
float // 4 bytes
double // 8 bytes
long // 8 bytes
string // κ°λ³ ν¬κΈ° (λ¬Έμ μ + 1)
λ©λͺ¨λ¦¬ μ£Όμ κ°λ
λ©λͺ¨λ¦¬ = κ±°λν 격μ (μΊλ²μ€)
κ° λ°μ΄νΈλ κ³ μ ν μ£Όμ(μΈλ±μ€)λ₯Ό κ°μ§
μ£Όμ: 0 1 2 3 4 5 6 7 ...
λ°μ΄ν°: H e l l o \0 72 73 ...
μ μ νλ‘κ·Έλ¨ μμ
// λμ λ°©λ²: λ³μ κ°λ³ μ μΈ
int score1 = 72;
int score2 = 73;
int score3 = 33;
float average = (score1 + score2 + score3) / 3.0;
// κ°μ λ λ°©λ²: λ°°μ΄ μ¬μ©
int scores[3];
scores[0] = 72;
scores[1] = 73;
scores[2] = 33;
π λ°°μ΄ (Arrays)
λ°°μ΄μ κΈ°λ³Έ κ°λ
// λ°°μ΄ μ μΈκ³Ό μ΄κΈ°ν
int scores[3]; // ν¬κΈ° 3μΈ μ μ λ°°μ΄
scores[0] = 72; // 첫 λ²μ§Έ μμ (μΈλ±μ€ 0)
scores[1] = 73; // λ λ²μ§Έ μμ (μΈλ±μ€ 1)
scores[2] = 33; // μΈ λ²μ§Έ μμ (μΈλ±μ€ 2)
// μ¬μ©μ μ
λ ₯μΌλ‘ λ°°μ΄ μ±μ°κΈ°
for (int i = 0; i < 3; i++)
{
scores[i] = get_int("Score: ");
}
λ°°μ΄μ μ₯λ¨μ
μ₯μ :
- κ΄λ ¨ λ°μ΄ν°λ₯Ό λ Όλ¦¬μ μΌλ‘ κ·Έλ£Ήν
- λ°λ³΅λ¬ΈμΌλ‘ ν¨μ¨μ μ²λ¦¬
- λ©λͺ¨λ¦¬μ μ°μμ μΌλ‘ μ μ₯λμ΄ λΉ λ₯Έ μ κ·Ό
λ¨μ :
- Cμμλ λ°°μ΄ ν¬κΈ°λ₯Ό μλμΌλ‘ μ μ μμ
- λ°°μ΄ κ²½κ³λ₯Ό λ²μ΄λλ μ κ·Ό μ μν
- ν¬κΈ°κ° κ³ μ μ (μ»΄νμΌ μμ μ κ²°μ )
μμμ μ μ λ³μ νμ©
#include <stdio.h>
const int N = 3; // μ μ μμ (λλ¬Έμ κ΄λ‘)
int main(void)
{
int scores[N];
// λ°°μ΄ μ
λ ₯
for (int i = 0; i < N; i++)
{
scores[i] = get_int("Score: ");
}
// νκ· κ³μ°
float average = 0;
for (int i = 0; i < N; i++)
{
average += scores[i];
}
average /= N;
printf("Average: %.2f\n", average);
}
ν¨μμ λ°°μ΄ μ λ¬νκΈ°
float calculate_average(int array[], int length)
{
int sum = 0;
for (int i = 0; i < length; i++)
{
sum += array[i];
}
return (float) sum / length;
}
int main(void)
{
int scores[3] = {72, 73, 33};
float avg = calculate_average(scores, 3);
printf("Average: %.2f\n", avg);
}
π€ λ¬Έμμ΄ (Strings)
λ¬Έμμ λ³Έμ§ μ΄ν΄
// λ¬Έμλ μ«μλ€
char c1 = 'H'; // ASCII 72
char c2 = 'I'; // ASCII 73
char c3 = '!'; // ASCII 33
printf("%c%c%c\n", c1, c2, c3); // HI!
printf("%i %i %i\n", c1, c2, c3); // 72 73 33
λ¬Έμμ΄ = λ¬Έμ λ°°μ΄
// λ¬Έμμ΄μ μ€μ ꡬ쑰
string s = "HI!";
// λ©λͺ¨λ¦¬: ['H']['I']['!']['\0']
// 72 73 33 0
// λ°°μ΄λ‘ μ κ·Ό κ°λ₯
printf("%c\n", s[0]); // H
printf("%c\n", s[1]); // I
printf("%c\n", s[2]); // !
printf("%c\n", s[3]); // '\0' (null terminator)
NUL μ’ λ£ λ¬Έμ (\0)
- λͺ©μ : λ¬Έμμ΄μ λμ νμ
- κ°: 8κ°μ 0 λΉνΈ (ASCII 0)
- μ€μμ±: λ¬Έμμ΄ κΈΈμ΄ κ²°μ , λ©λͺ¨λ¦¬ μ€λ²λ° λ°©μ§
- ν¬κΈ°: λ¬Έμμ΄ κΈΈμ΄ + 1λ°μ΄νΈ
λ¬Έμμ΄ κΈΈμ΄ κ³μ°
#include <string.h>
// μλμΌλ‘ κΈΈμ΄ κ³μ°
int string_length(string s)
{
int length = 0;
while (s[length] != '\0')
{
length++;
}
return length;
}
// λΌμ΄λΈλ¬λ¦¬ ν¨μ μ¬μ© (κΆμ₯)
int main(void)
{
string name = get_string("Name: ");
int len = strlen(name); // string.hμ strlen ν¨μ
printf("Length: %i\n", len);
}
λ¬Έμμ΄ μ²λ¦¬ μμ
#include <string.h>
// λ¬Έμμ΄ κ° λ¬Έμ μΆλ ₯
string s = get_string("Input: ");
printf("Output: ");
for (int i = 0, n = strlen(s); i < n; i++)
{
printf("%c", s[i]);
}
printf("\n");
ν¨μ¨μ± κ°μ :
// λΉν¨μ¨μ : strlenμ λ§€λ² νΈμΆ
for (int i = 0; i < strlen(s); i++)
// ν¨μ¨μ : ν λ²λ§ κ³μ°
for (int i = 0, n = strlen(s); i < n; i++)
π λ¬Έμμ΄ μ‘°μ
λλ¬Έμ λ³ν νλ‘κ·Έλ¨
#include <ctype.h>
// λ°©λ² 1: ASCII κ° μ§μ μ‘°μ
for (int i = 0, n = strlen(s); i < n; i++)
{
if (s[i] >= 'a' && s[i] <= 'z')
{
printf("%c", s[i] - 32); // μλ¬Έμλ₯Ό λλ¬Έμλ‘
}
else
{
printf("%c", s[i]); // κ·Έλλ‘ μΆλ ₯
}
}
// λ°©λ² 2: ctype λΌμ΄λΈλ¬λ¦¬ μ¬μ© (κΆμ₯)
for (int i = 0, n = strlen(s); i < n; i++)
{
printf("%c", toupper(s[i])); // μλμΌλ‘ λλ¬Έμ λ³ν
}
2μ°¨μ λ°°μ΄: λ¬Έμμ΄ λ°°μ΄
// λ¬Έμμ΄ λ°°μ΄ μ μΈ
string words[2];
words[0] = "HI!";
words[1] = "BYE!";
// 2μ°¨μμ μ κ·Ό
printf("%c", words[0][0]); // 'H' (첫 λ²μ§Έ λ¨μ΄μ 첫 λ²μ§Έ λ¬Έμ)
printf("%c", words[1][2]); // 'E' (λ λ²μ§Έ λ¨μ΄μ μΈ λ²μ§Έ λ¬Έμ)
β¨οΈ λͺ λ Ήμ€ μΈμ (Command Line Arguments)
기본 ꡬ쑰
#include <stdio.h>
int main(int argc, string argv[])
{
// argc: argument count (μΈμ κ°μ)
// argv: argument vector (μΈμ λ°°μ΄)
}
κ°λ¨ν μΈμ¬ νλ‘κ·Έλ¨
int main(int argc, string argv[])
{
if (argc == 2)
{
printf("Hello, %s!\n", argv[1]);
}
else
{
printf("Hello, world!\n");
}
return 0;
}
μ€ν μμ:
./greet David # Hello, David!
./greet # Hello, world!
./greet David Malan # Hello, world! (argc = 3μ΄λ―λ‘)
argv λ°°μ΄ κ΅¬μ‘°
λͺ
λ Ήμ΄: ./greet David Malan
argv[0] = "./greet" (νλ‘κ·Έλ¨ μ΄λ¦, νμ ν¬ν¨)
argv[1] = "David" (첫 λ²μ§Έ μΈμ)
argv[2] = "Malan" (λ λ²μ§Έ μΈμ)
argc = 3 (μ΄ μΈμ κ°μ)
λͺ¨λ μΈμ μΆλ ₯νκΈ°
int main(int argc, string argv[])
{
for (int i = 0; i < argc; i++)
{
printf("argv[%i]: %s\n", i, argv[i]);
}
return 0;
}
μ’ λ£ μν (Exit Status)
int main(int argc, string argv[])
{
if (argc != 2)
{
printf("Missing command-line argument\n");
return 1; // μ€λ₯ μν
}
printf("Hello, %s!\n", argv[1]);
return 0; // μ±κ³΅ μν
}
μ’ λ£ μν νμΈ:
./status David
echo $? # 0 (μ±κ³΅)
./status
echo $? # 1 (μ€ν¨)
π μνΈν κΈ°μ΄ (Cryptography)
μνΈνμ κ°λ
νλ¬Έ(Plaintext) β [μνΈν μκ³ λ¦¬μ¦ + ν€] β μνΈλ¬Έ(Ciphertext)
ν΅μ¬ μμ:
- νλ¬Έ: μλ λ©μμ§ (μ: βHI!β)
- μνΈλ¬Έ: μνΈνλ λ©μμ§ (μ: βIJ!β)
- ν€: μνΈν/볡νΈνμ μ¬μ©λλ λΉλ° κ°
- μκ³ λ¦¬μ¦: μνΈν λ°©λ² (μ: Caesar cipher)
Caesar Cipher (μμ μνΈ)
// μνΈν: κ° λ¬Έμλ₯Ό ν€λ§νΌ μ΄λ
char plaintext = 'H'; // ASCII 72
int key = 1;
char ciphertext = plaintext + key; // 'I' (ASCII 73)
// 볡νΈν: ν€λ§νΌ μλ°©ν₯ μ΄λ
char decrypted = ciphertext - key; // 'H'
ROT13 μνΈν
#include <ctype.h>
void rot13(string text)
{
for (int i = 0, n = strlen(text); i < n; i++)
{
if (isalpha(text[i]))
{
if (islower(text[i]))
{
// μλ¬Έμ μ²λ¦¬ (a=97, z=122)
printf("%c", (text[i] - 'a' + 13) % 26 + 'a');
}
else
{
// λλ¬Έμ μ²λ¦¬ (A=65, Z=90)
printf("%c", (text[i] - 'A' + 13) % 26 + 'A');
}
}
else
{
printf("%c", text[i]); // λ¬Έμκ° μλ κ²½μ° κ·Έλλ‘
}
}
}
μνΈν νλ‘κ·Έλ¨ μμ
int main(int argc, string argv[])
{
if (argc != 2)
{
printf("Usage: ./caesar key\n");
return 1;
}
int key = atoi(argv[1]); // λ¬Έμμ΄μ μ μλ‘ λ³ν
string plaintext = get_string("Plaintext: ");
printf("Ciphertext: ");
for (int i = 0, n = strlen(plaintext); i < n; i++)
{
if (isalpha(plaintext[i]))
{
// μνλ²³ λ¬Έμλ§ μνΈν
char base = isupper(plaintext[i]) ? 'A' : 'a';
printf("%c", (plaintext[i] - base + key) % 26 + base);
}
else
{
printf("%c", plaintext[i]); // κ·Έ μΈλ κ·Έλλ‘
}
}
printf("\n");
return 0;
}
π― νλ‘κ·Έλλ° μμΉκ³Ό λͺ¨λ² μ¬λ‘
ν¨μ¨μ μΈ μ½λ μμ±
// λΉν¨μ¨μ : ν¨μλ₯Ό λ°λ³΅ νΈμΆ
for (int i = 0; i < strlen(s); i++)
{
// strlenμ΄ λ§€λ² νΈμΆλ¨
}
// ν¨μ¨μ : ν λ²λ§ κ³μ°
for (int i = 0, n = strlen(s); i < n; i++)
{
// strlenμ΄ ν λ²λ§ νΈμΆλ¨
}
μμ μ¬μ©νκΈ°
// λμ μ: λ§€μ§ λλ²
int scores[3];
for (int i = 0; i < 3; i++) { /* ... */ }
float average = sum / 3.0;
// μ’μ μ: μμ μ¬μ©
const int N = 3;
int scores[N];
for (int i = 0; i < N; i++) { /* ... */ }
float average = sum / (float) N;
λ²μ(Scope) κ΄λ¦¬
// μ μ λ³μ (λͺ¨λ ν¨μμμ μ κ·Ό κ°λ₯)
const int MAX_STUDENTS = 50;
int main(void)
{
// μ§μ λ³μ (main ν¨μμμλ§ μ κ·Ό κ°λ₯)
int scores[MAX_STUDENTS];
for (int i = 0; i < MAX_STUDENTS; i++) // iλ 루νμμλ§ μ ν¨
{
scores[i] = get_int("Score: ");
}
// printf("%d", i); // μ€λ₯: iλ μ¬κΈ°μ μ κ·Ό λΆκ°
}
π λ€μ λ¨κ³
μ΄λ² μ£Όμ°¨μμ λ°°μ΄ ν΅μ¬ κ°λ
- μ»΄νμΌ κ³Όμ : μ μ²λ¦¬ β μ»΄νμΌ β μ΄μ λΈ β λ§νΉ
- λ©λͺ¨λ¦¬ ꡬ쑰: λ°μ΄νΈ λ¨μμ μ£Όμ 체κ³
- λ°°μ΄: μ°μλ λ©λͺ¨λ¦¬μ κ°μ νμ λ°μ΄ν° μ μ₯
- λ¬Έμμ΄: null μ’ λ£ λ¬Έμ λ°°μ΄
- λλ²κΉ : printf, debugger, rubber duck
- λͺ λ Ήμ€ μΈμ: νλ‘κ·Έλ¨ μ€ν μ λ§€κ°λ³μ μ λ¬
- μνΈν: λ°μ΄ν° 보μμ κΈ°λ³Έ μ리
μμΌλ‘ λ°°μΈ λ΄μ©
- ν¬μΈν°: λ©λͺ¨λ¦¬ μ£Όμ μ§μ μ‘°μ
- λμ λ©λͺ¨λ¦¬ ν λΉ: mallocκ³Ό free
- μλ£κ΅¬μ‘°: μ°κ²° 리μ€νΈ, μ€ν, ν
- μκ³ λ¦¬μ¦: μ λ ¬, κ²μ, μ¬κ·
- νμΌ μ μΆλ ₯: λ°μ΄ν° μμμ±
μ€λ¬΄ μ°κ²°μ
- μμ€ν νλ‘κ·Έλλ°: μ΄μ체μ , λλΌμ΄λ² κ°λ°
- μλ² λλ μμ€ν : IoT, λ§μ΄ν¬λ‘컨νΈλ‘€λ¬
- κ²μ κ°λ°: λ©λͺ¨λ¦¬ μ΅μ ν, μ±λ₯ νλ
- 보μ: μνΈν, ν΄μ ν¨μ, λμ§νΈ μλͺ
π‘ λ§λ¬΄λ¦¬ λ©μμ§
μ΄λ² κ°μμμλ μ»΄ν¨ν°μ λ΄λΆ λμ μ리λ₯Ό κΉμ΄ μκ² μ΄ν΄λ³΄μμ΅λλ€. μμ€μ½λκ° μ΄λ»κ² μ€ν κ°λ₯ν νλ‘κ·Έλ¨μ΄ λλμ§, λ©λͺ¨λ¦¬μμ λ°μ΄ν°κ° μ΄λ»κ² μ μ₯λκ³ κ΄λ¦¬λλμ§ μ΄ν΄νκ² λμμ΅λλ€.
λ°°μ΄κ³Ό λ¬Έμμ΄μ νλ‘κ·Έλλ°μ κΈ°μ΄ μ€μ κΈ°μ΄μ λλ€. μ΄λ€μ μ μ΄ν΄νλ©΄ λ 볡μ‘ν μλ£κ΅¬μ‘°λ μ½κ² μ΄ν΄ν μ μμ΅λλ€. CμΈμ΄μμ λ¬Έμμ΄μ΄ λ¨μν λ¬Έμ λ°°μ΄μ΄λΌλ μ¬μ€μ μ΄ν΄νλ€λ©΄, λ€λ₯Έ μΈμ΄μ λ¬Έμμ΄ μ²λ¦¬λ ν¨μ¬ λͺ νν΄μ§ κ²μ λλ€.
λλ²κΉ μ νλ‘κ·Έλλ° μ€λ ₯μ ν΅μ¬μ λλ€. printfλ‘ μμν΄μ μ λ¬Έμ μΈ λλ²κ±° μ¬μ©λ²κΉμ§ μ΅νλ€λ©΄, 볡μ‘ν λ²κ·Έλ 체κ³μ μΌλ‘ ν΄κ²°ν μ μμ΅λλ€. λ¬λ²λ λλ²κΉ μ²λΌ κ°λ¨ν κΈ°λ²λ λλΌμΈ μ λλ‘ ν¨κ³Όμ μμ κΈ°μ΅νμΈμ.
λ©λͺ¨λ¦¬ κ΄λ¦¬μ ν¨μ¨μ± κ³ λ €λ μ’μ νλ‘κ·Έλλ¨Έμ νμ λλͺ©μ λλ€. strlenμ λ°λ³΅ νΈμΆνμ§ μκΈ°, μμ μ¬μ©νκΈ° λ±μ μμ μ΅κ΄λ€μ΄ λͺ¨μ¬ ν° μ°¨μ΄λ₯Ό λ§λλλ€.
λ§μ§λ§μΌλ‘ μνΈνλ νλ λμ§νΈ μΈμμ νμ μμμ λλ€. κ°λ¨ν Caesar cipherλΆν° μμνμ§λ§, μ΄κ²μ΄ RSA, AES κ°μ νλ μνΈν κΈ°μ μ κΈ°μ΄κ° λ©λλ€. λ°μ΄ν° 보μμ μ€μμ±μ νμ μΌλμ λκ³ νλ‘κ·Έλ¨μ μμ±νμΈμ.