본문 바로가기
[ CODING STUDY ]/》C언어 공부

C언어 3장(Hello World)

by MRG 2020. 4. 6.
728x90
반응형

이제 코딩을 진행해보도록 하겠습니다. 하기 전에 먼저 환경설정을 하겠습니다.

 

▣ 우선 한 가지 예를 들어보겠습니다.  문자들을 구분해보세요.
어떤 게 i이고 어떤 게 L인지 어떤 게 숫자 0이고 어떤 게 영어 O인지 구분하기 어렵죠?
저렇게 그대로 글꼴을 기본 상태에 글꼴로 하고 코딩을 하게 되면 우리가 나중에 코딩을 하고 나서 다시 코딩을 읽을 때 헷갈릴 수 있습니다. 그래서 먼저 코딩을 하기 전에 글꼴을 바꿔줘야 합니다. 

도구에서 옵션을 누르면

 

▣ 이런 창이 나오는데 여기서 환경에서 글꼴 및 색에서 글꼴을 Consolas를 변경해주세요.

 

그럼 이렇게 구분하기 쉽게 글꼴이 바뀌었습니다. 꼭 변경하시고 코딩을 시작해주세요.
그럼 코딩을 시작해보겠습니다. 우선 이렇게 입력해주세요.

▣ 꼭 글자 오타랑 기호 신경 써서 제대로 입력을 해주셔야 합니다. 그런 다음에  

 

빌드에서 프로젝트를 빌드합니다. 그럼 

 

이렇게 틀린 부분이 없다면, 성공이라고 나옵니다. 그리고 저 위치에 exe파일을 생성한 걸 볼 수 있습니다. 직접 확인해보겠습니다. 저번 시간에 한 것처럼 솔루션에서 오른쪽 마우스를 눌러 탐색기에서 프로젝트 이름에 Debug파일로 들어가면 이렇게 3개에 파일이 생겼습니다.

 

 그리고 실행을 해보겠습니다. 그럼 어떻게 되나요? 실행을 하게 되면 바로 콘솔 창이 꺼지는 걸 볼 수 있습니다. 그건 쉽게 생각하면 exe파일을 실행하고 바로 프로그램이 끝났기 때문입니다. 이건 코딩 부분을 공부하면서 더 깊이 있게 공부하게 될 겁니다.
쉽게 이야기해서 실행을 하면 저 결과를 보여주고 기다려라고 명령을 주지 않았기 때문에 그냥 프로그램이 꺼져 버리는 것입니다. 이렇게 이해하시고 넘어가면 될꺼같습니다.



자 여기까지 읽으면서 많은 궁금한 질문들이 생겼다고 생각합니다. 한번 하나씩 보도록 하겠습니다. 우선 빌드부터 가보겠습니다.
빌드는 영어 단어 뜻처럼 짓다. 만들다. 쌓다 등이 있습니다.
그것처럼 소스코드(명령서, 설계도)를 번역하고 그걸 완성(exe)해주는 과정을 이야기합니다. 



▣ 빌드를 하게 되면 쉽게 이런 과정으로 진행됩니다. 

 

그림판으로 그린 거라 좀 부족합니다. 이해해주시면 감사하겠습니다. ^^;;



컴파일은 우리가 아는 컴파일러입니다. 우리에 말을 기계어로 번역해주고 obj파일로 만듭니다. 그런 다음 설계도(명령서)로 만든 obj로 링크(링커)가 실행파일(exe)로 만들어줍니다. 이 모든 과정이 빌드라고 하는 겁니다. 세부적으로 들어가면 다른 이야기들도 있지만 이 정도로 이해를 해주셔도 될꺼같습니다. 



▣ 여기서 한 가지 에러에 관해서 이야기를 해보려 합니다.
에러는 프로그램에 무언가 문제가 있어서 제대로 작동하지 않는 걸 의미합니다. 여기서 간단하게 언급하고 싶은 게 있는데 바로 컴파일 에러와 런타임 에러에 대해 말씀드리겠습니다.
컴파일 에러는 컴파일하는 과정에서 그러니깐 우리가 작성한 설계도(명령서)를 보고 컴퓨터가 잘못된 부분을 찾아 에러를 말해줍니다. 이걸 컴파일 에러라고 합니다. 
런타임 에러도 감이 오시죠? 쉽게 이야기하면 링크 과정까지 진행하고 프로그램을 실행했을 때 나오는 에러를 런타임 에러라고 합니다.  
자 그럼 이렇게 생각 봅시다.

