경일게임아카데미 멀티 디바이스 메타버스 플랫폼 개발자 양성과정 20220425 2022/04/04~2022/12/13

Jinho Lee·2022년 4월 25일
0

경일 메타버스 20220425 4주차 1일 수업내용. C언어 식별자, 선언, 구문, 객체와 상수, 변수, 백준 실습

C 언어 프로그래밍

C언어 프로그래밍 https://docs.google.com/document/d/1pTQ2cg7jq36qksTc5IRbD86jXhDA6vpIgkhbzS9uyrk/edit

간단 정리

1. 기본 개념

  • 식별자 (identifier) : 여러 요소를 구분짓는 이름. 최대한 구체적으로 적는다.
    • 숫자로 시작할 수 없다.
    • 대소문자를 구분한다.
    • 키워드를 사용할 수 없다.
    • 속성
      • 범위 (Scope) : 식별자가 유효한 공간, 명령.
      • 이름 공간 (Name Space): 식별자에게 카테고리를 제공
      • 연결 (Linkage): 서로 다른 범위나 번역 범위를 가질 때, 이를 참조할 수 있는 것.
  • 선언 (Declaration) : 프로그램에게 식별자가 어떤 의미인지, 어떤 속성을 갖는지 알려주는 것
    • 정의 (Definition) : 식별자에 대한 모든 정보를 제공하는 선언
  • 구문 (Statement) : 컴퓨터에게 명령하는 것. 세미콜론으로 구문을 구분.
    • 복합 구문 (Compound Statement) : 블록 (Block).
    • 식 구문 (Expression Statement) : 계산을 할 수 있는 구문으로 연산자와 피연산자의 시퀀스. 평가 (Evaluation)
    • 분기문 (Selection Statement) : 식의 결과에 따라서 선택지를 제공하는 구문. if / switch
    • 반복문 (Iteration Statement) : 어떤 구문을 반복하는 구문. for / while / do-while
    • 점프문 (Jump Statement) : 조건에 관계없이 어떤 곳으로 이동하는 구문. break / continue/ goto
  • 주석 (Comment) : 사용자에게 정보를 제공하는 것. 코드의 의미(코드를 이렇게 작성한 이유)를 설명할 때 사용.

2. 객체

  • 객체 (Object) : 메모리. 데이터를 조작하는 영역.
    • 크기 (Size) : 데이터를 저장하기 위한 바이트 수
    • 정렬 요건 (Alignment Requirement) : 데이터를 저장하기 위해 필요한 연속적인 바이트 수
    • 기억 존속 시간 (Storage Duration) : 데이터를 얼마나 오래 사용할 수 있는지. (데이터 유효성)
    • 값 (Value) : 데이터
    • 수명 (Lifetime) : 객체가 살아있는 시간. 보통 기억 존속 시간과 같음.
    • 타입 (Type) : 데이터를 해석하는 방법.
    • 식별자 (Identifier) : 객체를 구분짓는 이름.
  • 타입
    • Integer : int, signed char, short, long, long long
    • Floating-point : float, double, long double
    • Character : char
    • Conversion : 데이터를 다른 타입으로 해석하는 것.
      • Implicit (암시적) / Explicit (명시적, Casting)
  • 변수 (Variable) : 여러 데이터를 저장할 수 있는 객체
  • 상수 (Constant) : 데이터가 변하지 않는 객체. Constant

3. 분기문

  • 분기문 : 프로그램에게 여러 흐름을 제공하는 구문
  • if / switch

식별자

식별자(Identifier)는 C 프로그램에서 여러 요소를 구분하는 데 사용된다. 식별자는 C 프로그램에서 특수한 의미를 가지는 키워드(Keyword)를 제외하고 일련의 규칙에 맞춰 작성할 수 있다. 규칙은 아래와 같다.

  • 숫자로 시작할 수 없다.
  • 대소문자를 구별한다.
  • 모든 식별자는 항상 구체적으로 적어야 가독성이 좋다. 이를 위해 코딩 컨벤션(Coding Convention)이라는 것이 있다.
  • 유니코드도 지원

