2023.01.05 - 안드로이드 앱개발자 과정

CHA·2023년 1월 5일
0

C언어



상수


C언어 에서는 다음 3가지의 상수가 있습니다.

  1. 리터럴 상수 : 흔히 말하는 ' 값 ' , RAM 에는 리터럴 상수를 위한 메모리가 할당됩니다. 즉, 정수, 실수 뿐 아니라 문자와 문자열 또한 상수가 될 수 있습니다.
  • 정수 - 4바이트
    실수 - 8바이트
    문자 - 4바이트 (숫자로 취급)
    문자열 - 글자수 크기만큼(ex. hello 는 5바이트)

  1. 매크로(심볼릭) 상수
#include <stdio.h>
#define MAX 100	-> 매크로 상수 
void main() {
	printf("%d \n", MAX);
}

  1. 상수화된 변수
void main() {
	const int a = 10;
	a = 20; -> 에러. a는 const 키워드 때문에 상수화가 되었음. 변경 불가. 또한 선언과 초기화를 함께 해주어야 함.
}


연산자


연산자 종류

  • 산술 ( + , - , * , / , % , -(단항) )
  • 비교 ( < , > , <= , >= , == , != )
  • 논리 ( && , || , !(단항) )
  • 비트 ( & , | , ~(단항) , ^ , << , >> )
  • 증감 ( ++ , -- ) (단항)
  • 대입(복합) ( = , += , -= , *= , /= , %= )
  • 삼항(조건) ( 조건 ? 참일때 : 거짓일때 )
  • 형변환 (1회용이라고 생각하자.)

일단 연산자를 들어가기 전에 다음 개념을 알아두자.

#include <stdio.h>

void main() {
	int a;
	a = 10;
}
  1. int a 를 선언하면 메모리에 a 에 대한 메모리를 할당시킵니다.
  2. 10이 대입되기 전이므로 a 의 메모리에는 쓰레기 값이 할당됩니다.
  3. 대입 연산자는 10 에 해당하는 메모리 공간을 복사해서 a 메모리에 붙여넣기합니다.

중요한것은 메모리를 복사해서 붙여넣기 때문에 메모리 공간의 크기는 동일 해야한다. 동일하지 않다면 내부적으로 일련의 과정을 거쳐 크기를 맞춰주게 된다.


산술연산자 ( + , - , * , / , % , -(단항) )

산술연산자를 통해 내부적으로 일어나는 과정에 대해 알아보자. 먼저, 아래 코드를 살펴보자.

void main() {
	int a = 10;
	int b = 4;

	double c;
	c = a / b;

	printf(" c : %lf \n", c);
}

위 코드는 내부적으로 아래 그림과 같은 과정을 거쳐 화면에 출력된다.

1. RAM 의 메모리에 할당되어 있는 a와 b는 / 연산을 위해 CPU 의 레지스터로 옮겨지고,
2. 연산이 된 뒤 누산기로 넘어가게 된다.
3. 그 뒤에 바로 c로 들어갈 수는 없고 = 연산을 위해 먼저 RAM 의 임의의 메모리 공간으로 옮겨지게 된다. 이때 할당되는 메모리공간을 임시공간이라 하는데, 이 임시공간의 메모리 크기는 피연산자의 메모리 크기에 맞추어 만들어진다. 여기서 피연산자는 a,b 이기 때문에 4바이트가 할당되며, 2.5 였던 값이 2로 바뀌어 저장된다.
4. 그런데 c의 데이터 타입이 double 이고, 임시공간에 들어있는 리터럴 상수의 타입은 정수이기 때문에 형변환이 필요하다. 또 다른 메모리공간에 임시공간에 있는 값을 묵시적 형변환을 통해 2.0으로 변환한 다음,
5. =연산을 통해 c의 메모리 공간으로 붙여넣기 된다.

***만일 피연산자의 타입이 다를때는? 바이트가 큰 쪽으로 자동 형변환 처리된다.


비교연산자 ( < , > , <= , >= , == , != )

결과값을 생각하자. 예를 들어 5+3 은 결과값이 8임은 자명하다. 그렇다면 비교 연산자를 사용한다면 그 결과값은 어떻게 될까를 생각해보자. 비교연산자 < 을 생각하자. 5 < 8 은 어떠한 숫자로 결과값이 나오는게 아니라 참 혹은 거짓으로 결과가 나오게 된다. C언어 에서는 이러한 참과 거짓의 결과 값을 각각 1 과 0으로 표현한다. 다음 코드를 통해 확인하자.

