경일 메타버스 20220425 4주차 1일 수업내용. 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)이라는 것이 있다.
- 유니코드도 지원
범위는 프로그램이 식별자를 볼 수 있는(Visible) 영역이다. 범위는 네 가지가 있다.
블록 범위(Block Scope)
파일 범위(File Scope)
함수 범위(Function Scope)
함수 프로토타입 범위(Function Prototype Scope)
함수 선언에서 매개변수 목록에 소개된 식별자의 영역이다.
C 프로그램은 식별자에 카테고리를 지정해 같은 식별자라 할지라도 구분할 수 있다. 이런 카테고리를 이름 공간이라고 한다. C에서 이름 공간은 4가지가 있다.
- 23 표준부터는 2개가 더 추가되었지만, 우리는 이를 배우진 않을 것이다.
- 서로 같은 식별자를 써서 가리는 것을 쉐도잉(Shadowing)이라고 한다.
구문은 컴퓨터에게 명령을 내리기 위해 사용한다. 구문에는 5가지 종류가 있다.
복합 구문(Compound Statement)
식 구문
분기문
반복문
점프문
선언을 제외하고 모든 구문은 레이블(Label)이 될 수 있다. 레이블은 콜론으로 끝나며 goto문의 타겟을 설정하거나, switch 문에서 case / default 레이블을 지정하는 데 사용된다.
주석(Comment)은 사용자에게 정보를 남기는 문서 역할을 한다. 프로그램에서는 아무 효용이 없으며 오직 코드를 읽는 사람에게만 효과가 있다.
주석에는 2가지가 있다.
/* */
여러줄을 작성할 수 있다.
// 한 줄만 작성할 수 있다.
- 좋은 소스코드는 주석이 많이 필요 없다.
우리는 구문을 통해 컴퓨터에게 명령을 내릴 수 있으며, 구문에 사용되는 여러 C 프로그램의 요소는 식별자에 의해 구분된다. 이렇게 작성한 구문은 main 함수에서 시작이 된다.
C 프로그램에서 데이터가 저장되는 영역을 객체(Object)라 한다. 객체는 선언을 통해 생성될 수 있고, 모든 객체는 아래와 같은 속성을 가진다.
- 이 중 가장 중요한 속성은 타입이다.
타입(Type)은 객체에 저장된 이진수나 식에서 평가된 이진수의 해석을 결정한다. 우선은 기본 타입부터 알아가보자.
먼저 12을 이진수로 표현한다. ⇒ 0000 1100
1의 보수를 취해준다. ⇒ 1111 0011
+1을 더해준다 ⇒ 1111 0100
만일 부호를 없이 사용하고 싶다면 unsigned를 붙이면 된다.
C 언어에서는 실수를 표현하기 위해 부동 소수점으로 표현하고, 그 중 IEEE-754 포맷을 사용한다. IEEE-754는 비트를 부호, 지수, 정규화된 가수 부분으로 나눠 표현하는 방식이다. 실수 이외에도 무한대, NaN 등의 특수 값이 지정되어 있다.
여러 데이터를 담을 수 있는 객체를 변수(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)
리터럴(Literal) : 문자 그대로, % 뒤, 변수를 읽어옴
”%c” : 단일 문자
”%s” : 문자열
”%d” : 정수 (decimal)
”%f” : 부동 소수점 수 (기본적으로 double 타입)
long long 사용 시 : %d의 디폴트는 int이므로 앞에 “ll”을 붙여 “%lld”형식으로 써야 문제없이 출력 가능.
Escape Sequence
- scanf
&변수 : address of, 변수의 주소를 지정
”” 속 공백은 변수 사이의 구분을 의미한다.
- 타입이 매우 중요함을 기억하자
변수의 타입을 지정할 때 const 타입 수식자(Type Qualifier)를 써주면 데이터를 변경할 수 없게 된다. 이렇게 데이터를 변경할 수 없는 객체를 상수(Constant)라 한다. 상수에 새로운 데이터를 할당하려고 하면 컴파일 오류가 발생한다.
프로그램이 사용자의 선택에 따라서 다양한 동작을 보여주는 것이 좋을 것이다. 분기문에는 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