F.R.I.D.A.Y.

[TIPS 19TH] 02 : 2018.06.28. (목) 본문

외부활동/TIPS 19th

[TIPS 19TH] 02 : 2018.06.28. (목)

F.R.I.D.A.Y. 2018. 6. 29. 04:15
반응형

1. 상수

상수 : 프로그램을 실행할 때, 한번 값이 결정되면 프로그램이 끝날 때까지 다른 값으로 변하지 않는 정보


위의 것은 일반적으로 상수를 설명할 떄 취급하는 의미이고, 이번 TIPS에서는 다음으로 설명을 듣게 되었다.


기준 값 중 변하지 않는 값을 상수라고 한다. 즉, 특정 값을 적었을 때 컴파일러가 해당 값이 어떤 것을 의미하는지 알 수 있도록 서로 정해놓은 약속과 비슷한 것으로 보면 된다.


정수에서는 [ int ]가, 실수에서는 [ double ]이 기본 자료형으로 사용된다.

 자료형

기본 자료형 

 정수

int 

 실수

double 


...

char ch = 'A';

...


다음 코드에서 'A'는 자료형이 char로 생각하기 쉽지만, char은 'A'[각주:1]는 정수형이므로 정수형의 기본값인 [ int ]로 char형인 ch에 들어갈 때 암시적 형변환[각주:2]이 일어난다.


프로그래밍에서는 다음과 같은 상수가 지원된다.

>> 숫자 상수

>> 정수 상수 : 1, 2, 0, -1, -2

>> 실수 상수 : 3.14, 2.71

>> 문자 상수 : 'A', 'B', 'C'

>> 문자열 상수 : "Hello World"


++

추가 사항


다음 두 코드는 같은 표현이지만 1번 코드가 더 효율이 좋다.


// 1번 코드
int x1 = 3;
int a1 = 2 + 3 + x1;

// 2번 코드
int x2 = 3;
int a2 = x2 + 2 + 3;


이유는 1번의 경우 [ a1 ]변수에 2와 3, x1을 더해서 대입하는데, [ 2, 3 ]은 상수 리터럴이라서 둘을 더한 후 x1과 더하는데 반해, 2번의 경우 처음 [ x2 ]라는 변수가 나옴으로써 x2와 2를 더한 후, 3을 추가로 더하는 식으로 이루어진다. 그러므로 변수의 경우 계산식의 맨 마지막에 넣는 것이 좋다.


1번의 컴파일시 최적화

>> a2 = 5 + x1


2번의 컴파일시 최적화

>> temp[각주:3] = x2 + 2;

>> a2 = temp + 3;


보이는 것과 같이 1번은 한번에 계산이 끝나는 반면, 2번은 x2와 2를 더한 후, 그 값을 3과 더하는 식으로 컴파일이 이루어지므로 계산이 한 번 더 이뤄지는 것을 볼 수 있다 속도향상을 위해서는 상수를 앞에 두는게 좋다.



2. 상수 표현법 (진법)

C언어에서는 기본적으로 다음과 같은 세가지 진법을 지원한다. 추가로 맨 아래 설명한 것과 같이 이진법은 C언어 문법에서는 지원하지 않지만, 예외적으로 Visual Studio에서 아래와같은 방법으로 허용한다.

 진법

10진법 표기 

진법 표기 

준지원 여부

 8진법

 12

 014[각주:4]

 표준 지원

 10진법

 12

 12

 표준 지원

 16진법

 12

 0x000C[각주:5]

 표준 지원

 2진법

 12

 0b00001100[각주:6]

 표준 지원 아님


16진법은 2진법을 표시하기 가장 쉬운 방법이기 때문에 큰 수를 표기하기 힘든 이진수를 대신해 만들어졌다.

8진법의 경우, 옛날에서는 오늘날처럼 정확한 데이터가 전송된다는 보장이 없었기 때문에, 4비트 중 마지막 1비트를 해당 비트의 무결성을 검사하기 위해 사용했다. 따라서 [ 2^3 = 8 ] 8진법이 탄생하게 되었다.



3. 변수명 규칙

변수명은 다음과 같은 규칙하에 작성할 수 있다.

>> 영문자(대, 소문자), 숫자, ' _ ' 사용 가능

>> 숫자로 시작하거나 모두 숫자로 사용하는 것은 불가능하다.

>> 공백은 포함불가

>> 대소문자는 구별된다.

>> C언어 예약어[각주:7]는 변수명으로 사용이 불가능하다.



4. 변수 초기화

변수를 선언하고난 후 무조건적인 초기화는 프로그램의 속도를 떨어뜨린다. 아래 두 코드는 컴파일될 때 같은 방식으로 처리된다.


...

int n;
n = 0;

...

...

int n = 0;

...


쓸데 없는 대입절차를 거치기 때문에 속도가 떨어진다. 따라서 사용하는 목적에 따라 초기화를 해야하는 경우도, 그렇지 않은 경우도 있다.



5. 함수

함수의 역할

>> 큰 작업을 작은 단위로 쪼개기 위해

