대체로 컴퓨터 언어에 대한 강좌라고 하면 이론적인 부분을 먼저 설명하고 그것을 활용한 예시 코드를 보여주게 마련입니다. 물론 종이 교재도 마찬가지구요.
하지만 좀 다른 접근으로 먼저 코드를 보고 나서 그 설명을 읽게 하고 싶었습니다. 개인적 경험으로는 이런 방법이 더 이해하기 쉬웠기 때문입니다.
하지만 설명해야 할 부분 중에서도 기초적인 부분은 먼저 설명해야 코드를 볼때 짐작이라도 가능한 부분이 있으니 이 점 참고해서 너무 난해하다면 아래쪽을 먼저 읽어보길 권합니다.
1장 Hello World!
모든 프로그래밍 언어는 Hello World!로 시작합니다.
단순히 프로그램 실행 결과에 Hello World를 출력하는 프로그램이죠.
#include <stdio.h>
int main(void)
{
printf("Hello World!");
return 0;
}
첫 장이기도 하고, 원래 Hello World는 이론 보다는 '실행해보기'에 의미가 있기 때문에 구조만 확인하면 됩니다.
이렇게 끝내기엔 글이 너무 짧아 참고할 만한 내용을 적어봤습니다.
주석(comment)
영어로는 comment. 주석을 사용하면 Compiler는 해당 문장을 인식하지 않습니다.
언어마다 다르지만 보통은 두 가지 형식을 사용합니다.
C, JAVA 등의 계열은 // comment
으로 한 줄을 주석처리하고, /* comment */
로 여러 줄을 주석처리 할 수 있습니다.
HTML이나 CSS등의 언어는 <!-- comment -->
로 주석처리 할 수 있습니다.
터미널 셸에서는 # comment
php에서는 ; comment
로 주석처리 할 수 있습니다.
#include
#include
를 통해서 다른 코드를 참조할 수 있습니다. 위의 파일만으로는 'Hello World'를 출력할 수 없습니다. 컴퓨터는 printf
가 뭔지 모르기 때문이죠. 하지만 #include
를 통해 stdio.h
파일을 참조하도록 하면 'Hello World'를 출력할 수 있습니다
개발자가 stdio.h
파일을 만들지 않았지만, C언어를 위한 IDE(컴파일러만 따로 설치해도 됨)를 설치하면서 함께 제공됩니다. < >
안에 있는 파일(소스)은 컴파일러가 지정한 디렉터리에서 찾습니다. 그리고 이 디렉터리에는 stdio.h
뿐 아니라 여러가지 미리 정의된 파일들이 있습니다. 그렇기 때문에 개발자는 stdio.h
파일의 위치를 몰라도 사용할 수 있습니다.
그렇다면 개발자가 미리 정의한 파일들은 어떻게 불러와야 할까요?
그럴 때는 꺾쇠 괄호 대신 쌍따옴표를 사용합니다. #include "mycode.h"
처럼 사용하면 됩니다.
그러면 컴파일러는 원래 파일과 같은 디렉터리에서 mycode.h
파일을 찾아 참조합니다.
가장 메인이 되는 파일이 너무 복잡하다면 다른 소스에 코드를 작성하고 불러오기만 하면 되죠.
stdio는 STandarD Input/Output의 뜻을 가지고 있습니다.
아래에 사용하는 printf
도 stdio.h
를 참조했기 때문에 사용할 수 있는 것입니다.
int main(void)
int
는 return(반환) Type(형식)을 말합니다. 이런 종류는 void
, int
, char
, long
, string
등이 있는데, 이를 자료형 이라고 합니다. C언어에서는 배우지 않지만 추후 객체지향(Object Oriented) 언어를 사용하면 무엇이든 반환할 수 있게 됩니다!.
C언어는 객체(Object)라는 개념이 없습니다. 비슷한 개념으로 구조체(Structure)가 있는데, C언어는 구조체 자체를 반환할 수는 없고, 포인터(Pointer)를 이용하는 방법이 있습니다. 함수(Function) 안에서 사용했던 구조체의 주소를 저장하는 포인터를 반환하면, 반환을 받은 함수에서 사용할 수 있습니다.
main
은 함수 이름입니다. C언어는 처음 실행할 때 무조건 main
함수가 실행됩니다. 이름은 숫자로 시작할 수 없습니다.main
함수는 int
를 반환하도록 하는 것이 좋습니다. 윈도용 C컴파일러의 경우 void main{}
을 허용하지만, 리눅스나 유닉스 계열에서는 반드시 int
형을 반환해야 합니다.
(void)
는 함수에 전달하는 인자(Parameter, Argument)를 정합니다. 파라미터가 있을 경우, myfunction(int i, char s)
와 같이 변수의 형식과 변수의 이름을 지정하여 전달합니다. 변수가 여러 개이면 반점(,)으로 구분하여 추가할 수 있습니다. void 대신 빈 칸이어도 됩니다.
여기서 인자로 전달되는 변수는 지역변수(Local Variable)입니다. 이 함수 안에서만 사용되는 변수라는 뜻입니다. 함수 밖에서는 영향을 주지 않는다는 의미로, 다른 함수에서 파라미터로 전달하는 변수가 논리적으로는 같은 변수라 하더라도 이름이 달라도 됩니다.
아래 예시를 봅시다.
void print(int id); //main함수에서 print함수를 사용하기 전에 print함수가 존재한다는 것을 미리 선언.
void main(){
int name = 15; //name 변수가 15를 갖고 있다.
print(name); //print를 호출하면서 name이 갖고 있는 15를 전달한다.
}
void print(int id){ //15를 받아서 지역변수 id로 저장한다.
printf("%d",id); //15를 출력한다.
}
{}
앞으로 가장 자주 사용할 것이고, 제일 신경써야 하는 부분입니다.
코드를 한 묶음으로 정해주는 역할입니다. 중괄호 사이의 세 줄은 int main(void) 함수에 포함된 코드라는 의미입니다.
여러 줄을 포함하기 때문에 중괄호가 열리는지, 닫히는지 파악하기 어렵습니다.
혹시나 다른 위치에서 중괄호를 닫으면 정상적으로 실행은 되지만 개발자가 원하던 출력이 나오지 않을 수도 있습니다.
void main(){
int i =1, j = 1;
if(i == 1){ // i 가 1이라면 수행한다.
if(j == 2){ // j가 2이라면 수행한다.
//지금은 if문이 충족되지 않으므로 이 부분은 무시한다.
}
printf("j=2");
}
}
이런 코드를 봅시다. 이런 코드는 분명 정상적으로 작동할겁니다.
하지만 printf("j=2");
는 if(j == 2)
구문 밖에 있습니다. 원래는 j가 2인지 확인하고 j=2
를 출력했어야 합니다. 하지만 그것과 상관 없이 j=2
를 출력하게 됩니다.
printf("Hello World!");
stdio.h
에 포함된 함수인 printf
로 'Hello World!'를 출력하는 함수입니다.printf()
함수에 'Hello World!'를 파라미터로 전달했고, printf
함수가 실행되면서 인자를 출력하게 됩니다.
큰 따옴표를 사용하면 그 안의 내용은 char
형 배열(array)을 의미합니다. 객체지향 언어에서는 char형 배열을 String
이란 객체로 구현해뒀습니다. 나중에 객체지향 언어를 학습할 때 char
배열과 String
에 어떤 차이가 있는지 확인해보면 객체지향을 이해하는데 조금이나마 도움이 될 겁니다.
;
;(세미콜론)은 명령 한 줄이 끝남을 의미합니다.
C언어를 포함하여 세미콜론으로 명령을 구분하는 언어들은 컴파일러가 줄 내림을 인식하지 않습니다. 띄어쓰기도 한칸만 인식합니다.
#include <stdio.h>
int main(void){printf("Hello World!");return 0;}
그렇기 때문에 위와 같이 코드를 작성해도 결과는 같습니다. 다만, 주석이 있는 부분은 컴파일러가 무시하기 때문에 반드시 줄 내림을 해야 합니다.
return 0;
함수 실행 결과를 리턴하고 함수를 종료합니다. return
을 하고 나면 그 함수는 완전히 종료됩니다. 그러므로 return
이후의 명령은 모두 무시됩니다.
리턴값이 없는 void
형식의 함수라도 return ;
를 하면 함수가 종료됩니다.if
문으로 분기하면서 함수를 종료할 필요가 있다면 return으로 종료할 수 있습니다.
리턴 값은 처음 함수를 선언할 때 지정했던 형으로만 반환할 수 있습니다. 함수를 int
로 선언했기 때문에 int
형 값(value)인 0
을 반환했습니다.
다 섞어서 응용하기
#include <stdio.h>
void main(){ //1+1 계산하기!
int sum = calc(1,1);
printf(%d, sum);
//return;
}
int calc(int i, int j){
return i+j;
}
이제 이 정도는 이해할 수 있겠죠? 갑자기 진도를 너무 많이 나갔나요?ㅎ...
main 함수가 실행이 되고, //1+1 계산하기!
는 무시됩니다.int
형 변수인 sum
을 선언합니다. sum
은 calc
함수를 실행한 결과를 저장합니다.calc
함수는 파라미터로 1
두개를 받습니다. 큰 따옴표가 없기 때문에 int
형입니다. String
은 큰 따옴표로 구분하지만, int
형을 지정하는 표시는 없기 때문에 변수 이름은 숫자로 시작할 수 없습니다.calc
함수는 두 숫자를 i
, j
라는 이름으로 전달받습니다. 그리고 두 변수 i
와 j
를 더한 값을 return
을 통해 반환합니다.
결과적으로 sum
은 1+1을 연산한 값이 저장됩니다. printf
는 digit형식의 문자를 출력합니다. sum
이 그 digit형식에 해당하는 변수입니다.main
함수는 반환 형식이 void
이기 때문에 return
문이 없어도 종료됩니다. 아무것도 반환하지 않는 return;
로도 함수를 종료할 수 있습니다.
요약
- Hello World를 출력할 수 있다.
include 로 다른 코드를 참조할 수 있다.
- // 또는 / /로 주석을 작성할 수 있다.
- {}로 코드를 묶을 수 있다.
- return 을 사용할 수 있다. 함수를 선언할 때 반환되는 종류를 지정해야 한다.
- 함수를 호출할 수 있다. 호출 할 때 소괄호로 파라미터를 전달할 수 있다.