[ C++ ] 기초 정리 3. 조건문, 반복문, 네임스페이스
열혈강의 C++ 언어본색 책을 참고하여 정리한 글입니다.
CHAPTER 3. 조건문, 반복문, 네임스페이스
3.1 조건문 if // 주로 조건이 범위일경우
Def . If
- 기본 if문은 주어진 조건이 참일 경우에만 내용을 실행한다. 그렇지 않으면 실행을 안하고 넘어가게 된다.
형태
if( 조건 ) { 실행할 내용 } |
- 수행할 내용이 한문장이 넘으면 반드시 중괄호 {}를 사용해야 한다. 만약 한문장이라면 { }는 사용할 필요가 없다.
만약 거짓일 경우에 다른 무언가를 실행해야 할 때는 어찌 해야 할까?
Def . If ~else
- 위에서 배운 if문은 오직 조건이 참일때만 시행하는 반면 if ~else문은 거짓일때도 수행할 문장을 지정할 수 있다. 이 문장은 경우의 수가 오직 두가지 일 경우 사용한다.
형태
if( 조건 ) { 조건이 참일 경우 실행할 내용 } else // 여기서 else에 대한 조건은 필요 없다 그냥 if의 조건을 만족시키지 못하면 else를 수행하게 된다. { 조건이 거짓일 경우 실행할 내용 } |
Def . if ~else if ~ else 문
- 위에서 배운 if ~ else문은 if가 거짓이면 모두 else로 들어간다. 즉 경우의 수가 두가지인 경우일 때 사용하는데 만약 경우의 수가 여러가지이면 if ~ else if ~ else 문을 사용한다.
형태
if ( 조건1 ) { 수행할 내용 } else if ( 조건2 ) { 수행할 내용 } else if ( 조건3 ) { 수행할 내용 } else // 위의 조건들 모두 부적합 할 때 시행 { 수행할 내용 } |
- 이 행태는 그냥 위에서 배운 else에다가 다시 if-else문을 반복적으로 사용해도 되는데 그건 코드의 길이가 길어지고.. 가독성이 너무 안좋아진다.
- 주의할점은 조건 1~3까지를 동시에 확인하는것이 아닌 위에서부터 순서대로 조건을 확인해서 참이면 바로 아래는 생각 안하고 수행해버리니깐 조건 잘 설정해두자.
- 코드 만들때 그럴일은 많이 없겠지만 조건확인 순서에 따라 결과가 달라질수도 있다.
3.2 상수 조건문 switch ~ case // 조건이 상수 값 하나 일 경우
Def . switch ~ case
- 조건이 범위 형식으로 나오는 3.1의 if문과 달리 switch는 조건의 결과가 상수 값 하나 일 경우 사용한다. 즉 a=1일경우, a=2일경우 등등 이럴 경우 사용한다
- 예를 들면 주사위를 굴린다 생각해보자 결과는 1~6 상수값이다. if문으로 해결할수는 있지만 이럴 경우 switch case문이 좀더 코드 가독성이 더 좋다.
형태
switch( 조건문 ) { case 조건결과1 : 조건 결과가 조건결과1일 경우 수행할 내용; case 조건결과2 : 조건 결과가 조건결과2일 경우 수행할 내용; default : 모든 조건이 맞지 않을 때 수행할 내용; } |
- 이때 주의해야 할 점은 조건문의 결과가 조건결과1일경우 조건결과1 이하의 모든 내용이 수행이 된다. 비슷하게 조건결과2일 경우 조건결과2 이하의 모든 내용 즉 조건결과 3, ..... default 모두 수행이 됨.
Def . break
- 위에서 배운 switch ~case는 결과에 따라 수행내용이 한가지가 아닌 결과에 대한 수행내용 그리고 그 이하의 내용이 모두 수행이 된다. 이를 해결하기 위해 break라는 연산자를 통해 주어진 범위에서 벗어 나야 한다. 즉 이제 수행내용을 그만하고 싶을 때 사용!
형태
switch(조건문) { case 조건결과1 : 조건 결과가 조건결과1일 경우 수행할 내용; break; case 조건결과2 : 조건 결과가 조건결과2일 경우 수행할 내용; break; default : 모든 조건이 맞지 않을 때 수행할 내용; } |
주의 할 점은 default에는 break를 쓸 필요가 없다. 왜냐면 어짜피 마지막 이니깐
여러 case에 대해 같은 내용을 수행하고 싶으면 밑의 형태를 사용할수도 있다.
switch( 조건문 ) { case 조건결과1 : case 조건결과2 : 조건 결과가 조건결과1 또는 조건결과2일 경우 수행할 내용; break; default : 모든 조건이 맞지 않을 때 수행할 내용; } |
이렇게 하면 조건결과 1일 경우에는 아무것도 없으니 수행 안하고 break가 없으니 조건 결과2 를 수행하게 되고 조건결과 2는 당연히 수행하고 break를 만나 빠져나가게 된다.
3.3 반복문 For, while, do~while
- 같은 내용을 여러 번 실행해야 하면 반복문을 사용하여 번거로움을 피하자!
- 반복문에는 반복횟수가 정확하게 정해질 경우가 있지만 그렇지 않은 때도 있다.
- 예를 들어 입력한 데이터 값이 100이하인 경우 또는 반복 여부를 프로그램 사용자가 직접 입력해서 결정 하는 경우 등이 있을 수 있다.
반복문의 필수 요소
- 1. 무엇을 반복할 것인가?( 제어변수 또는 반복변수)
- 2. 어떤 조건일 때 반복할 것인
- 3. 반복할 내용은 무엇인가?
- 4. 반복하면서 제어변수에 대한 변화는 있나?
Def . For
- for문은 반복문의 횟수가 정해져 있을 때 반복과 관련된 내용을 나타낼 수 있다.
형태
for( 제어변수 초기화 ; 조건문 ; 증감문 ) { 반복할 내용; } |
반복문 for의 실행 순서는 아래와 같다
- 제어변수를 초기화 한다.
- 조건문을 실행한다. 참일 경우 반복할 내용을 시행하고 거짓일 경우 반복문 밖으로 제어가 이동한다.
- 반복할 내용을 시행한다.
- 증감문을 실행하고 다시 조건문을 실행한다.
for은 만약 제어변수가 처음부터 조건문에 대해 거짓일 경우 바로 반복문 밖으로 나가 즉 반복할 내용을 한번도 수행 안 할 수가 있어!
- 여기서 주의할 점은 만약 초기화가 되어있지 않거나 반복 여부를 묻지 않는다면 영원히 끝나지 않는 무한 반복을 시행하게된다.
- 초기화는 뭐 for 위에서 해도 되고 증감문은 반복할 내용안에 넣어도 상관 없다
- 대신 조건문은 꼭 들어가야한다.
방금 서술한 형식의 형태는 이렇게 된다.
제어변수 초기화; for( ; 조건문 ; ) { 반복할 내용; 증감문; } |
Def . while
- while문은 바로 위에 있는 for문에서 초기화를 미리 시행하고 증감문 또한 반복내용에 포함된 형식이다. 진짜 for문과 엄청 비슷한데 왜 있냐면 그냥 프로그램 제작자의 가독성을 편리하기위해 for 또는 while 둘 중 하나 사용 하는거야
형태
제어변수 선언 while(조건문) { 반복할 내용; 증감문; } |
이때 주의할 점은 꼭! 제어변수가 while문 이전에 선언 되어 있어야 하고 초기화 되어 있어야한다. 그리고 증감문도 반복할 내용에 들어가 있어야 한다. 형태는 위에서 설명한 특이한 for문의 형태와 같다.
While도 마찬가지로 제어변수가 조건에 맨처음부터 거짓이면 반복할 내용을 한번도 수행 안한다.
Def . do ~ while
- 위에서 설명한 for, while문은 조건에 대해 맨처음부터 거짓이면 내용을 한번도 수행 안해 대신 do ~ while문은 무조건 한번은 수행한다음에 조건에 대해서 생각을 한다.
- 주로 범위 (조건) 에 맞는 내용을 입력 받아야 할 때 do ~ while문을 사용하는게 편리하다.
- 예를들어 나이를 입력 받고자 할때 우선 한번 입력 받고 그다음 조건 판단후 만약 이상한 값이 들어오면 반복해서 조건을 만족시킬때까지 나이를 입력 받는 문장을 수행한다.
형태
제어변수 초기화 do { 반복할 내용; 증감문; } while (조건문) |
필요에 따라 증감문은 안써도 될때가 있다.
Def . continue
- continue 명령문은 반복 범위 처음으로 실행 제어를 이동하게 한다.
- 비슷하게 break는 반복 범위에서 나가게 하지만 continue는 처음으로 가는게 차이다. 즉 반복은 계속 하고싶은데 조건 내에서 어떤거는 또 수행 안하고싶다면 사용한다.
- 즉 이거를 통해 조건 내에서도 어떤 경우에는 내용을 실행 안하고 어떤 경우에는 내용을 실행할수도 있다.
예시
for(i=1;i<10;i++) { if (i%2==0) continue; cout << " i = " << i << endl; } |
이렇게 하면 짝수일 경우에는 cout 이 되기 전에 다시 증감문으로 실행 제어가 이동을 하게 되어 짝수가 출력이 안된다.
3.4 반복문의 중복
- If 문안에 또다른 if문도 쓸 수 있는것과 같이 반복문에서도 for, while, do~while안에 for, while, do~while을 사용 할 수가 있다.
- 이때 주의할 점은 반복 횟수를 결정하는 제어 변수의 사용인데 실행 범위가 제어 변숫값 변화에서 명확해야 한다는 것이다.
- 이부부은 직접 해보면서 배워야한다..
- for문은 반복 쉬운데 while이나 do~while을 반복해서 사용하는거는 쉽지 않을거 같다.
- 사실 코딩하는 사람마다 취향이지만 나는 while문보다 for문을 즐겨 사용한다.
3.5 코드 범위와 네임스페이스
- 위에서 배웠듯이 어떤 내용을 실행할때는 그 내용의 범위가 있다. for문의 범위, if문의 범위 등등 모두 { } 를 통해 범위를 표시한다.
- C++프로그램은 파일 단위 그리고 범위 단위에서 크게 선언부( 네임스페이스를 선언하는 부분 )와 동작부( 예시로는 main함수의 범위 )로 구분이 되고있다.
- 프로젝트 내에는 같은 이름의 함수가 사용될수 없다. 즉 int main() <-이거는 main이라는 함수의 내용이다 라는 의미이고 int main2() <-이거는 main2라는 함수의 내용이라는 것이다. 같은 이름의 함수가 두개 있을 수는 없다.
- 한 범위 내에서 변수를 선언하면 그 범위 내에서만 그 변수를 사용할수 있어 즉 for문 안에서 int a=200이라고 초기화하고 선언했다 하자 그럼 for 밖에서는 a=200이 아닌거다. ( 코딩하다보면 이런 실수를 많이 하게됨.. )
Def . namespace
- 네임스페이스는 말 그대로 소속을 알리는 역할이다.
- 즉 네임스페이스를 선언부에서 선언할텐데 각각의 공간에 특정한 변수가있는데 동작부에서 따로 변수 선언을 할 필요없이 네임스페이스를 불러와서 변수를 사용할 수가 있게된다.
형태
namespace 이름 { 선언내용; // 변수 선언 } |
그리고 동작부에서 namespace에 있는 선언 내용을 가져와서 사용하고 싶을떄는 아래 형태를 사용하면 되는거야
네임스페이스이름::네임스페이스안에있는변수 예시 ) Namespace gisan { int a=200; } …… Cout << “namespace gisan의 a값 = “ << gisan::a << Endl; 이렇게 하면 gisan이라는 네임스페이스의 a은 200으로 초기화 되어있으니 200이라는 숫자가 출력이 된다. |
이렇게 :: 쓰는게 귀찮잖아 솔직히 그럴 때 사용하는게 using namespace 이름; 이거야 우리가 계속 접했는 using namespace std; 여기서는 cout, cin, Endl 등 이런것들이 std라는 네임스페이스에 있던 것들이고 원래는 std::cout, std::cin, std::Endl 이렇게 사용했어야 하는것들이지
형태
선언부에 이 한문장을 입력해주면 된다. using namespace 이름; |
근데 여기서 문제가 있어 using 지시자를 사용할 경우 다른 네임스페이스에 같은 이름의 필드가 있을 때는 주의해야한다.
이럴경우에는 그냥 그 필드를 언급할때만 ::사용하면 끝이다.
형태
Namespace gisan { int a=200; } Namespace eom { int a=100; } …… Cout << “gisan의 a값 << gisan::a << Endl; Cout << “eom의 a값 << eom::a << Endl; |