선언

  • 선언 (Declaration): 식별자에 의미와 속성을 지정. 식별자는 선언을 통해 프로그램에게 알려진다.
    • 정의 (Definition): 식별자에 대한 모든 정보를 제공하는 선언.
      식별자는 선언될 때 범위(Scope)를 가지며, 네 개의 이름 공간(Name Space) 중 하나에 속하게 된다. 어떤 식별자는 서로 다른 범위나 번역 단위를 가질 때, 그것을 참조할 수 있는 연결(Linkage)을 가진다.
  • 번역 : 프로그래밍 언어를 기계어로 전환
  • 범위는 프로그램이 식별자를 볼 수 있는(Visible) 영역이다. 범위는 네 가지가 있다.

    • 블록 범위(Block Scope)

      • 복합 구문(중괄호) 안 쪽에서만 식별자를 볼 수 있는 영역이다.
      • 이 범위를 갖는 식별자는 (엄밀히는 변수) 어떠한 연결도 가지지 않으며, 자동 기억 존속 시간(Automatic Storage Duration)을 갖는다.
    • 파일 범위(File Scope)

      • 파일 전체에서 식별자를 볼 수 있는 영역이다.
      • 이 범위를 갖는 식별자는 외부 연결(External Linkage)과 정적 기억 존속 시간(Static Storage Duration)을 기본적으로 갖는다.
    • 함수 범위(Function Scope)

      • 함수 내 레이블(Label)이 갖는 영역이다.
    • 함수 프로토타입 범위(Function Prototype Scope)
      함수 선언에서 매개변수 목록에 소개된 식별자의 영역이다.

  • C 프로그램은 식별자에 카테고리를 지정해 같은 식별자라 할지라도 구분할 수 있다. 이런 카테고리를 이름 공간이라고 한다. C에서 이름 공간은 4가지가 있다.

    • 레이블 이름 공간
      • 레이블만 저장한다.
    • 태그 이름 공간
      • 구조체, 공용체, 열거형의 이름을 저장한다.
    • 멤버 이름 공간
      • 구조체나 공용체의 멤버 이름을 저장한다. 모든 구조체와 공용체는 독자적인 공간을 갖고 있다.
    • 일반 이름 공간
      - 위의 세 가지를 제외한 나머지의 이름을 저장한다.
      • 23 표준부터는 2개가 더 추가되었지만, 우리는 이를 배우진 않을 것이다.
      • 서로 같은 식별자를 써서 가리는 것을 쉐도잉(Shadowing)이라고 한다.

구문

구문은 컴퓨터에게 명령을 내리기 위해 사용한다. 구문에는 5가지 종류가 있다.

  • 복합 구문(Compound Statement)

    • 블록(Block)이라고도 하며, 중괄호로 묶인 구문과 선언의 시퀀스를 일컫는다.
  • 식 구문

    • 계산을 정하는 연산자(Operator)와 피연산자(Operand)의 시퀀스다.
    • 연산자(Operator)의 C++ references : https://en.cppreference.com/w/c/language/expressions
    • 계산을 하는 것을 평가(Evaluation)라 하며, 평가는 결과를 만들거나, 사이드 이펙트(Side-Effect)를 생성하거나 변수나 함수를 지정할 수 있다.
    • 식 없이 쓰인 식 구문을 널 구문(Null Statement)이라고 한다.
      • 아무것도 없는 식 ex) ; (무한 반복 등에 사용할 수 있다.)
  • 분기문

    • 식의 계산에 따라 몇 개의 구문 중 하나를 선택하게 하는 구문이다.
    • if / else / switch가 있다.
  • 반복문

    • 특정 구문을 반복하는 구문이다.
    • while / do-while / for가 있다.
  • 점프문

    • 조건에 관계없이 흐름을 바꾸는 구문이다.
    • break / continue / return / goto가 있다.
  • 선언을 제외하고 모든 구문은 레이블(Label)이 될 수 있다. 레이블은 콜론으로 끝나며 goto문의 타겟을 설정하거나, switch 문에서 case / default 레이블을 지정하는 데 사용된다.

주석

주석(Comment)은 사용자에게 정보를 남기는 문서 역할을 한다. 프로그램에서는 아무 효용이 없으며 오직 코드를 읽는 사람에게만 효과가 있다.
주석에는 2가지가 있다.

/* */
여러줄을 작성할 수 있다.
// 한 줄만 작성할 수 있다.

  • 좋은 소스코드는 주석이 많이 필요 없다.

정리

우리는 구문을 통해 컴퓨터에게 명령을 내릴 수 있으며, 구문에 사용되는 여러 C 프로그램의 요소는 식별자에 의해 구분된다. 이렇게 작성한 구문은 main 함수에서 시작이 된다.

객체

