본문 바로가기
[ C언어 ]/- C언어 문법공부

C언어 5장(변수, 상수, 연산자)

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

먼저 중단점을 찍어보겠습니다. 이건 Break Point라고 부르는 것인데 소스코드 특정 부분에서 프로그램을 멈추게 해 줍니다. 그래서 우리가 빠르게 작동하는 프로그램에 순차적인 부분을 확인할 수 있습니다. 순차적이라는 말은 순서대로 작동한다라는 이야기입니다. 

안녕하세요 ^^ 오늘도 즐겁게 코딩을 배워보겠습니다.
저번장에서 숙제를 드렸는데 해보셨나요? 
제가 말한 숙제는 꼭 하셔야 합니다. 그래야 실력이 늘어요. 꼭꼭입니다. 
그럼 저랑 한가지만 진행해보겠습니다. 

 

먼저 이렇게 작성해보겠습니다. 
이걸 보고 어? 이렇게도 할 수 있네요?라는 의문을 가지실 수 있을 거라 생각합니다. 이건 변수 선언과 정의까지 하고 있습니다.

▣ 또한 저위에 그림처럼 하는 방법이랑 맨위에 있는 방법이랑 다르지 않습니다. 결국 변수를 선언하고 정의하는 것은 같은 거니까요. 그렇기 때문에 우리가 보기 좋게 읽기 좋게 작성하는 게 중요하다고 저는 생각합니다. 그리고 printf 함수를 사용해보셨나요? 저번장에서 이야기했듯이 형식에 맞게 출력을 하는 걸 의미합니다. 그래서 첫 번째 %d에 a변수 값이 두 번째 %d에 b변수 값이 세 번째 %d에 c에 변수값으로 출력이 되는 걸 볼 수 있습니다. 



그럼 이렇게 결과를 확인할 수 있습니다. 결과는 디버그하지 않고 시작을 하도록 하겠습니다.

 

그럼 우리가 형식에 맞게 대입한데로 값이 출력되었습니다. 



▣ 그럼 여기서 한가지 저번 시간에 이어서 변수에 주소에 대해 알아보도록 하겠습니다. 이건 나중에 포인터를 배울 때 너무너무 중요하기 때문에 다시 한번 진행하겠습니다. 
변수에 대해서 설명했을때, 변수는 메모리이고 그릇이다, 박스다라는 이야기를 했습니다
그리고 그 형식에 맞게 자료형이 있고 고유에 주소가 있다고 말씀드렸습니다. 그럼 이걸 그 주소를 확인해보도록 하겠습니다.

 

먼저 중단점을 찍어보겠습니다. 이건 Break Point라고 부르는 것인데 소스코드 특정 부분에서 프로그램을 멈추게 해 줍니다. 그래서 우리가 빠르게 작동하는 프로그램에 순차적인 부분을 확인할 수 있습니다. 순차적이라는 말은 순서대로 작동한다라는 이야기입니다. 

 

 

먼저 내가 중단할 부분에 마우스 커서를 놓고 클릭한 후에 F9를 이용하거나 메뉴를 눌러 중단점을 찍습니다. 그럼 이렇게 빨간 동그라미가 나오게 됩니다. 그럼 디버그로 실행하면 이 부분까지 진행하고 멈추게 됩니다.  우리는 여기서 프로그램을 멈추고 하나하나 그 과정들을 살펴볼 예정입니다. 그다음에 F5를 누르고 디버그를 시작합니다.

 

그럼 이렇게 디버그가 시작되고 빨간색 점에 화살표가 나오게 됩니다. 이건 중단점 부분에서 프로그램이 멈췄다라고 생각하시면 될꺼같습니다. 그리고 밑에 조사식과 오른쪽에 메모리에 영역이 나옵니다. 조사식은 연산에 과정을 풀어서 하나하나 보여준다고 생각하시면 될꺼같습니다. 그건 하나하나 우리가 실행하며 그 과정을 보고 이해하면 되실 겁니다. 그리고 옆에 메모리 부분은 메모리에 주소에 값을 확인할 수 있고 들어 있는 값도 확인할 수 있습니다.  만약에 이게 안 나왔다면 이렇게 하시면 됩니다.

 

이렇게 디버그에 창에서 조사식과 메모리 메뉴를 불러 올 수 있습니다. 여기서 조사식 위에 있는 자동으로 가져오셔야 프로그램이 하나하나 실행될 때마다 연산에 결과들을 보여주고 메모리는 1을 가져오도록 하겠습니다. 이걸 통해서 우리가 직접 주소를 검색해서 찾아서 볼 예정입니다.

 

▣ 메모리1 밑에 주소 부분에 &변수 이름을 넣도록 하겠습니다. 
자 여기서 우리가 저번장에서 배운 &기호를 사용하게 되었습니다. 이건 여러 의도로 사용할 수 있지만 그중에 
&x를 하게 되면 x변수에 주소를 의미합니다. 
저는 a라는 변수를 만들었고 &a에 주소에 값을 보고 싶기 때문에 이렇게 검색을 했습니다.
여러분도 여러분들이 설정한 변수이름을 넣어서 검색을 합니다. (&a)
그럼 맨 위에 0x0019F8E4가 &a에 주소 값입니다. 
이게 무슨 숫자인가 하실겁니다. 이건 16진수로 주소를 표현했습니다. 이건 제가 따로 2진수 10진수 16진수를 한번 다루도록 하겠습니다. 우선 16진수인 것만 알아두시면 될꺼같습니다. 

 