#include <stdio.h>

void main() {
	printf("%d", 5 < 8);	결과 : 1
	printf("%d", 5 < 3);	결과 : 0
}

비교연산자는 추후에 조건식에서 많이 쓰이기 때문에 이 점도 참고해두면 좋다.


논리연산자 ( && , || , !(단항) )

  • 비교연산자의 한계
#include <stdio.h>

void main() {
	int age = 25;

	if (age > 20) {
		printf("입장하세요\n");
	}
}

위 코드는 아무 문제없는 코드이다. 그런데 조건식이 age 가 20 초과 이다. 여기서 만약에 조건을 추가하고 싶다면 어떻게 해야할까? 예를 들어, age 가 40 미만 이다. 라는 조건을 추가하고 싶다고 하고, 다음 코드를 살펴보자.

#include <stdio.h>

void main() {
	int age = 15;

	if (20 < age < 40) {
		printf("입장하세요\n");
	}
}

일반적으로 보면 이상할리 없는 코드겠지만, 컴퓨터는 한번에 하나씩 명령을 처리하기 때문에 문제가 발생한다. 위 코드에서 보면, 조건식 에서 20 < age 를 먼저 계산한다. age = 15 이기 때문에 그 결과 값으로 false, 즉 0 이 된다. 그러면 그 다음에 0 < 40 을 계산하게 된다. 그러면 그 결과값은 true, 즉 1이 된다. 그렇기 때문에 코드상에서는 오류가 없지만 논리적으로는 오류가 발생한다. 그럴때 사용해야 하는것이 논리 연산자 이다.

간단하게 코드로만 살펴보고 이해하고 넘어가도록 하자.

  • && 연산자 : 양 쪽이 다 1 일때만 결과값이 1
#include <stdio.h>

void main() {
	int age = 20, num = 1;
	
	if (age > 15 && num < 10) {
		printf("입장하세요\n");	결과 : 입장하세요
	}
}
  • || 연산자 : 양 쪽중 하나만 1이어도 결과값은 1
#include <stdio.h>

void main() {
	int age = 20, num = 12;
	
	if (age > 15 || num < 10) {
		printf("입장하세요\n");	결과 : 입장하세요
	}
}
  • ! 연산자 : 결과값이 0이면 1로, 1이면 0으로 바꿔줌.
#include <stdio.h>

void main() {
	int age = 20, num = 1;
	
	if (!(age < 15)) {
		printf("입장하세요\n");	결과 : 입장하세요
	}
}

비트연산자 ( & , | , ~(단항) , ^ , << , >> )

#include <stdio.h>

void main() {
	printf("%d \n", 5 & 7);	비트값으로 and 연산.
	printf("%d \n", 4 | 9); 비트값으로 or 연산.
	printf("%d \n", 5 ^ 7); 비트값으로 같은값은 1로 다른값은 0으로 연산.
	printf("%d \n", ~9); 	비트값으로 다 바꾸기 연산.

	int a = 8;
	printf("%d\n", a << 2); 비트값으로 왼쪽 2칸 이동 연산.
	printf("%d\n", a >> 2); 비트값으로 오른쪽 2칸 이동 연산.
}

증감연산자 ( ++ , -- ) (단항)

#include <stdio.h>

void main() {
	int a = 10;
	printf("%d\n", a);	결과 : 10

	a = a + 1;
	printf("%d\n", a);	결과 : 11

	a++;
	printf("%d", a);	결과 : 12
}
  • 주의할 부분 : 전위형, 후위형
void main() {
	int a = 10;

	printf("%d\n", a++);	결과 : 10
	printf("%d\n", a);		결과 : 11
	printf("%d\n", ++a);	결과 : 12
	printf("%d\n", a);		결과 : 12
}

대입연산자 ( = , += , -= , *= , /= , %= )


삼항연산자 ( 조건 ? 참일때 : 거짓일때 )

#include <stdio.h>

void main() {
	printf("점수를 입력하면 학점을 계산하는 프로그램\n");

	int score;

	while (1) {
		printf("점수를 입력해주세요 : ");
		scanf_s("%d", &score);

		char rank;
		rank = (score >= 90) ? 'A' : 
               (score >= 80) ? 'B' : 
               (score >= 70) ? 'C' : 
               (score >= 60) ? 'D' : 'F';
		printf("당신의 학점은 %c 입니다.\n", rank);
	}
	
}
profile
Developer

0개의 댓글