C 프로그램에서 데이터가 저장되는 영역을 객체(Object)라 한다. 객체는 선언을 통해 생성될 수 있고, 모든 객체는 아래와 같은 속성을 가진다.

  • 크기(Size)
    • 데이터를 저장하기 위한 바이트의 개수를 의미한다.
  • 정렬 요건(Alignment Requirement)
    • 데이터를 저장하기 위해 필요한 연속적인 바이트 개수다.
    • 데이터에 접근을 하기 위해서는 정렬된 주소가 필요하다.
  • 기억 존속 시간(Storage Duration)
    • 데이터를 얼마나 오래 가질 수 있는지를 의미한다.
  • 수명(Lifetime)
    • 객체가 유효한 시간을 의미하며 기억 존속 시간과 같다.
  • 타입(Type)
    • 데이터 해석 방법이다. 가장 중요한 속성.
  • 값(Value)
    • 데이터 자체를 의미한다.
  • 식별자(Identifier)
    • 객체의 이름을 의미한다. 어떤 객체는 생략될 수 있다. (무명 객체)
  • 이 중 가장 중요한 속성은 타입이다.

타입

타입(Type)은 객체에 저장된 이진수나 식에서 평가된 이진수의 해석을 결정한다. 우선은 기본 타입부터 알아가보자.

  • 정수 정수에는 signed char, short, int, long, long long이 있다.
    • 위의 타입은 부호를 가지고 있다. MSB(Most Significant Bit)를 부호 비트로 사용해 0이면 양수, 1이면 음수로 취급한다. 음수는 2의 보수를 이용하여 표현한다. 2의 보수는 1의 보수에 +1을 해주면 된다. -12을 2진수로 표현해보자면 아래와 같다.
    1. 먼저 12을 이진수로 표현한다. ⇒ 0000 1100

    2. 1의 보수를 취해준다. ⇒ 1111 0011

    3. +1을 더해준다 ⇒ 1111 0100

      만일 부호를 없이 사용하고 싶다면 unsigned를 붙이면 된다.

  • 실수
    • C 언어에서는 실수를 표현하기 위해 부동 소수점으로 표현하고, 그 중 IEEE-754 포맷을 사용한다. IEEE-754는 비트를 부호, 지수, 정규화된 가수 부분으로 나눠 표현하는 방식이다. 실수 이외에도 무한대, NaN 등의 특수 값이 지정되어 있다.

      • 정규화된 가수 : 유효숫자
      • 사용할 때 항상 조심해야 한다. - 유효숫자
        • 특히 같다 (==)
  • 문자
    • 문자는 char 타입을 사용하며, ASCII 코드로 해석한다.
    • ASCII 코드 : https://www.ascii-code.com/
    • ASCII 코드는 출력 가능 문자(Graphical)과 출력 불가(Non-graphical)가 있다.
  • 변환
    • 때로는 데이터를 다른 타입으로 변환(Conversion)해야 할 때도 있다. 가령 정수형 데이터를 가지고 실수를 얻어내야 할 때 그렇다.
    • 변환에는 암시적 변환(Implicit Conversion)과 명시적 변환(Explicit Conversion)이 있다.
    • 암시적 변환피연산자의 타입이 연산자의 결과 타입과 매치가 되지 않을 때 일어난다.
      • 데이터를 보존할 수 있는 쪽으로 변환이 일어난다.
      • 작은 쪽에서 큰 쪽으로 변환되면 데이터가 손실될 수 있다.
      • 정수끼리는 크기가 큰 쪽으로 변환되며, 크기가 같을 때에는 unsigned로 변환된다. → 정수 승격(Integer Promotion)
      • 실수가 있다면 실수 타입으로 변환된다.
      • 실수끼리도 크기가 큰 쪽으로 변환된다.
      • 배열은 포인터로 변환된다.
    • 명시적 변환 : 캐스팅

변수

  • 여러 데이터를 담을 수 있는 객체를 변수(Variable)라 한다. 변수에 값을 넣을 때는 상수(Constant)나 리터럴(Literal) 혹은 식의 결과값으로 넣어준다.

    • 초기값을 항상 지정하자. 아니면 쓰레기값이 들어가 오류 발생.

예시 :

