* 프로그래머스, 타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js) 5기 강의 수강 내용을 정리하는 포스팅.

* 원활한 내용 이해를 위해 수업에서 제시된 자료 이외에, 개인적으로 조사한 자료 등을 덧붙이고 있음.
타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js) 5기

1. 프로그래밍의 기본 원리 2

분기문 및 반복문

분기문

  • 특정 조건에 따라 실행 경로를 분기.
int num = 10;

if (num > 0) {
    printf("양수입니다.\n");
} else {
    printf("0 또는 음수입니다.\n");
}

switch (num) {
    case 1: printf("1입니다.\n"); break;
    case 10: printf("10입니다.\n"); break;
    default: printf("알 수 없는 값입니다.\n");
}

반복문

  • 특정 조건이 참인 동안 코드를 반복 실행.
for (int i = 0; i < 5; i++) {
    printf("%d ", i); // 0 1 2 3 4
}

int i = 0;
while (i < 5) {
    printf("%d ", i++);
}

지역변수와 전역변수

1. 지역변수 (Local Variable)

  • 정의: 함수 또는 코드 블록 내부에서 선언된 변수로, 해당 블록에서만 접근 가능하다.
  • 특징:
    • 블록({})이 종료되면 메모리에서 사라진다.
    • 다른 함수나 블록에서 접근할 수 없다.
    • 메모리 효율성이 높다.
  • 사용 목적:
    • 함수 내부의 임시 데이터를 저장.
    • 다른 함수와 독립적으로 동작하도록 설계.

예제

#include <stdio.h>

void example() {
    int localVar = 10; // 지역변수
    printf("지역변수 값: %d\n", localVar);
}

int main() {
    example();
    // printf("%d", localVar); // 오류: localVar은 main에서 접근 불가
    return 0;
}

2. 전역변수 (Global Variable)

  • 정의: 함수 외부에서 선언된 변수로, 프로그램의 모든 함수에서 접근 가능하다.
  • 특징:
    - 프로그램이 종료될 때까지 메모리에 유지된다.
    - 모든 함수에서 접근할 수 있지만, 잘못된 사용으로 데이터 충돌 발생 가능.
    - 디버깅과 유지보수가 어려워질 수 있다.
  • 사용 목적:
    - 프로그램 전체에서 공유해야 하는 데이터를 저장.

예제

#include <stdio.h>

int globalVar = 20; // 전역변수

void example() {
    printf("전역변수 값: %d\n", globalVar);
}

int main() {
    example();
    globalVar = 30; // 전역변수 값 변경
    printf("변경된 전역변수 값: %d\n", globalVar);
    return 0;
}

3. 지역변수와 전역변수의 차이점

특성지역변수 (Local Variable)전역변수 (Global Variable)
선언 위치함수 또는 블록 내부함수 외부
접근 범위선언된 함수 또는 블록 내에서만 접근 가능프로그램 전체에서 접근 가능
생명 주기함수 또는 블록 실행 동안만 존재프로그램이 종료될 때까지 유지
메모리 사용스택(Stack) 메모리 사용데이터(Data) 영역 메모리 사용
디버깅 난이도쉬움어려움
예시int x; (함수 내부)int x; (함수 외부)

4. 전역변수 사용 시 주의사항

  1. 충돌 위험:
    • 여러 함수가 동일한 전역변수를 수정하면, 의도치 않은 값 변경이 발생할 수 있다.
  2. 유지보수 어려움:
    • 코드가 복잡해질수록 전역변수로 인한 문제를 추적하기 어려워진다.
  3. 대안:
    • 전역변수 대신 함수 매개변수와 반환값을 통해 데이터 전달을 고려한다.

전역변수 문제 예시

#include <stdio.h>

int counter = 0; // 전역변수

void increment() {
    counter++;
}

void decrement() {
    counter--;
}

int main() {
    increment();
    decrement();
    printf("Counter 값: %d\n", counter); // 값 예측이 어려움
    return 0;
}

5. 결국..

  • 지역변수 우선 사용:
    - 데이터가 특정 함수에만 관련이 있다면 지역변수를 사용하는 것이 더 안전하다.
  • 전역변수 최소화:
    - 꼭 필요한 경우에만 사용하며, 전역변수 사용을 문서화하고 철저히 관리한다.



함수, 배열, 포인터

함수

  • 특정 작업을 수행하는 코드 블록. 입력값(매개변수)을 받아 결과를 반환.
int add(int a, int b) {
    return a + b;
}

printf("%d", add(5, 3)); // 8

배열

  • 동일한 데이터 타입의 집합. 연속된 메모리 공간에 저장.
int arr[3] = {1, 2, 3};

printf("%d", arr[0]); // 1

포인터

  • 다른 변수의 메모리 주소를 저장하는 변수.
int a = 10;

int* ptr = &a; // a의 주소 저장

printf("%d", *ptr); // 10 (포인터를 통해 값에 접근)

함수 포인터

  • 함수의 주소를 저장하고 호출할 수 있는 포인터.
void sayHello() {
    printf("Hello, World!\n");
}

void (*funcPointer)() = sayHello; // 함수 주소 저장
funcPointer(); // Hello, World!



값에 의한 복사와 참조에 의한 복사

값에 의한 복사 (Call by Value)

  • 함수에 값을 전달할 때, 변수의 복사본을 전달.

  • 원본 변수는 영향을 받지 않음.

void increment(int n) {
    n++;
}

int a = 5;
increment(a);
printf("%d", a); // 5 (원본 변수는 변경되지 않음)

참조에 의한 복사 (Call by Reference)

  • 함수에 변수의 주소를 전달. 원본 변수에 영향을 줌.
void increment(int* n) {
    (*n)++;
}

int a = 5;
increment(&a);
printf("%d", a); // 6 (원본 변수 변경)
profile
프론트엔드 개발자를 준비하고 있습니다.

0개의 댓글