그다음에 F10을 누르겠습니다. 아니면 메뉴에서 이렇게 프로시저 단위 실행을 누르시면 됩니다. 이건 다음 코딩을 실행해라는 것으로 이해하시면 될꺼같습니다. 그걸 누르게 되면 이렇게 우리가 준 변수에 메모리 주소 값 안에

 


이렇게 0a가 채워지는걸 보실 수 있으실 겁니다. 자 우선 0a는 a는 16진수에서 10을 의미합니다.

그렇기 때문에 a변수 주소 안에서 10이 메모리에 저장되는 걸 볼 수 있을 겁니다. 여기서 00을 머고 cc는 먼지 궁금해하실 수 있으신 분이 많으실 거라 생각합니다. 이 부분은 메모리 부분이라 조금 나중에 집중적으로 진행해보고 우선 메모리 영역에 10이 16진수로 대입이 되었다라고만 이해해주시면 좋을 거 같습니다.

이렇게 계속 F10을 눌러서 마지막까지 진행하면 프로그램이 끝나고 아무키나 눌러주세요라는 문구가 나올 겁니다. 그리고 printf가 잘 출력되는 걸 볼 수 있을 겁니다. 
다시 중단점을 제거하려면 그 줄에 가서 F9를 누르시면 제거가 됩니다.



▣ 변수 메모리에 어떻게 값이 대입이 되는지 직접 확인했습니다. 여기서 중요한 포인트는 변수는 주소가 있다라는거 꼭 기억해주시면 좋을 거 같습니다. 그럼 상수에 대해서 진행해보겠습니다. 상수는 쉽게 이야기하면 그릇에 담겨 있는 내용으로 생각하시면 될꺼같습니다. 한마디로 실행하는 도중에는 값이 변화하지 않습니다. 이렇게 하면 이해가 안 되실 수 있으니 코딩을 해보고 다시 설명드리도록 하겠습니다.

 


자 이렇게 똑같이 코딩을 해보도록 하겠습니다. 
#define은 무엇이냐 #은 우리가 배웠습니다. 바로 전처리기 기호입니다. 컴파일전에 작업해라라는 의미이고 #define이라고 하면 상수값을 지정하기 위한 예약어로 매크로라고 부릅니다. 



▣ 그럼 메크로가 무엇일까요?
나무위키에서는 본래 매크로라는 개념 자체는 프로그래밍 언어의 기능에서 처음 등장한다. C/C++ 등, 매크로를 지원하는 언어에서 약식 문법을 정의하면, 컴파일러가 컴파일을 하기 전에 약식 문법으로 정의된 코드를 원래 코드로 변환을 한 후 컴파일한다. 이 기능이 처음 도입된 Lisp에서는 이 원래 코드로 변환하는 키워드를 원래 코드를 크게 확장한다는 의미에서 macroexpand라고 불렀고, 이 확장 규칙을 macro라고 부르는데, 이후의 언어들에서도 이 용어로 굳어지게 되었다.라고 이야기합니다.



지금은 흔히 쓰이는 의미로는 자주 사용하는 여러 개의 명령어를 묶어서 하나의 키 입력 동작으로 만든 것을 말한다. 라고 이야기를 많이 합니다. 우리는 이 의미로 기억하면 될꺼같습니다. 



그렇게 되면 d라는 문자는 40 이라는 숫자로 기호 상수가 되는 것입니다.
여기서 또 중요한건 40 뒤에 머가 없죠? 바로 ; 세미콜론이 없다는 거 꼭 꼭 기억해주세요. 왜 없느냐? 간단하게 생각하면 이건 컴파일 전에 처리하는 부분이기 때문입니다. 함수 밖에 있기 때문에 main함수를 시작하는 프로그램이 시작하는 부분이 아니기 때문입니다.



그럼 이걸 언제 왜 사용하는지 생각하시는 분들도 있을꺼라 생각합니다. 다 변수로 하면 되지라는 이야기를 하실 거라 생각합니다. 그건 간단하게 생각하면 프로그램 실행 중에도 바뀌지 않을 정해진 값을 만들 때 사용하시면 될꺼같습니다. 딱 정해진 값을 만들 때입니다. 중요한 값을 생각하면 될꺼같습니다.그리고 컴파일중에서도 상수를 만드는 방법이 또 있습니다. const를 앞에 붙여서 만들면 이것도 상수를 만들 수 있습니다. 이건 함수를 진행할 때 자세하게 다뤄보고 상수는 이 정도까지 진행하도록 하겠습니다. 



▣ 그럼 연산자를 진행해보겠습니다. 연산자는 우리가 알고 있는 연산자들을 위주로 진행해보겠습니다.

+ 더하기, - 빼기, *곱하기, /나누기, %나눈값에 나머지를 의미합니다. 간단하죠? 

