[week9] 프론트엔드 기초 : React + TypeScript (3)
![[week9] 프론트엔드 기초 : React + TypeScript (3)](/images/useBlog/TIL.png)
지난 시간까지 자바스크립트에 기본적인 내용을 확인했고, 이번시간부터 프로그래밍의 기본 원리부터해서 타입스크립트에 대하여 알아보도록하겠습니다.
프로그래밍의 기본 원리
프로그래밍의 기본 원리를 알아야 코드를 작성하다 문제가 생겼을 때 어디서 발생한 것인지 쉽게 파악하고 이해할 수 있습니다.
컴파일 언어
컴파일 언어(C, Java, Rust 등)는 사람이 작성한 코드(소스 코드)를 컴퓨터가 즉시 실행할 수 있는 기계어로 **미리 변환(컴파일)**하는 과정을 거치는 언어입니다.
반면, 자바스크립트는 코드를 한 줄씩 읽으며 실행하는 인터프리터(Interpreter) 방식을 기본으로 합니다. 이 차이가 왜 중요한지 아래 이유를 확인해 보세요.
왜 컴파일 언어를 이해해야 할까?
- 모든 프로그래밍 언어의 동작 원리는 거의 똑같습니다.
- 자바스크립트와 같은 스크립트 언어로는 동작 원리를 이해하기 힘든 구조입니다.
- C 언어의 변수와 데이터타입, 배열, 포인터 등의 동작 원리들은 자바스크립트 언어 동작의 근간을 이룹니다.
- 타입을 변수와 함수에 기본으로 사용해보면 타입스크립트를 더 쉽게 이해할 수 있습니다.
변수
변수란?
변경이 가능한 수를 의미합니다. 변수에는 어떤 값이 들어갈지 예측할 수 없습니다.
메모리 영역
변수를 저장하는 메모리 영역은 크게 4가지로 구분됩니다.
- 코드 영역 - 실행 명령어를 저장
- 스택 영역 - 지역변수 및 매개변수 저장
- 힙 영역 - 프로그래머가 직접 할당
- 데이터 영역 - 전역변수, static 변수 저장
콜스택, 메모리 힙의 데이터 저장 구조
-
콜 스택 (Call Stack): * 실행 중인 함수가 쌓이는 공간입니다.
- 원시 타입(Primitive types) 데이터가 실제로 저장되는 곳입니다.
- 참조 타입 데이터의 **주소값(Reference)**이 저장되는 곳입니다.
-
메모리 힙 (Memory Heap):
- 크기가 정해지지 않은 참조 타입(Reference types) 객체들이 저장되는 넓은 공간입니다.
- 런타임에 크기가 동적으로 변하는 데이터를 담기 위해 사용됩니다.
| 구분 | 스택 영역 (주소) | 스택 영역 (값) | 힙 영역 (주소) | 힙 영역 (값) |
|---|---|---|---|---|
| 원시 타입 | 0x01 | 10 | ||
| 참조 타입 | 0x10 | 0x100 | 0x100 | [1, 2, 3] |
// 원시 타입 → 스택에 직접 값이 저장됨
int x = 10; // 스택: [주소: 0x01, 값: 10]
// 참조 타입 → 스택에는 주소값만, 실제 데이터는 힙에 저장됨
int* arr = malloc(sizeof(int) * 3); // 스택: [주소: 0x10, 값: 0x100] / 힙: [주소: 0x100, 값: {1,2,3}]
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
자료형
자료형이란?
선언한 변수가 얼만큼의 메모리 공간을 할당할 것인지 결정합니다. 음식의 종류에 따라 그릇의 용도가 다른 것과 같은 원리입니다.
기본 자료형의 종류 및 표현 범위
| 분류 | 자료형(Data Type) | 크기(Byte) | 데이터 표현 범위 |
|---|---|---|---|
| 정수형 | char | 1바이트 | -128 ~ +127 |
short | 2바이트 | -32,768 ~ +32,767 | |
int | 4바이트 | -2,147,483,648 ~ +2,147,483,647 | |
long | 4바이트 | -2,147,483,648 ~ +2,147,483,647 | |
| 실수형 | float | 4바이트 | 3.4 _ 10^-38 ~ 3.4 _ 10^38 |
double | 8바이트 | 1.7 _ 10^-308 ~ 1.7 _ 10^308 | |
long double | 10~16바이트 | 1.2 _ 10^-4932 ~ 3.4 _ 10^104932 |
// 자료형별 변수 선언 예시
char c = 'A'; // 1바이트
short s = 32000; // 2바이트
int n = 2000000; // 4바이트
float f = 3.14f; // 4바이트
double d = 3.141592; // 8바이트
// sizeof() 로 실제 크기를 직접 확인해볼 수 있습니다
printf("char 크기: %d바이트\n", sizeof(char)); // 1
printf("short 크기: %d바이트\n", sizeof(short)); // 2
printf("int 크기: %d바이트\n", sizeof(int)); // 4
printf("float 크기: %d바이트\n", sizeof(float)); // 4
printf("double 크기: %d바이트\n", sizeof(double)); // 8
다양한 자료형을 제공하는 이유
효율적인 메모리 공간을 활용하기 위해서입니다.
정수, 실수
정수는 0을 포함한 부호가 있는 수입니다. 실수는 소수점 이하를 가지는 수를 말합니다.
int 정수 = 100; // 소수점 없음
float 실수 = 3.14f; // 소수점 있음
printf("%d\n", 정수); // 출력: 100
printf("%f\n", 실수); // 출력: 3.140000
문자형
숫자만 인식하는 컴퓨터는 문자를 표현하기 위해 특정 숫자와 특정 문자를 대응 시키는 방법을 사용합니다.
아스키 코드라는 표준에 의거합니다.
| 10진수 | ASCII | 10진수 | ASCII | 10진수 | ASCII | 10진수 | ASCII |
|---|---|---|---|---|---|---|---|
| 0 | NULL | 32 | SP (Space) | 64 | @ | 96 | ` |
| 1 | SOH | 33 | ! | 65 | A | 97 | a |
| 2 | STX | 34 | " | 66 | B | 98 | b |
| 3 | ETX | 35 | # | 67 | C | 99 | c |
| 4 | EOT | 36 | $ | 68 | D | 100 | d |
| 5 | ENQ | 37 | % | 69 | E | 101 | e |
| 6 | ACK | 38 | & | 70 | F | 102 | f |
| 7 | BEL | 39 | ' | 71 | G | 103 | g |
| 8 | BS | 40 | ( | 72 | H | 104 | h |
| 9 | HT | 41 | ) | 73 | I | 105 | i |
| 10 | LF | 42 | * | 74 | J | 106 | j |
| 11 | VT | 43 | + | 75 | K | 107 | k |
| 12 | FF | 44 | , | 76 | L | 108 | l |
| 13 | CR | 45 | - | 77 | M | 109 | m |
| 14 | SO | 46 | . | 78 | N | 110 | n |
| 15 | SI | 47 | / | 79 | O | 111 | o |
| 16 | DLE | 48 | 0 | 80 | P | 112 | p |
| 17 | DC1 | 49 | 1 | 81 | Q | 113 | q |
| 18 | DC2 | 50 | 2 | 82 | R | 114 | r |
| 19 | DC3 | 51 | 3 | 83 | S | 115 | s |
| 20 | DC4 | 52 | 4 | 84 | T | 116 | t |
| 21 | NAK | 53 | 5 | 85 | U | 117 | u |
| 22 | SYN | 54 | 6 | 86 | V | 118 | v |
| 23 | ETB | 55 | 7 | 87 | W | 119 | w |
| 24 | CAN | 56 | 8 | 88 | X | 120 | x |
| 25 | EM | 57 | 9 | 89 | Y | 121 | y |
| 26 | SUB | 58 | : | 90 | Z | 122 | z |
| 27 | ESC | 59 | ; | 91 | [ | 123 | { |
| 28 | FS | 60 | < | 92 | \ | 124 | | |
| 29 | GS | 61 | = | 93 | ] | 125 | } |
| 30 | RS | 62 | > | 94 | ^ | 126 | ~ |
| 31 | US | 63 | ? | 95 | _ | 127 | DEL |
// 문자와 아스키 코드는 같은 값을 다르게 출력하는 것입니다
char ch = 'A';
printf("%c\n", ch); // 출력: A (문자로 출력)
printf("%d\n", ch); // 출력: 65 (아스키 코드값으로 출력) ← 위 표의 65번 확인!
// 아스키 코드값을 직접 넣어도 같은 결과
char ch2 = 65;
printf("%c\n", ch2); // 출력: A
// 알파벳 순서도 숫자 연산으로 처리 가능
printf("%c\n", 'A' + 1); // 출력: B (65 + 1 = 66)
printf("%c\n", 'A' + 2); // 출력: C (65 + 2 = 67)
상수
상수란?
상수는 변하지 않는 수를 의미합니다. 메모리 공간에 수가 존재하지만 그 값을 변경할 수 없습니다.
선언 방법
변수 선언에 const 기호를 붙여주면 됩니다. 주의할 점은 선언과 동시에 초기화를 해야합니다.
// 옳바른 상수 선언 (선언과 동시에 초기화)
const int MAX_SIZE = 100;
const float PI = 3.14159f;
printf("%d\n", MAX_SIZE); // 출력: 100
//상수 값 변경 시도 → 컴파일 오류 발생!
MAX_SIZE = 200; // error: assignment of read-only variable 'MAX_SIZE'
// 초기화 없이 선언만 하는 것도 오류!
const int VALUE; // error: uninitialized const 'VALUE'
사용자로부터 데이터 입력
scanf
사용자로부터 데이터 입력 받을 시 사용하는 함수입니다.
#include <stdio.h>
int main() {
int age;
float height;
char grade;
// 정수 입력 받기
printf("나이를 입력하세요: ");
scanf("%d", &age); // &age: age 변수의 메모리 주소를 전달
printf("입력한 나이: %d\n", age);
// 실수 입력 받기
printf("키를 입력하세요: ");
scanf("%f", &height);
printf("입력한 키: %.1f\n", height);
// 문자 입력 받기
printf("학점을 입력하세요: ");
scanf(" %c", &grade); // 공백 문자(' ')로 앞의 공백/개행 제거
printf("입력한 학점: %c\n", grade);
return 0;
}
// 실행 예시:
// 나이를 입력하세요: 25
// 입력한 나이: 25
// 키를 입력하세요: 175.5
// 입력한 키: 175.5
// 학점을 입력하세요: A
// 입력한 학점: A