본문 바로가기
XR개발/C언어

C오답노트01_출력과 입력

by 오머리쿠_OmaryKoo 2025. 3. 19.

매주 배운 C언어 챕터들 대상으로 테스트를 하는데, 기본이지만 아는 건 확실하게 짚고 넘어가자는 의미에서 위와같은 오답노트를 정리하고자 한다. 언어를 바르게 알기 위해선, 언어만 알아서는 아니된다는 걸 이번 출력과 입력 파트에서 자각하게 됐다.

 

교수님께서 강조하신 말씀이 있으신데, 이건 두고두고 주문처럼 외어야 할 듯 싶다. 안다고 대충 흘러넘기려는 습관이 가져진 이상 그걸 고치려 노력해야 개발분야에서 에러가 나지 않을테니 말이다.

 

꼼꼼하게 보는 습관을 들여라!
아는데 틀렸다는 건 모르는 거다!

두리뭉실하게 아는 것과 확실하게 아는 거는 완전히 다르다!

 

내가 미처 제대로 파악하지 못하였거나, 이해하지 못했던 부분들을 추려서 '오답노트'라는 글로 앞으로 포스팅해서 정리하고자 한다.


//01. 모든 프로그램은 Main(x) -> main(o)이라는 함수로부터 실행이 시작되고 종료된다.

이걸 보면서 나는 두리뭉실하게 안다는 걸로 인정하게 됐다.

문제를 마주했을 땐, 코드창이 아니다보니, main 소문자라는 건 알고 있었으나 막상 Main이라는 걸 확인하는 문제에선 이거는 별개다라 생각하고 했던 게 알량했었다.

 

이 참에, int main(void)라는 함수 정의를 다시 되짚어 보려 한다.

main()함수는 C프로그램에서 가장 처음으로 실행이 되는 부분이다. 모든 C프로그램은 main()함수에서 시작한다. 따라서 모든 C프로그램에는 반드시 하나의 main()함수가 있어야 한다. int main()이나 main()도 가능하긴 하나, int main(void)로 쓰는 것이 원칙이다!

 

만약에 하나의 프로그램에 2개의 main()가 있으면 컴파일 오류가 발생함!


//02. 전처리기(Preprocessor)의 개념에 대해 아직 모름

전처리기가 소스파일에서 오브젝트 파일로 되기 이전, 즉 컴파일이 되기 전에 된다는 건 알고 있었으나, 이건 단순히 암기로 인한 이해이지, 전처리기가 코드에는 어떻게 표현되며, 무슨 역할을 한다는 완전한 이해는 전혀 없었다.

 

여기서 개념을 전반적으로 다시 짚고 넘어가고자 한다.

  • 컴파일(Compile): 프로그래밍 언어로 작성된 프로그램을 기계어로 번역하는 과정
  • 링크(link): 기계어로 번역된 프로그램을 필요한 라이브러리 등과 연결하여 실행이 가능하도록 파일을 만드는 과정
  • 전처리기(preprocessor): 컴파일 단계 이전에 거치는 프로그램으로, 주로 다른 파일을 포함하거나 소스 파일 내의 특정 문자열을 다른 문자열로 대치하는 등의 기능을 제공
  • 디버깅(debugging): 문법 오류나 실행 오류를 찾고 수정하는 작업

 

전처리기에 대한 개념을 어느정도 파악이 되었다면, 프로그램 속의 #include <stdio.h>에 관해서도 재확인이 필요하다.

 

#으로 시작하는 문장은 전처리기 지시자이다. 전처리기(preprocessor)는 본격적으로 컴파일하기 전에 사전 정지 작업을 하는 컴파일의 일부분이다. #include는 특정 파일을 현재의 위치에 포함시키라고 지시한다. 이러한 파일들은 헤더파일(header file)이라고 불리며 헤더 파일은 컴파일러가 필요로 하는 정보를 가지고 있다. 전처리기 지시자 끝에는 세미콜론을 붙이면 안 된다. 이들은 정식 문장이 아님! stdio.h라는 파일은 입출력 함수에 대한 정보를 가지고 있는 헤더파일.

stdio.h는 standard input/output header의 약자로 이 문장을 삽입하여 시스템에서 제공하는 stdio.h파일의 내용을 현재의 프로그램에 포함시킬 수 있다. stdio.h파일은 printf() 함수나 scanf() 함수에 관한 내용을 포함한다. 또한 이 문장은 전처리기에 의해 처리되며, main 함수 외부에 첫 번째 문장으로 서술해야 한다.

//03. scanf도 안보고.. 변수 간 값을 서로 change?!

나는 처음 위의 문제 코드를 맞이하였을 때, 웃겼던 건 scanf가 안 보였다는 것이다.

그당시 기억으론 변수들의 초기값이 무엇인지에 우선 초점을 두었고, 그리고 c의 변수가 선언되었음에도 불구하고, 나는 그걸 생략하고, a 그리고 b만을 이용하여 코드를 짰다는 것이다.

 

a = 2, b = 1을 scanf 밑에 변수 값을 지정하고,

a = b;

b = a;

이렇게 짰던 거 같다. 당연히 틀릴 수밖에... 

 

그때는 제 3자인 또 다른 변수를 활용하여 두 변수의 값을 서로 바꾼다는 개념이 자리잡지 않았으며, 무엇보다 여기서 '대입'에 대한 이해도가 아직 설익었다는 것이었다.

 

그리고 설령 내가 c를 활용하여 위의 코드와 흡사하게 짰다고 할지라도, 분명 순서나 위치가 엉키고 설킨 상태로 코드를 짰을 것이다. 이 부분은 차후 산술연산자 파트에서 마주하게 되면서, 대입연산자 개념에 대해 점차 이해가 되곤 하였다.


한마디

테스트가 외려 나한테는 좋은 시너지가 되고 하는 거 같다. 내가 아직 이해 못한 부분이 어디이며, 어디가 아직 개념이 제대로 서지 못하였는지 등등 내 스스로 점검할 수 있는 계기가 될 수 있어서, 우연히 맞췄다고 한다면, 지금 나로서는 그냥 아예 틀려버리는 게 낫다고 본다. 우연히 맞추고 한다면, 분명 틀린 부분보다 제대로 확인하지 않고 넘길 우려가 크기 때문에, 지금 나한테는 완전히 이해한다면 맞춘거고, 좀 긴가민가 싶은 부분 헷갈리는 게 조금이라도 있으면, 그냥 틀렸다거나 모른다고 단정짓는 냉정함이라는 자기 채찍질이 필요하다라 본다.

 

나중에 더 허우적 거려, 내가 원하는 개발을 자유자재로 날개펼치며 날아가야 하는데, 개념과 빈틈투성으로 날지도 못하고 하늘만 쳐다보는 비참함을 상상한다면, 누구보다 더 열심히 노력해야 할 때임을 잊지말도록 하자! 

728x90

'XR개발 > C언어' 카테고리의 다른 글

C 오답노트02_산술연산자 & 선택제어문(조건문)  (0) 2025.03.19
C언어 문자와 문자열  (1) 2025.03.02
C언어 포인터  (0) 2025.03.01
C언어 배열  (2) 2025.02.28
10_Q&A 함수원형에 대한 물음.zip  (0) 2025.02.16