그런데 여기서 의문이 들수 있는 몇 가지를 짚어 가겠습니다. 우선 printf 맨 밑에 있는 걸 보면 %%가 있는 걸 보실 수 있습니다. 이건 %를 하나를 문자로 표현하기 위해 %%로 표현했습니다. 이렇게 하지 않으면 형식으로 착각하여 오류가 날 수 있기 때문입니다. 



▣ 그럼 여기서 중요한 이야기를 하겠습니다. 연산자에는 우선순위가 있습니다. 정말 중요합니다.

자 이렇게 연산을 해본다고 생각해보겠습니다. num1에 값은 어떻게 될까요? num2에 값은 또 어떻게 될까요? 네 여러분들은 전 장에서 대입연산자에 대해 조금 들으셨기 때문에 때문에 num1에 값은 70이라고 대입이 될 거고 num2는 5라는 값이 될 거라는 걸 이해하셨을 겁니다. 그럼 제가 무슨 이야기를 할지 아시겠죠?
네 바로 우선순위입니다. =(대입연산자)보다 +(더하기) 연산자가 컴퓨터에서 연산 우선순위 더 높기 때문에 먼저 더하기를 진행합니다. 그다음에 순위가 =(대입 연산자)이기 때문에 num1에 값에 70이라는 숫자가 대입이 되는 것입니다. 

이런 식으로 연산자에 순위가 +가를 먼저 진행하고 =대입 연산자를 진행합니다. 이 부분 꼭 기억해주세요.
그리고 연산자마다 연산방향도 다릅니다. 이 부분은 표를 보여드리겠습니다.

 

이렇게 우선순위와 연산방향도 다르기 때문에 모두 다 외우실 필요는 없지만 어느 정도 내가 자주 쓸 거 같은 부분은 다시 필요할 때 다시 보거나 조금 알고 계시면 코딩 읽을 때 그리고 코딩할 때 많은 도움이 되실 거라 생각합니다. 컴퓨터는 모든 과정을 연산을 하는 거고 우선순위와 방향이 있다는 것 꼭꼭 기억해주시면 감사하겠습니다.

 

▣ 이건 복합연산자입니다.
num1 = num1 + 20; 은 하게 되면 우리가 더하기를 먼저 하고 = 대입 연산자를 하게 되는 걸 알기 때문에 num1에 20을 더한 값이 나올 거라는 걸 알고 있습니다.
그걸 줄여서 코드가 +=라고 생각하시면 될꺼같습니다. 절대 헷갈리지 않을 수 있습니다.
그건 우리가 이미 연산자 우선순위를 배웠기 때문입니다. =(대입 연산자)보다 +(더하기) 기호가 더 연산 우선순위가 높기 때문에 먼저 진행을 하겠죠? 그럼 20을 더하고 어디에 num1에 대입을 한다라는 개념적인 요소를 기억해주시면 아주 간단하게 이해할 수 있습니다. 그럼 증감 연산자는 무엇일까요?

 

이렇게 두 가지를 살펴보겠습니다. 제가 주석으로 설명했듯이 ++는 +1을 한다고 생각하시면 될꺼같고, --는 -1을 한다고 생각하시면 될꺼같습니다.
그런데 변수 오른쪽 왼쪽에 있는 건 무엇이냐라는 의문이 드실 수 있습니다. 주석에 설명처럼 오른쪽에 증감 연산자가 있으면 먼저 대입을 한 후에 +1을 연산합니다.
반대로 왼쪽에 증감연산자가 있으면 +1을 먼저 연산하고 대입을 진행합니다. 결괏값을 보시면 확실하게 알 수 있습니다.



이렇게 결과가 나온 걸 볼 수 있습니다. ^^ 조금 이해가 되시나요? 그런데 이런 건 어디서 사용해 불편하다는 말씀을 하실 수 있습니다. 하지만 우리가 나중에 조건문과 반복문을 할 때 이 연산자가 얼마나 유용했는지 알 수 있을 겁니다. 



▣ 오늘은 여기까지 진행하도록 하겠습니다. 오늘 배운 변수에 대한 부분과 상수에 대한 부분 그리고 연산자에 대한 부분들을 꼭 다시 한번 숙지해주시고, 숙제로는 변수와 상수 그리고 연산자를 활용하여 구구단을 해보고 그걸 활용하여 재미있게 악당에 HP를 떨어뜨리는 텍스트 게임을 구현 보면 좋을 거 같습니다. 말이 게임이지 정말 게임은 아닙니다. 아직 반복문과 조건문을 진행하지 않았기 때문에 예시로 이야기한 겁니다.
예를 들어 printf("주인공이 공격합니다.")를 한 다음다음 코드에서 printf("악당에 Hp가 89 남았습니다.") 이런 석으로 만들어 보세요. 당연히 값 부분은 변수와 상수로 해주셔야 합니다. 그리고 값들을 연산을 해서 저렇게 HP값 변수가 떨어지게 해 주세요. 꼭 하셨으면 좋겠습니다. 그래야 실력 코딩 실력이 늘어날 겁니다. ^^



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

728x90
반응형

댓글