switch 조건문
어떤 값이 정해져 있고 어떤 값들 중 골라서 사용해야할 때 switch 조건문을 사용한다.
변수=상수일 때 주로 사용한다. 즉, 상수와 직접적으로 비교하는 조건형식에 유리하다.
case 뒤에 반드시 상수만 올 수 있고, 비교 대상이 상수가 아닌 경우 사용이 불가하다.
정해진 상수를 여러 번 비교해야하는 경우 if~else if~else문보다 switch문이 더 효율적이다.
break;는 현재 수행되는 case문을 빠져나오는 기능을 하고 상황에 따라 생략하기도 한다.
가장아래의 명령문의 break;가 없어도 종료되기 때문에 생략 가능하다.
switch문은 수식의 결과 값 또는 변수의 값을 여러 개의 상수 값과 비교하는 것이 장점이고
case문에 변수를 적을 수 없기 때문에 배교 대상이 상수가 아닌경우 switch문을 사용할 수 없다는 것이 단점이다.
default문
수식의 결과 값이 case문을 사용해 열거한 상수값들과 일치하는 값이 없는 경우 수행할 명령을 적는 곳
if 조건문의 else문과 동일한 역할을 하고 생략가능하다.
default문의 위치는 일반적으로 아래에 적는다. 이 경우에는 break;를 생략가능하다.
하지만 default문이 가장 위에 있는 경우에는 break;를 반드시 적어 주어야 한다.
또한 default문은 if문의 else문과 같은 기능을 한다.
반복문
반복문이란 지정한 작업을 반복해서 수행하는 문법이다.
반복문에는 필수적인 3요소가 있다. -> 시작조건, 조건 변화 수식, 종결 조건
반복문을 잘 사용하기 위해서는 우리가 말하는 것의 생략된 많은 부분을 생각해 보면서 순서도로 그려서 생각해보면서 절차적 사고를 길러야 한다.
for 반복문의 기본 구조
for 반복문은 반복의 3요소(시작조건; 조건 변화 수식; 종결 조건)를 제일 단순하고 정확하게 표현한 반복문이다.
반복문 중 가장 많이 사용되며 시작과 끝이 명확한 반복문에 많이 사용한다.
시작 조건 -> data=0, test=0과 같이 시작 조건을 ,로 작성할 수 있지만 bug가 생길 수 있기 때문에 지양한다.
;을 제외한 반복의 3요소(시작조건; 조건 변화 수식; 종결 조건)를 모두 생략 가능하다.
또한 명령문에는 복합문과 단일문이 사용될 수 있다.
일상 생활에서 예시를 들면 아래와 같다.
1. 시작조건 -> 2. 종결 조건 비교 -> 3. 참이면 명령문 실행 -> 4. 조건 변화 수식 -> 5. 종결 조건
지금 팔굽혀펴기를 할건데 0개야 -> 5개 했어? -> 팔굽혀펴기 하기 -> 팔굽혀펴기 1개 했어 -> 5개 했어?
for 반복문을 사용하여 1부터 5까지 더하기
for 반복문의 기본 구조와 for 반복문
for 반복문에서 반복의 3요소는 사용할 필요가 없는 경우 생략이 가능하다.
요즘은 시작조건에 Data 자료형을 적어 줄 수 있다. 이 경우가 프로그램의 효율성이 제일 좋다.
for 반복문으로 무한루프 만들기
무한 반복문(무한 루프) : 무한히 반복하는 형태의 반복문이다.
무한히 반복할때는 종결 조건이 없거나 항상 참(1)인 경우 무한 반복문이 된다.
무한 반복문은 break와 함께 쓰이는데 break는 제어문 하나를 깨고 나올 수 있다.
while 반복문의 기본 구조
while문은 명령문을 반복하는 문법이다.
'종결 조건'만 형식으로 가지고 '시작 조건'과 '조건 변화 수식'은 프로그래머가 적절하게 사용할 수 있는 문법이다.
for문과 while문은 문법이 똑같다고 할 수 있다. for문과 while문의 속도 차이는 거의 없기 때문에 편하다고 생각하는 반복문을 사용해야한다.
for문에서 시작 조건을 주지 않고 조건 변화 수식만 쓰면 while문이다.
for(; num<=5; ) {
}
while (종결 조건) 명령문;
while (종결 조건) {
명령문1;
명령문2;
}
while 반복문을 사용하여 1부터 5까지 더하기
while 반복문으로 무한 루프 만들기
while문에서 종결 조건은 생략 불가하다.
종결 조건에서 부조건 참이 되는 수식을 넣으면 while문이 무한 루프가 된다.
do ~ while 반복문
while문과 유사하지만 '종결 조건'을 명령문을 수행한 후에 체크한다.
'종결 조건'이 거짓인 상황에도 명령문을 적어도 한 번은 수행한다.
do ~while문은 반복문이긴 하지만 무조건 한번은 수행해야하는 상황이 많지 않아 특별한 경우가 아닌 이상 do~whille문을 잘 사용하지 않는다.
do 명령문1; while(종결조건);
do {
명령문1;
명령문2;
} while(종결조건);
중첩 반복문의 구조
중첩 반복문 : 반복문 안에 또 다른 반복문이 포함되어 있는 형태이다.
외부반복문 속에 내부 반복문에 포함되어 있는 형태이다.
break 제어문
자신이 포함된 반복문을 종료시키는 기능을 한다.
break문 사용시 하나의 반복문에만 적용이 가능하다.
continue 제어문
반복문에서 1회성 취소를 하는 제어문이다.
명령문을 실행 중에 continue문을 만나면 조건 변화 수식으로 돌아간다.
while문과 continue 제어문의 주의할 점
for문에서는 문제가 되지 않지만 while문에서는 주의할 점이 있다.
goto 제어문
자신이 지정한 레이블(Lable) 위치로 바로 이동 가능하고, 어떤 위치에 있던지 상관하지 않고 레이블로 이동 가능하다
하지만 C언어의 구조화된 문법을 파괴하기 때문에 goto 제어문은 사용하지 않는다. 쓰지 말아야할 문법이다.
for문, do~whlie문, while문은 모두 같은 기능을 하기 때문에 프로그래머의 입맛에 따라 골라서 사용하면 된다.
비트 단위 연산자와 비트 패턴
1비트에는 일반적으로 0 또는 1(두가지 중 한 개) 중 한가지 값을 저장 가능하다.
그러나 1비트만을 저장할 자료형이 없다. C언어의 가장 작은 자료형은 1바이트 크기를 갖기 때문이다.
단 계산은 비트 단위로 할 수 있다.
비트 패턴과 16진법
C언어는 2진법 상수 표현을 제공하지 않는다. 왜냐하면 2진법으로 표현하면 수가 너무 길어지기 때문이다.
2진법 대신에 소스코드에서는 표현학 쉬운 16진법을 주로 사용
비트 단위 연산의 장점
일반적으로 두가지 조건 중 한가지를 저장하는 경우가 정말 많다.
형광등을 예로 들어 형광등 하나마다 1바이트를 주면 데이터의 낭비가 심해진다.
형광등이 100개면 100바이트가 필요해지는 상황이 발생해 데이터의 낭비가 발생한다.
비트 단위의 연산을 통해 1바이트를 1비트로 저장하는 법을 배울 수 있다.
시프트 연산자
다른 연산자에 비해 처리 속도가 매우 빠르다.
남하고 연산하지 않고 자신의 비트 패턴을 바꾸어서 연산하기 때문에 연산 속도가 굉장히 빨라진다.
오버플로 : 비트가 왼쪽으로 이동해서 사라지는것
언더플로 : 비트가 오른쪽으로 이동해서 사라지는 것
시프트 연산자는 변수의 값을 지정한 비트수 만큼 왼쪽으로 밀거나 오른쪽으로 미는 연산자 이다.
변수 << 이동할 비트 수 or 변수 >> 이동할 비트 수
시프트 연산자의 활용
<< 특성 : n 개의 비트를 오른쪽에서 왼쪽으로 이동하면 2^n을 곱한 것과 동일하다.
>> 특성 : n 개의 비트를 왼쪽에서 오른쪽으로 이동하면 2^n을 나눈 것과 동일하다.
시프트 연산자는 곱셈과 나눗셈보다 연산 속도가 훨씬 빠르다.
2의 제곱으로 곱하거나 나눌 때에만 시프트 연산자 사용가능하다.
시프트 연산시 주의 할 점
1. 연산자 우선 순위가 낮다.
int num = 3*4 + 5*8;
int num = 3<<2 + 5<<3;
괄호x int num = 3 << 7 << 3; // +연산자가 <<연산자 보다다 우선 순위가 높아 2+5가 먼저 연산된다.
괄호o int num = (3<<2) + (5<<3);
2. 변수에 부호가 있는 경우
char data = 0x85;
data = data >> 3;
부호가 바뀌면 안되기 때문에 부호비트(최상위 비트)로 채워주어야 한다.
보통 시프트 연산자를 쓸때 대부분 unsigned type을 사용하기 때문에 unsigned type에서는 걱정하지 않아도 된다.
따라서 자신이 다루고 싶은 숫자가 양수일때만 시프트 연산자를 사용하는 것이 좋다.
data = data<<1 // data 값이 바뀐다.
data<<1 // data 값이 바뀌지 않는다.
비트 연산자
AND(&), OR(|), NOT(~), XOR(^)의 연산을 수행한다.
AND 연산 : A, B 값이 둘 다 1일때만 연산의 결과가 1이다.
OR 연산 : A, B 값이 둘 다 0인 경우에만 연산의 결과가 0이다.
NOT 연산 : 현재 비트 패턴이 반전된다.
XOR 연산 : A, B 값이 같으면 연산의 결과가 0, 다르면 1이다.
AND 연산 : A & B
A 비트의 값이 0이면 B 비트의 값에 상관없이 무조건 0이다.
A 비트의 값이 1이면 B 비트의 값에 따라 0 또는 1이다.
A 와 B의 비트 값이 모두 1일 때만 1이다.
OR 연산 : A | B
A 비트의 값이 0이면 B 비트의 값에 따라 0 또는 1이다.
A 비트의 값이 1이면 B 비트의 값에 상관없이 1이다.
A 와 B의 비트 값이 하나라도 1이면 1이다.
XOR 연산 : A ^ B
연산하는 두 비트이 값이 같으면 0, 다르면 1
XOR을 가장 많이 사용하는 경우
i=0; 대입연산
i=i^i; 비트 연산자 <-- 대입 연산 보다 훨씬 속도가 빠르다.
지금은 XOR(^)을 암호화 할 때 많이 사용한다.
NOT 연산 : ~A
각 비트의 값을 반전시키는 작업을 수행한다.
비트 단위로 데이터를 다루는 방법
비트 연산자는 최소 1바이트(8비트) 단위로 연산
지정한 비트에만 값을 대입하는 연산자가 없기 때문에 프로그래머가 비트 연산자의 특성을 이용하여 지정한 비트만 연산하도록 직접 구현해야 한다.
지정한 비트를 0으로 설정하기 : AND 연산자 이용
지정한 비트를 1로 설정하기 : OR 연산자 이용
특정 비트의 값 얻기 : AND 연산자 이용
보수를 이용해 덧셈으로 뺄셈 구현하기
정수라는 연산을 할 때 메모리가 정해져 있는 것을 이용하는것이 보수이다.
225 + 1 = 0 이라는 연산을 역으로 연산한 것을 이용한 것이다.
'Programming > TIPS 17기' 카테고리의 다른 글
Day-6 배열과 문자열, 포인터 (2) | 2017.07.16 |
---|---|
Day-5 지역변수와 전역변수, 배열과 문자열 (2) | 2017.07.14 |
Day-3 표준출력함수, 연산자, 조건문 (0) | 2017.07.05 |
Day-2 자료형, 상수와 변수, 함수 (0) | 2017.07.03 |
Day-1 프로그램과 C언어, 자료형 (1) | 2017.06.28 |