: 봐야하는 코드를 줄임으로써 봐야하는 코드에 집중을 할 수 있도록 함수를 사용한다.

>> 코드의 재사용성 향상

: 특정 코드를 하나의 프로그램에서만 사용하는 것이 아니라 여러 프로그램에서 사용할 수 있도록 조각화시킨다.


함수의 구조


...
int sum (int value1, int value2){
    int result = value1 + value2;
    return result;
}
...

처음 int는 함수의 반환형을, 그 다음 나오는 sum은 해당 함수의 이름을 의미한다.

괄호 사이에 있는 것은 매개변수, 혹은 파라미터라고 한다. 중괄호 사이에 있는 것은 해당 함수의 작업내용이다.


 한글명

영어명 

매개변수, 인자

파라미터(Parameter)

인수 

아규먼트(Argument) 



함수는 호출자(caller)와 피호출자(callee)로 나뉘는데 호출자는 특정 함수를 사용하는 함수를 말하고, 피호출자는 이렇게 사용되는 함수를 말한다. 다음 코드에서 호출자는 main이 되고, 피호출자는 sum이 된다.


#include <stdio.h>

int sum(int a, int b){
    int result;
    result = a + b;
    printf("%d\n" result);
}

int main(){
    int value1, value2;
    value1 = 2, value2 = 3;
    sum(value1, value2);

    return 0;
}


위와같이 코드를 작성하는 것처럼, 호출자 함수는 무조건 피호출자 함수보다 아래에 위치해야한다.

그러나 다음과 같은 코드는 서로 호출하기 때문에 컴파일 오류를 발생시킨다.


int A(){
    ...
    B();
    ...
}

int B(){
    ...
    A();
    ...
}


두 함수가 서로 호출하면서 무엇을 피호출자로 지정해야하는지 모르기 때문이다. 이러한 문제는 함수의 원형을 이용해 해결할 수 있다.


int A(); // << A 함수의 원형
int B(); // << B 함수의 원형

int A(){
    ...
    B();
    ...
}
int B(){
    ...
    A();
    ...
}


함수의 원형은 [ 함수의 반환형, 함수의 이름, 매개변수 ]를 포함해 작성한다.

단, 함수의 원형에서 매개변수의 이름은 작성할 필요가 없으나 이름을 함께 작성함으로써 해당 매개변수의 의미를 알리면서 작성하는 것이 좋다[각주:8].



6. 전처리기

전처리기

>> 컴파일러 지시자로 컴파일러의 행동을 제어하는 등에 사용한다. ' # '으로 시작하며 ' ; ' 을 사용하지 않는다.


#include 읽을_파일_명

>> 현재 파일을 처리하기 전에, #include 뒤에 있는 파일을 먼저 처리하라는 뜻. 일반적으로 헤더파일을 추가하는데 사용.


