첫 대면..main 함수

C/C++를 코딩하게 되면 제일 먼저 만나게 되는 main() 함수를 살펴 볼까요?
이제 막 시작하는 것이기 때문에, 너무 깊이 들어가지는 않고 아주 간단히 알아 볼게요.



강의들은 모두 무료입니다. 단, 저작권은 키클 코딩랩 에 있으며, 무단 복제 및 배포를 엄금합니다.
이를 어길 시, 본 사이트의 서버가 미국에 있으므로, 미국법에 의해 처벌될 수도 있습니다.




새로운 파일 생성하기

시작하기 전에 한가지 당부드릴게요.
Python과 달리 C/C++는 보다 정교한 코딩이 가능하다고 했지요? 코딩하는 사람에 의한 정교한 코딩이 가능하다는 것을 달리 말하면, 코딩을 할때 기본적인 것부터 세밀하게 우리가 신경써야할 부분이 더욱 많다는 것이랍니다. Python은 우리가 코딩을 하면 내부적으로 알아서 처리해주는 부분이 많이 있는 반면, C/C++는 그 내부적으로 처리되는 부분을 프로그래머가 모두 직접 코딩을 해주어야 하는 것이지요.
그래서, Python 강의에서와는 다르게, 더 많은 문법을 설명하고 알아가는 방향으로 공부를 할 수 밖에 없답니다.
하지만, 최대한 쉽게 세세한 부분까지 설명할테니 걱정말고 따라오세요~!

먼저, 원하는 곳에 폴더를 생성하세요. 폴더를 생성하는 방법은 두 가지가 있어요.
강의 C/C++ 시작~!에서 언급했던 노틸러스 파일 브라우져를 연 후, 원하는 경로 (예를 들면, 아래 그림과 같이 노틸러스의 왼쪽 상단에 Home을 클릭 후 Documents 폴더 더블클릭)로 더블클릭해서 들어가 보세요.

그리고 아래 그림과 같이, 빈 공간에서 마우스 오르쪽 버튼을 누르면 나오는 팝업메뉴에서 "New Folder"를 클릭하면 폴더를 생성할 수 있어요.

폴더를 생성하는 두번째 방법은 다음과 같아요.
위에서 한 것과 같이, 노틸러스에서 마우스 오른쪽 버튼을 누르면 나오는 팝업메뉴에서 "Open in Terminal"를 클릭하세요. 그러면, 강의 C/C++ 시작~!에서 언급했던 터미널이 열릴 거예요. 그리고 터미널 명령어 mkdir을 이용해서 아래와 같이 폴더를 만들 수 있어요. (저는 my_folder라는 이름의 폴더를 만들었어요.)

gildong...$ mkdir my_folder

주의할 점 한가지. 위에서 "gildong...$"은 터미널의 입력하는 커서 앞에 나오는 사용자@컴퓨터이름:현위치경로$ (예: gildong@gildong-VirtualBox:~$) 부분을 의미하는 거예요. 고로, 이 부분은 명령어가 아니니 타이핑 하지 마세요.
터미널 명령어 mkdir에 대해 잠시 살펴 볼까요?

[터미널 명령어]

한가지 주목해 주세요. 위 터미널 명령어 설명에서 "$"는 터미널에서 명령어를 입력할 수 있는 커서 앞부분을 의미한다는 것을. 즉, 터미널에 보이는, "gildong...$"에서 "$"를 의미하는 거랍니다.
그리고, 위 설명은 Linux 메뉴의 터미널 명령어 하위 메뉴에서도 볼 수 있어요.

이제 터미널에서 우리가 새로 만든 폴더로 들어가 볼까요? 아래처럼 "cd 폴더명"을 이용하면 생성된 폴더로 들어갈 수 있어요.

gildong...$ cd my_folder

다음의 터미널 명령어 노트로 "cd" 명령어랑 조금 더 친해져봐요.

[터미널 명령어]

자, 이제 C/C++ 코드를 작성할 파일을 하나 만들어 보지요.
터미널에서 아래와 같이 입력하면, C 파일이 만들어 진답니다.

.../my_folder$ gedit lec1_main.c

이것이 무슨 의미이냐..?
바로, gedit이라는 문서편집기를 이용해서 lec1_main.c 파일을 만들겠다는 의미랍니다.
주목해야 할 점은, 파일이름 "lec1_main" 뒤의 "." 뒤에 붙는 확장자명이 "c"라는 것이예요. 만약, CPP 파일을 만들고 싶다면, "lec1_main.cpp"와 같이 확장자명을 "cpp"로 해야 한답니다. 한편, 위와 같이 우리가 코드를 작성하는 파일들을 소스(Source) 파일이라고 부른답니다.