컴파일 에러는 우리가 우리가 작성한 소스코드(명령서, 설계도)를 다시 보고 고쳐서 컴파일을 하면 아무 문제가 없습니다. 하지만 만약 런타임 에러가 나면 어떻게 될까요? 이미 게임을 출시하거나 앱을 팔았을 경우라면 정말 큰일이겠죠? 그러니 제가 중간중간 이야기하는 이런 팁들은 꼭 기억해주시고 읽는 훈련!! 을 꼭 하시면서 코딩을 진행하면 좋을 거 같습니다.



▣ 자 그럼 다시 비주얼 스튜디오로 넘어가겠습니다. 그렇다고 한다면 매번 빌드를 하고 exe파일을 찾아 매번 이렇게 실행해서 확인을 해야 할까요? 아닙니다. 잘 생각해보면 결국 이런 비주얼 스튜디오 같은 프로그램을 만든 건 프로그램 개발을 하기 쉽게 하기 위해서입니다. 그렇기 때문에 우리가 바로바로 테스트를 할 수 있게 하는 방법이 있습니다. 그건 


디버그 메뉴에서 디버그 하지 않고 시작을 누르거나 Ctrl + F5키를 누르거나 디버깅 시작을 하면 됩니다 그럼 자동으로 디버그 과정을 진행해주고 윈도 콘솔 창에 우리가 적은 설계도에 완성품에 실행한 결과를 보여주게 됩니다. 



▣ 그럼 디버그가 멀까요?
위키 백과에서는 디버깅(영어: debugging) 또는 디버그(영어: debug)는 컴퓨터 프로그램이나 시스템의 정확성 또는 논리적인 오류나 결함(버그)을버그 검출하여 제거하는 과정을 뜻한다. 일반적으로 디버깅을 하는 방법으로 테스트 상의 체크, 기계를 사용하는 테스트, 실제 데이터를 사용해 테스트하는 법이 있다. [1][1]
이렇게 사전적 의미가 나옵니다. 쉽게 이야기하면 오류나 버그를 검출하여 제거하는 과정을 의미합니다. 



그럼 여기서 디버깅 시작이랑 디버그 하지 않고 시작이 왜 구분이 되어 있는지 이야기해보겠습니다. 
쉽게 생각하면 디버그 하지 않고 시작은 말 그대로 디버그 과정을 하지 않고 실행 파일을 그대로 실행하게 됩니다.
그래서 디버그 과정을 하지 않기 때문에 디버그에 관련된 기능을 사용하지 않아 메모리에도 그게 영향을 주지 않습니다. 그렇기 때문에 우리는 빠르게 그 프로그램을 실행하고 확인할 수 있습니다.
디버깅 시작은 말 그대로 오류나 버그를 검출하기 위해 다른 기능들을 사용하겠죠? 그럼 실행 속도 느려지고 메모리도 더 차지하게 될 겁니다. 그렇기 때문에 저렇게 간단한 코딩은 디버그 하지 않고 시작하는 하는 게 좋습니다. 
이 정도까지 알아두시고 우선 넘어가도록 하겠습니다.



그럼 실행해보겠습니다.

▣ 결과 콘솔 창이 잘 나올 겁니다.
여기서 한 가지 질문이 생길 수 있습니다. 아까도 솔루션탐색기에서 직접 실행을 했을 때랑 똑같이 exe파일로 실행을 한 결과인데 이건 왜 결과 안 꺼지는 거지?라는 질문을 할 수 있습니다.
그건 디버그 하지 않고 실행했을 때 콘솔 창에 system("pause")을 진행하기 때문입니다. 쉽게 이야기해서 시스템을 멈춰라는 뜻입니다. 결과를 보여주고 저 코딩으로 인해서 멈춘 것입니다. 저건 window.h를 공부할 때 더 자세하게 이야기하겠습니다. 



▣그런데 저렇게 콘솔 창이 안 나오는 경우도 있습니다. 아까처럼 바로 프로그램이 끝나고 꺼져버리는 현상이 나타날 수 도 있습니다. 그건 콘솔 창으로 열어라라는 프로젝트 설정이 안 돼있어서 그렇습니다. 그건 이렇게 하면 됩니다.