int main(void)
{
    // int 타입의 number 객체를 정의하고, 10으로 초기값을 지정했다.
    // 초기값을 지정하는 것을 초기화(Initialization)라고 한다.
    // 상수를 사용했다.
    int number = 10;
 
    // 실행 중간에 값을 바꿀 수도 있다.
    number = 20;
 
    // 다른 객체의 값을 가져올 수도 있다.
    int number2 = number;
 
    // 정수 상수는 아래 4가지 표현으로 작성할 수 있다.
    number = 42; // 10진수
    number = 052; // 8진수
    number = 0x2a; // 16진수
    number = 0X2a; // 16진수
 
    // 정수 상수의 타입은 아래와 같다.
    number2 = 42; // int
    number2 = 42U; // unsigned int
    number2 = 42L; // long
    number2 = 42UL; // unsigned long
    number2 = 42LL; // long long
    number2 = 42ULL; // unsigned long long
 
    // 부동 소수점 상수는 2가지 표현으로 작성할 수 있다.
    double realNumber = 1.2;
    realNumber = 1.2e3; // 지수 표현법으로 1.2 * 10^3이다.
 
    // 부동 소수점 상수의 타입은 아래와 같다.
    realNumber = 1.2; // double
    realNumber = 1.2f; // float
    realNumber = 1.2L; // long double
 
    // 문자 상수는 ''으로 표현한다.
    char ch = 'a';
 
    return 0;
}
  • 입출력은 표준 입출력 라이브러리인 <stdio.h>를 사용한다. 이중 “형식화”된 입출력을 할 수 있는 scanf()와 printf()를 사용한다.
    단어 뒤의 f : formatted
    형식화 : 임의로 정해진 구조로 만들어짐
    레퍼런스(references)

    1. <stdio.h> : https://en.cppreference.com/w/c/io
    2. scanf() : https://en.cppreference.com/w/c/io/fscanf
    3. printf() : https://en.cppreference.com/w/c/io/fprintf
  • 리터럴(Literal) : 문자 그대로, % 뒤, 변수를 읽어옴
    ”%c” : 단일 문자
    ”%s” : 문자열
    ”%d” : 정수 (decimal)
    ”%f” : 부동 소수점 수 (기본적으로 double 타입)

    • 지정하지 않는 한 소수점 아래 6자리까지 출력
    • 옵션 : 영문자 앞에
      0 : 리딩제로를 추가
      숫자 : 전체 출력의 길이지정
      - : 출력 앞의 공백 제거, 왼쪽 정렬
      + : 부호 있는 형식이면 부호(+ 또는 -)를 사용하여 출력 값의 접두사로 붙인다.
      소수점 뒤 수 : 소수점 아래 몇까지 출력할까 결정
    • long long 사용 시 : %d의 디폴트는 int이므로 앞에 “ll”을 붙여 “%lld”형식으로 써야 문제없이 출력 가능.

    • Escape Sequence

      • \n : 개행 문자(Line Feed)
      • \t : 탭(Horizontal Tap)
      • \ : \ 출력
      • \” : “ 출력
  • scanf
    &변수 : address of, 변수의 주소를 지정
    ”” 속 공백은 변수 사이의 구분을 의미한다.

백준에서의 오류

  1. Escape Sequence 사용 주의
    출력에서 Escape Sequence를 사용해야 하는 경우를 주의하라.
  2. 실수 사용
    사용하는 데이터 타입을 고려하여 소수점 밑 유효숫자 등을 주의.
    나누기에서 실수의 결과를 내고 싶다면 실수로 계산을 행해야 함도 주의하라.
  3. scanf에서의 포인터 사용
    scanf에서 변수에 값을 넣고 싶다면 &연산자로 포인터를 지정해야 함을 주의하라.
  4. 연산 결과는 연산에 사용한 입력 값과 그 타입이 동일하다.
  • 오류의 종류
    1. Compile Error : 문법 오류
    2. Runtime Error : 프로그램 실행 중에 오류 발생
    3. Logic Error : 버그 발생 → 논리 오류
  • 타입이 매우 중요함을 기억하자

상수

변수의 타입을 지정할 때 const 타입 수식자(Type Qualifier)를 써주면 데이터를 변경할 수 없게 된다. 이렇게 데이터를 변경할 수 없는 객체를 상수(Constant)라 한다. 상수에 새로운 데이터를 할당하려고 하면 컴파일 오류가 발생한다.

  • const를 자주 사용하면 많은 오류를 방지 가능하다
  • 많은 cont는 코드의 강건성을 높인다
  • 강건성 : 오류가 나오기 힘든 성질

분기문

프로그램이 사용자의 선택에 따라서 다양한 동작을 보여주는 것이 좋을 것이다. 분기문에는 if와 switch가 있다.
if : https://en.cppreference.com/w/c/language/if
switch : https://en.cppreference.com/w/c/language/switch
scalar type(산술 타입 or 포인트 타입 - 정수형 or 실수형)

switch
int타입만 가능
default의 사용
1. 위 case와 매칭 되지 않는 값이 들어올 때
2. 절대 들어오면 안되는 값이 들어올 때

반복문

기계는 결국 사람이 반복적인 일을 잘하지 못하고 지겨워하므로 탄생하게 되었다. 그런 의미에서 반복문이 있다는 것은 매우 자명한 일이다. 반복문에는 while, do-while, for가 있으며 이와 관련된 점프문인 break, continue도 살펴보자.
while : https://en.cppreference.com/w/c/language/while
do-while : https://en.cppreference.com/w/c/language/do
for : https://en.cppreference.com/w/c/language/for
break : https://en.cppreference.com/w/c/language/break
continue : https://en.cppreference.com/w/c/language/continue

0개의 댓글