프로그래머스 데브코스TIL

[week9] 프론트엔드 기초 : React + TypeScript (3)

이규현2026-03-11
[week9] 프론트엔드 기초 : React + TypeScript (3)

지난 시간까지 자바스크립트에 기본적인 내용을 확인했고, 이번시간부터 프로그래밍의 기본 원리부터해서 타입스크립트에 대하여 알아보도록하겠습니다.

프로그래밍의 기본 원리

프로그래밍의 기본 원리를 알아야 코드를 작성하다 문제가 생겼을 때 어디서 발생한 것인지 쉽게 파악하고 이해할 수 있습니다.

컴파일 언어

컴파일 언어(C, Java, Rust 등)는 사람이 작성한 코드(소스 코드)를 컴퓨터가 즉시 실행할 수 있는 기계어로 **미리 변환(컴파일)**하는 과정을 거치는 언어입니다.

반면, 자바스크립트는 코드를 한 줄씩 읽으며 실행하는 인터프리터(Interpreter) 방식을 기본으로 합니다. 이 차이가 왜 중요한지 아래 이유를 확인해 보세요.

왜 컴파일 언어를 이해해야 할까?

  • 모든 프로그래밍 언어의 동작 원리는 거의 똑같습니다.
  • 자바스크립트와 같은 스크립트 언어로는 동작 원리를 이해하기 힘든 구조입니다.
  • C 언어의 변수와 데이터타입, 배열, 포인터 등의 동작 원리들은 자바스크립트 언어 동작의 근간을 이룹니다.
  • 타입을 변수와 함수에 기본으로 사용해보면 타입스크립트를 더 쉽게 이해할 수 있습니다.

변수

변수란?

변경이 가능한 수를 의미합니다. 변수에는 어떤 값이 들어갈지 예측할 수 없습니다.

메모리 영역

변수를 저장하는 메모리 영역은 크게 4가지로 구분됩니다.

  • 코드 영역 - 실행 명령어를 저장
  • 스택 영역 - 지역변수 및 매개변수 저장
  • 힙 영역 - 프로그래머가 직접 할당
  • 데이터 영역 - 전역변수, static 변수 저장

콜스택, 메모리 힙의 데이터 저장 구조

  • 콜 스택 (Call Stack): * 실행 중인 함수가 쌓이는 공간입니다.

    • 원시 타입(Primitive types) 데이터가 실제로 저장되는 곳입니다.
    • 참조 타입 데이터의 **주소값(Reference)**이 저장되는 곳입니다.
  • 메모리 힙 (Memory Heap):

    • 크기가 정해지지 않은 참조 타입(Reference types) 객체들이 저장되는 넓은 공간입니다.
    • 런타임에 크기가 동적으로 변하는 데이터를 담기 위해 사용됩니다.
구분스택 영역 (주소)스택 영역 (값)힙 영역 (주소)힙 영역 (값)
원시 타입0x0110
참조 타입0x100x1000x100[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)데이터 표현 범위
정수형char1바이트-128 ~ +127
short2바이트-32,768 ~ +32,767
int4바이트-2,147,483,648 ~ +2,147,483,647
long4바이트-2,147,483,648 ~ +2,147,483,647
실수형float4바이트3.4 _ 10^-38 ~ 3.4 _ 10^38
double8바이트1.7 _ 10^-308 ~ 1.7 _ 10^308
long double10~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진수ASCII10진수ASCII10진수ASCII10진수ASCII
0NULL32SP (Space)64@96`
1SOH33!65A97a
2STX34"66B98b
3ETX35#67C99c
4EOT36$68D100d
5ENQ37%69E101e
6ACK38&70F102f
7BEL39'71G103g
8BS40(72H104h
9HT41)73I105i
10LF42*74J106j
11VT43+75K107k
12FF44,76L108l
13CR45-77M109m
14SO46.78N110n
15SI47/79O111o
16DLE48080P112p
17DC149181Q113q
18DC250282R114r
19DC351383S115s
20DC452484T116t
21NAK53585U117u
22SYN54686V118v
23ETB55787W119w
24CAN56888X120x
25EM57989Y121y
26SUB58:90Z122z
27ESC59;91[123{
28FS60<92\124|
29GS61=93]125}
30RS62>94^126~
31US63?95_127DEL
// 문자와 아스키 코드는 같은 값을 다르게 출력하는 것입니다
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