[ #include ]는 다음과 같이 사용된다.

 #include <읽을_파일_명>

 Visual studio에서 지원하는 헤더파일을 추가

 #include "읽을_파일_명"

 사용자 지정 헤더파일[각주:9]을 추가
 절대경로를 지정해서 사용할 수 있음


이 때, 쌍따옴표( " " )는 꺽쇄( < > )의 기능을 포함한다. 즉, 쌍따옴표로 [ #include ]는 프로젝트 폴더 내부를 검색한후, 프로젝트 폴더에 해당 파일이 존재하지 않는경우, Visual Studio의 헤더 폴더에서 재검색을한다.

#include < > #include " "를 구분해 써야 하는 이유


일반적으로 < >로 묶인경우에는 기본 헤더파일임을, " "로 묶인경우에는 사용자 지정 헤더파일임을 알리는 지표이므로 혼선을 주지 않기 위해 < >와 " "를 구분지어 사용해야한다.


#define NAME constant

>> 컴파일 전 소스코드 내 NAME이 적힌 부분을 [ constant ]로 치환한다.

>> 코드의 유지/보수를 위해 사용하기도 하지만, 단순 상수를 의미를 지닌 단어로 사용하기 위해 사용하기도 한다.


#define은 매크로 함수로 사용할 수도 있다.


#define POW1(x) (x * x)
#define POW2(x) ((x) * (x))

int main(){
	
	int a, b;
	a = POW1(1 + 1);      // Result : 3
     // a = (1 + 1*1 + 1);
	b = POW2(1 + 1);      // Result : 4
     // b = ((1+1) * (1+1));

	return 0;
}


a와 b에는 각각 3과 4가 저장되는데, 매크로함수의 경우에는 일반 함수처럼 사용되는 것이 아니라, 해당 부분을 아예 치환한 후에 컴파일을 하기 때문이다. 주석과 같이 치환되기 때문에[각주:10] 매크로함수에서는 전달되는 [ x ]를 사용할 때, 괄호로 묶어주는게 좋다.


참고사항

>> C++에서는 함수의 반환형 앞에 [ inline ]이라는 접두어를 통해 매크로함수와 비슷하게 사용할 수 있다. 즉, 코드 작성시에는 함수처럼 작성하고, 컴파일시엔 함수가 호출되는 부분에 함수 코드를 넣어서 일반 함수를 사용할 때보다 더 빠르게 작동할 수 있게 하는 것이다. 따라서 C++에서는 [ #define ]을 통한 매크로함수는 사용하지 않는 편이라고 한다.



7. 표준 출력 함수

printf

>>Print format의 약자로 규격화된 문자열을 출력할 때 사용한다. <stdio.h>에 선언되어있다.


서식지정자

 서식 지정자

 %d

 %f

 %c

 %s

 ...

 치환 대상

 정수

 실수

 문자

 문자열

 ...

위 표에서 표시한 것보다 더 많으니 참고


언어가 담당해야할 출력을 운영체제에 맡기게 되면서 C언어의 콘솔 출력 함수에서 살아남은 것들은 putchar, putc, puts정도밖에 없다고 한다.


printf에 대한 내용은 다음 강의 정리에서 이어진다.



Etc. 기타

표준 자료형과 비표준 자료형

Visual Studio에서는 표준자료형 외에도 비표준 자료형을 지원한다.

    

 표준자료형

 비표준 자료형

크기 

char 

__int8 

1 Byte 

short 

__int16 

2 Byte 

int, long 

__int32 

4 Byte 

long long 

__int64

8 Byte 

__int128 

16 Byte 


표와 같이 VS에서 지원하는 비표준 자료형은 접두사로 [ _ ]가 두 개 붙어있다. [ _ ]가 많이 붙어있을 수록 표준에서 멀어진 비표준이라는 뜻으로 생각하기 때문에 네이밍을 할 때 주의해야한다.

표준이 아니라고 너무 사용하지 않을 필요는 없다. 환경이 변하지 않는다는 전제 하에 의미를 더 명확히 부여할 수 있다.

__int[ n ]에서 n은 해당 자료형이 가지는 비트의 총 개수를 의미한다. 자세한 내용은 다음[각주:11] 참고


라이브러리(Library) 파일의 사용 이유

오브젝트 파일이나 라이브러리 파일이나 실제 코드를 볼 수 없는 것은 같지만 오브젝트 파일의 경우에는 오브젝트 파일에 있는 모든 함수가 컴파일시에 포함된다. 그러나 라이브러리 파일을 사용하게 되면, 해당 프로젝트에서 사용한 함수만 컴파일 결과에 포함되기때문에 결과물의 용량을 감소시킬 수 있다.

  1. 65 [본문으로]
  2. 암시적 형변환은 컴파일러가 자동으로 변환하는 형변환이다. 예를 들면 복수 데이터 형태가 사용될 때 상위 데이터 형태로 자동 변환된다. 출처 - 위키백과 [본문으로]
  3. 계산이 두 번에 걸쳐 이뤄진다는 것을 보이기 위해 temp라는 변수를 추가했을 뿐이지, 실제로 temp 변수는 추가되지 않는다. [본문으로]
  4. 숫자 앞에 '0'을 넣음으로써 해당 수가 8진수 표기로 작성되었음을 알린다. [본문으로]
  5. 10부터 15까지의 수는 한자리에 표기하기 위해 10부터 차례로 A - F로 변환한 후 표기한다. 16진수 표기임을 알리기 위해 변환된 값 앞에 [ 0x ]를 표기한다. [본문으로]
  6. C++14에서 추가되었으며, C언어 표준이 아니다. 따라서 2진수 표기는 C++ 문법이라고 봐야한다. 사용법은 10진법 표기를 2진법 표기로 고친 후, 2진법 표기 앞에 [ 0b ]를 추가하는 방식으로 사용한다. 참고로만 알아둘 것. [본문으로]
  7. '키워드'라고도 한다. [본문으로]
  8. 일반적으로 함수의 원형으로 함수의 기능을 파악하는 경우가 많기 때문이다. [본문으로]
  9. 개발자가 개별적으로 생성한 파일. 프로젝트에서 직접 작성한 파일이나, 혹은 서드파티에서 작성한 파일을 추가하는데 사용한다. [본문으로]
  10. 즉, 치환되는 부분에서 연산자 우선순위에 따라 원하는 값이 나올수도 안나올 수도 있다는 뜻이다. [본문으로]
  11. 사이트 내의 wchar_t은 short를 typedef로 이름을 바꾼 것이지만, __wchar_t는 아예 새로운 비표준 자료형이다. [본문으로]
728x90
반응형

'외부활동 > TIPS 19th' 카테고리의 다른 글

[TIPS 19TH] 06 : 2018.07.13. (목)  (2) 2018.07.13
[TIPS 19TH] 05 : 2018.07.09. (월)  (2) 2018.07.10
[TIPS 19TH] 04 : 2018.07.05. (목)  (2) 2018.07.06
[TIPS 19TH] 03 : 2018.07.02. (월)  (0) 2018.07.03
[TIPS 19TH] 01 : 2018.06.25. (월)  (2) 2018.06.26
Comments