디버그에서 프로젝트 속성에서 링커 설정에 시스템에서 하위 시스템을 콘솔로 하면 됩니다. 링커 들어봤죠? 바로 obj파일을 링커가 exe파일로 완성해서 그걸 윈도 콘솔 창으로 실행해라는 설정이랑 같다고 생각하시면 좋을 거 같습니다. 자 이렇게 하면 빌드하는 것 그리고 디버그 하는 것까지 진행해봤습니다.
저 과정은 더 깊이 들어가면 할 수 있는 이야기가 많지만 저 정도까지만 알아도 지금 코딩하는데 무리가 없다고 생각합니다. 



▣ 그럼 코딩을 보도록 하겠습니다.  코딩에 대한 부분은 우선 간단하게 설명하고 매장마다 더 디테일하게 설명하며 진행하도록 하겠습니다. 



자 먼저 #include = #이건 전처리기라는 기호입니다. 쉽게 이야기하면 컴파일 전에 진행하는 명령어라고 생각하면 될꺼같습니다. include는 포함하다는 의미로 컴파일하기 전에 포함해라라는 뜻입니다.
그럼 <stdio.h>는 h 어디서 많이 본거 같죠? 네 바로 헤더 파일입니다. 



위키백과에서 stdio.h은 Standard Input/Output library (표준 입출력 라이브러리)의 약어로써, C 언어의 표준 라이브러리 함수의 매크로 정의, 상수, 여러 형의 입출력 함수가 포함된 헤더 파일이다.



쉽게 이야기해서 #컴파일하기 전에 include 포함해라 <stdio.h> 여기 헤더 파일을 선언을 한 겁니다. 

헤더 파일 안에 들어가 보면 

 


이렇게 엄청 많은 코딩들이 들어 있습니다. 2472줄 정도 코딩이 되어있네요. 이걸 절대로 수정하시면 안 됩니다. 이건 그냥 한번 보시라고 말씀드린 겁니다. 혹시 이걸 잘못 건드려서 코딩을 바꾸게 되면 다시 stdio.h파일을 구글에서 찾아서 넣으시면 됩니다.



▣ 여기까지는 이해가 되셨죠? 그럼 입력과 출력이 무엇일까요? 입력을 말 그대로 입력하는 겁니다. 우리가 키보드랑 마우스를 클릭하는 거 등 우리가 컴퓨터한테 주는 신호를 의미하고 출력은 우리 눈에 보이게 하는 결과들을 출력이라고 생각하면 좀 쉬울 거 같습니다.
그럼 선언이라는 말도 했는데, 선언은 단어 의미로는 널리 퍼지게 이야기하다 머 이런 의미가 있는데 말 그대로 이 소스코드에 포함되어있어 라고 컴퓨터한테 이야기한다고 생각하면 좋을 거 같습니다. 



▣ int main(void) - 이건 함수를 의미하는데 int는 자료형입니다.  함수 앞부분에 있는 자료형은 정수형식을 반환하기 위해 지정한 것입니다. 아직은 함수를 안 배웠기 때문에 이 정도까지만 생각해 주시면 좋을 거 같습니다.



▣ main은 함수 이름입니다. (void) 함수에는 이런 괄호가 있는데 이건 받을 매개변수값을 의미하고 void - 없다라는 의미입니다.
그리고 { } 이건 스코프라고 합니다. 함수에 시작과 끝을 의미합니다. 그러니깐 main() 함수 안에 {    } 여기 안에 있는 것들이 블록 포함된 거라고 생각하시면 될꺼같습니다. 
여기서 중요한 건 main() 함수는 이 소스코드에 시작과 끝을 나타냅니다. 그러니깐 exe로 만들어서 시작을 main()로 시작이 되고 이 안에 명령한 것들을 다 수행하면 프로그램이 끝나게 됩니다. 
그래서 main함수는 프로젝트에 꼭 한 개만 선언이 되어 있어야 하고 꼭 한 개는 있어야 합니다. 



▣ 또 중요한 개념으로 프로그램은 무조건 순서대로 작동합니다. goto문도 있기는 하지만 그건 잊어버리시고 순서대로 순차적으로 우리 인간이 위에부터 글을 읽듯이 컴퓨터도 위에서부터 순차적으로 우리에 소스코드(명령서, 설계도)를 읽어 번역하고 처리합니다. 그 점 꼭 꼭 기억해주시면 좋을 거 같습니다.



