포스트

2024.06.12 프로그래머스 - C언어로 프로그래밍 근간 알아보기1

C언어로 프로그래밍 근간 알아보기1

개발자는 동작 원리를 이해 해야 한다!

  • 배울 내용
    1. 프로그래밍 기본 원리
    2. 겍체지향 철학의 이해
    3. 타입스크립트 기초
    4. 타입스크립트 기반의 리액트

컴파일 언어를 이해해야 하는 이유

  • 모든 프로그래밍 언어의 동작원리는 같다.
  • JS와 같은 스크립트 언어로는 동작원리를 이해하기 힘든 구조이다.
  • 컴파일 언어는 언어 동작의 근간을 이룬다.
  • 타입을 변수와 함수에 기본으로 사용해보면 TS를 더 쉽게 이해할 수 있다.

개발의 3단계 과정

  1. 구상
  2. 설계
  3. 구현

프로그래밍 언어란

  • 언어 : 사람과 사람간의 소통(통신 수단)
  • 프로그래밍 언어 : 사람과 컴퓨터 간의 소통 언어 (통신수단)

C언어로 Hello World 출력해보기

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
// int : 출력 값
// main : 함수이름
// void : 입력 값
// => 함수의 형태
int main(void)
{
	// printf 는 stdio.h 헤더 파일에 내장되어 있는 함수
	printf("Hello World\n");
	return;
}
  • C 언어의 기본 구성요소는 함수 (리액트 컴포넌트와 유사하다)
  • 컴파일러는 세미콜론 (;) 단위로 문장을 해석한다. (JS는 크게 상관없지만, 지켜주는 것이 좋다.)

변수와 자료형

  • 변수란 변경이 가능한 수
  • 변수에는 어떤 값이 들어갈지 예측할 수 없다.
  • 변수를 사용하는 이유
    • 메모리상에 올라가 있는 데이터를 식별하기 위해서
    • 메모리의 주소값을 식별하기 위해서
      • 주소값을 기억하는 것보다 의미있는 이름을 기억하는 것이 더 쉽다.

메모리의 영역

  • 코드 영역 : 실행 명령어들을 저장
  • 스택 영역 : 지역변수 및 매개변수 저장
  • 힙 영역 : 프로그래머가 직접 할당
    • 큐 메모리 라고도 한다.
  • 데이터 영역 : 전역변수, static 변수 저장

변수의 저장

변수의 저장.png

  • 원시 타입 데이터
    • 원시 타입 변수에는 이 저장된 콜스택 메모리의 주소 값이 저장된다.
    • 원시 타입 변수 식별자(변수이름) 자체는 콜스택 상의 실행 컨텍스트의 Lexical 환경이라는 곳에 저장된다.
    • 원시 타입 데이터 재할당 시에는 이전 메모리의 값을 바꾸는 게 아닌, 바꾸려고 하는 값이 저장된 기존의 주소를 바라보게 한다. (기존에 재할당하고자 하는 값이 이미 할당된 경우)
      • 새로운 값을 재할당 할 때는, 새로운 메모리를 확보하여 재할당하는 값을 저장하고 변수가 가리키는 주소값을 교체한다.
        • 주소값을 저장하는 변수를 포인터 변수라고 한다.
  • 참조 타입 데이터
    • 참조 타입 변수에는 메모리 힙의 주소값 이 저장된 콜스택 메모리상의 값을 가진 주소 가 저장된다.
      • JS에서 객체의 내부 요소별 값이 같아도, 주소가 달라서 같은 값으로 비교되지 않는 이유
  • 가비지 컬렉터
    • 더 이상 참조되지 않는 데이터는 가비지 컬렉터 (GC)에 의해 적절한 시점에 메모리에서 해제 한다.

자료형

  • 자료형
    • 선언한 변수가 어느정도의 메모리 공간을 사용할 것인지 결정
    • 효율적인 메모리 공간 활용을 위해 다양한 자료형이 언어별로 제공된다.

| 정수형/실수형 | 자료형 | 크기(Btye) | 데이터 표현 범위 | 유효자릿수 | | ————- | ———– | ———— | ——————————- | —————— | | 정수형 | char | 1 byte | -128 ~ +127 | | | 정수형 | short | 2 byte | -32768 ~ +32767 | | | 정수형 | int | 4 byte | -2147583648 ~ +2147483647 | | | 정수형 | long | 4 byte | -2147483648 ~ +2147483647 | | | 실수형 | float | 4 byte | -3.4 x 10^38 ~ +3.4 x 10^38 | 소수점 이하 6자리 | | 실수형 | double | 8 byte | -1.8 x 10^308 ~ +1.8 * 10^308 | 소수점 이하 16자리 | | 실수형 | long double | 10 ~ 16 byte | -1.8 * 10^308 ~ +1.8 * 10 ^ 308 | 소수점 이하 16자리 |

  • 문자형
    • 숫자만 인식하는 컴퓨터는 문자를 표현하기 위해 숫자와 특정 문자를 대응시키는 방법으로 문자를 인식한다.
      • ASCII 코드

상수

  • 상수는 변하지 않는 수를 의미한다.
    • 한번 입력한 값은 변경할 수 없는것이 변수와의 차이점
  • 메모리 공간에 할당된 공간이 존재하지만, 그 값을 변경할 수 없다.
    • 이러한 특성으로 인해, 변수와 다르게 선언과 동시에 초기화를 진행해주어야 한다.
  • const 키워드로 상수를 할당 및 생성 할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main()
{
		// 상수 선언
    const int TEN = 10;
    const double PI = 3.14;
    
    return 0;
}

상수와 변수의 차이

  • 변수는 값을 재할당 할 수 있지만, 상수는 값을 재할당 할 수 없다.
  • 변수는 선언 후 나중에 초기화를 진행해도 되지만, 상수는 선언과 동시에 초기화를 진행해야 한다.
    • 상수는 선언과 동시에 변경 불가능하기 때문에, 선언+ 초기화를 해야 한다.

C언어에서 사용자 입력 데이터 받기

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main()
{
   int input = 0;
   printf("값을 입력해주세요 : ");
   scanf("%d", &input); //사용자 입력 함수 scanf
   printf("입력한 값 : %d", input);
    return 0;
}

  • 사용자에게 정수 1개를 입력 받은 수에 5를 곱한 결과를 출력 해보는 코드

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
      #include <stdio.h>
        
      int main()
      {
         int input = 0;
         printf("값을 입력해주세요, (결과는 5배수로 출력됩니다) : ");
         scanf("%d", &input); //사용자 입력 함수 scanf
         printf("입력한 값 : %d", input * 5);
          return 0;
      }
        
    
  • 사용자로부터 알파벳 문제 하나를 입력 받고 이에 해당하는 숫자를 출력

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
      #include <stdio.h>
        
      int main()
      {
          char input;
          printf("숫자로 변환할 문자를 입력해주세요 : ");
          scanf("%c", &input);
          printf("사용자 입력 값 : %c | 숫자 변환 값 : %d", input, input);
          return 0;
      }
        
    
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.