위에서 처럼 실행하면, gedit 문서편집기 창이 새로 뜨지요? 여기에서 C 코딩을 할 거랍니다.
궁금한 점이 하나 있을 거예요. C와 C++의 차이점이 무엇인지.
이 부분에 대해서는 추후 기회가 될 때 설명할테니 기다려 주세요.

자, 위에서 gedit을 이용해서 열었던 lec1_main.c 파일을 저장해 볼게요. 아직 코딩을 한 것이 없으니 그저 빈 파일이겠죠?
아래에 보이는 것처럼, gedit 문서편집기를 보고 있는 상태에서 노란색 화살표가 가리키는 지역으로 마우스 커서를 옮기면, File메뉴를 볼 수 있어요.
File메뉴를 클릭하면 나오는 하위메뉴 중 Save를 누르면 저장이 된답니다.
그리고, 아래 노란네모가 가리키는 지점에 있는 "x"를 눌러서 gedit을 닫으세요.




컴파일 (Compile) 하기

이제, 생성한 lec1_main.c 파일을 컴파일 할 건데요. Ubuntu에 이미 설치되어 있는 gcc 컴파일러를 이용할 것이랍니다.
터미널에서 아래 줄1과 같이 "gcc 파일명"의 형태로 컴파일 명령을 실행해 보세요.

.../my_folder$ gcc lec1_main.c
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
.../my_folder$

그러면, 위 줄2~줄4처럼 무언가 잘못되었다는 것을 알 수 있게 해주는 에러 메세지들이 나오지요?
줄3을 보면 그 이유를 알 수 있는데요. 바로 main 함수가 없다는 의미랍니다.

이 에러 메세지는 cpp파일을 만들어도 똑같이 출력된답니다.
아래처럼 파일명 다음 "." 뒤에 붙는 확장자(extension)를 "cpp"로 하여 "lec1_main.cpp" 파일을 만들고 저장해 보세요.

.../my_folder$ gedit lec1_main.cpp

그리고, 터미널에서 아래처럼 "gcc lec1_main.cpp"를 실행하여 컴파일하면, 똑같이 main 함수을 찾을 수 없다는 에러 메세지가 출력된답니다.

.../my_folder$ gcc lec1_main.cpp
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
.../my_folder$



반드시 있어야 하는 main 함수

위에서 보았듯이, main 함수를 찾을 수 없다는 에러 메세지가 출력된다는 것은, C 언어로 코딩을 하든 C++ 언어로 코딩을 하든, 해당 파일은 반드시 main 함수를 기본적으로 갖고 있어야 한다는 것이지요.

그렇다면, 그 main 함수라고 불리는 것을 코딩해 보고, 컴파일해 봤을 때 어떤 일이 생기는지 한 번 볼까요?
위에서 했던 것처럼, gedit을 이용하여, "lec1_main.c"이나 "lec1_main.cpp" 둘 중 한 파일을 열어보세요. 저는 "lec1_main.c"를 열게요. 그리고 그 안에 아래 줄1~줄2를 똑같이 코딩하고, 저장해서 gedit을 닫으세요. 아래 main 함수의 코드들이 어떤 의미를 갖는지는 나중에 설명할게요. 이번 강의에서는 main 함수가 꼭 필요하다는 것만 확인하고 넘어가는 것으로 할게요.

lec1_main.c 혹은 lec1_main.cpp
int main(int argc, char *argv[ ]) {
}

이제, 컴파일을 해 볼까요? 아래처럼 "gcc lec1_main.c"를 터미널에서 실행하면 어떻게 되나요?

.../my_folder$ gcc lec1_main.c
.../my_folder$

아무 일도 없지요? 그렇다면, 해당 파일이 main 함수를 갖고 있기 때문에 에러없이 컴파일이 잘 되었다는 뜻이랍니다. 이처럼, C/C++ 코딩을 하려면, 몇몇의 예외적인 경우를 제외하고, 반드시 main 함수를 갖고 있어야 한답니다.

강의에서 작성된 소스 코드 (source code)를 다운받으려면, 다음 링크를 클릭하세요: lec1_main.c 다운로드, lec1_main.cpp 다운로드

혹시, 이해가 잘 안되는 부분에 대한 질문이 있거나 다루어 줬으면 하는 주제가 있으면, 화면 오른쪽 하단에 "질문하기" 버튼을 이용해 주세요.






발자취

2019-09-11 "키클 코딩랩 - 미국 공학박사 아빠의 코딩 연구소"로 이름 변경
2019-06-28 코딩 교실 공개
2019-03-18 코딩 교실 제작 시작

바로가기
Python 배움터
C/C++ 배움터
About
Contact
Privacy Policy
강의목록
질문하기
처음으로