▣ 또 하나 프로그램에 속도는 우리가 생각하는 거 이상으로 빠릅니다. 그렇기 때문에 우리 인간처럼 하나하나 천천히 읽는 게 아니라 거의 0초에 속도로 읽어 나아갑니다. 저 속도는 예입니다. 저걸 측정하는 방법은 따로 있다고 알고 있습니다. 궁금하신 분은 인터넷을 참고해주시면 감사하겠습니다. 어쨌든 꼭 프로그램에 속도는 빠르다는 거 기억해주세요 



다시 해석을 해보면



#include <stdio.h> - 포함하고 
int main(void) - main함수 시작(매개변수 없음)
{
▣ printf("Hello World\n");  - 눈치가 빠르 신분들도 있겠지만 이름 옆에 () 괄호가 있으면 함수를 의미합니다.
그럼 이 함수 printf는 print 출력해라 f - formatted(형식, 서식)을 의미합니다. 그래서 괄호 안에 있는 형식을 출력해라는 의미가 됩니다. (이정도까지만 알아두시고 더 자세한건 표준입출력을 집중적으로 다룰때 이야기하도록 하겠습니다.)
"" = 문자열을 의미합니다. \n는 = new line한 줄 뛰어라라는 이스케이프에 개념이 있는데 이것도 나중에 천천히 알아가도록 하겠습니다. 
다시 정리해서 형식을 출력해라  "" 안에 있는 문자를  한 줄 뛰어서 이렇게 생각하면 될꺼같습니다.


return 0;



▣ 두 가지 의미가 있다고 보시면 될 거 같습니다.
첫 번째로 return 은 함수의 어떤 곳에서도 위치할 수 있는데, return 이 실행되면 그 함수는 실행이 종료됩니다. 그렇기 때문에 0을 붙이는 건 함수 실행이 성공되었음을 알리기 위해서 붙이는 거고 실패는 1로 지정해주기도 합니다.



두 번째로 return은 현재 함수가 끝나면 호출했던 곳으로 값을 반환해라라는 의미입니다. 그래서 보았던 int 형으로 반환하게 되는 겁니다. 그런데 우린 반환할 곳이 없기 때문에 위에서처럼 그냥 실행이 잘됐다는 표시로 0을 반환했습니다.   
}

결과를 다시 보면

 


이렇게 "Hello World" 안에 있는 값이 출력이 되었습니다. 
자 그리고 ; 세미콜론입니다. 이건 구문에 끝을 나타냅니다. 구문은 한 줄을 이야기하고 이게 없으면 한 줄이 끝나는지 컴퓨터가 알 수 없기 때문에 오류가 발생합니다. 구문에 코딩이 끝나고 꼭 ; 세미콜론을 붙여줘야 합니다. 
컴퓨터는 스스로 아무것도 할 수 없고 오직 우리가 준 소스코드(명령서, 설계도)로 작동하기 때문입니다.



▣ 여기까지 이해가 되셨나요? 함수, 반환, 이런 건 함수를 공부할 때 자세하게 배우도록 하겠습니다. 지금은 이 정도까지만 공부하시면 될 거 같습니다. 천천히 읽어 나아가시면 제가 이야기했던 부분이 이해가 될 겁니다. 다음 시간부터는 주석을 함께 달아서 더 효과적으로 공부할 수 있는 방법도 배워보겠습니다. 



▣ 오늘 정말 많은 내용을 했습니다. 복잡할 수도 있는 내용이지만 그 구조를 저렇게 나마 알고 가셔야 나중에 프로그램을 만들 때 많은 도움이 될 겁니다. 그리고 지금까지 제대로 꼼꼼하게 읽어 오셨다면 제가 왜 읽는 게 중요하다고 하는지 조금은 이해하실 거라 생각합니다.
다음 장에는 자료형과 변수를 진행해 보겠습니다. 항상 말씀드리지만 저에 블로그가 정답과 진리가 아닙니다. 그렇다고 틀린 것도 아니지만 더 좋은 강사님들과 선생님들에 더 쉬운 설명과 좋은 자료들이 많이 있습니다. 그걸 같이 공부하면서 제 블로그도 활용하시면 정말 빠르고 정확하게 실력이 늘어날 거라 생각합니다. 명심해주세요. 





▣ 포기하지 마세요!!! 저도 했습니다 했습니다.!!! 그럼 다음장에서 뵙겠습니다.

728x90
반응형

댓글