C# 공부정리 - 기초문법 2 (변수, 조건문, 반복문)
지역변수
선언 된 변수는 그 {} 안에서만 유효하다는 특징이 있다.
int a;
{
int b;
int a; // 이건 애러!!
}
{
int b;
}
b = 10; // 이것도 애러
위 식을 보자
맨 처음 int a가 선언되었다.
그리고 괄호 안의 int a는 사용이 불가능 한데 이미 사용중인 이름이기 때문이다.
반면 아래 따로 격리된 괄호 안에서는 b를 사용할 수 있다.
그리고 괄호 밖에 벗어나있는 b는 애러라고 뜬다.
위의 두 int b는 어디까지나 그 괄호 안에서만 유효하기 때문에
가장 밖의 공간에서는 int b가 선언된 적이 없으므로 사용이 불가능 한 것이다.
다른 괄호 안에 있기 때문인데 이를 지역변수라고 한다.
분기문(branch)
if 문(조건문)
if문은 가장 중요하면서도 자주 사용하는 분기문이다.
C# 뿐만 아니라 다른 언어에서도 흔하며 어디서나 자주 쓰기 때문에 이건 꼭 알고 넘어갈 필요가 있다.
if (조건식) {
실행문
}
형태는 위와 같다.
조건식이 true이면 실행문을 실행하고 false면 실행하지 않는다.
if (조건식){
실행문
}else {
실행문
}
비슷한 형태의 if ~ else 문이다.
만약 조건식이 false라면 else에 있는 실행문을 실행하는 것이다.
if (조건식){
실행문 1
}else if (조건식){
실행문 2
}else {
실행문 3
}
또 비슷한 형태의 if ~ else if ~ else 문이다.
만약 첫번째 조건식이 false라면 그 아래 else if의 조건식을 본다.
그 조건식이 true라면 실행문 2를 실행하고
만약 false라면 실행문 3을 실행한다.
else if는 계속 줄줄이 달아줄 수 있다.
bool a = true;
if (a){
Console.WriteLine("참이다.")
}else {
Console.WriteLine("거짓이다.")
}
조건식 안에 a가 들어가 있는데, 이 a는 true다.
때문에 '참이다.'가 출력되고 '거짓이다.' 는 출력되지 않는다.
int a = 12;
int b = 8;
if (a > 10 && b < 10){
Console.WriteLine("참이다.")
}else {
Console.WriteLine("거짓이다.")
}
두번째 예시문이다.
if문의 조건문을 보면 a는 10보다 크기 때문에 참이다.
그리고 b는 10보다 작기 때문에 참이다.
그리고 이 두 개의 식이 둘 다 참이므로
if문의 조건식은 참이된다.
고로 '참이다.'가 출력된다.
switch문
체감상 그렇게 자주 쓰는것 같지는 않지만
만약 조건식이 여러개 있을 경우, switch문을 쓰기도 한다.
형태는 아래와 같다.
switch(조건식)
{
case 조건:
실행문 1
break;
case 조건:
실행문 2
break;
case 조건:
실행문 3
break;
....
}
보시다시피 case는 얼마든지 붙을 수 있고
case가 끝날 때는 반드시 break를 넣어줘야 한다.
예시를 만들어보자
int num = 10;
switch(num / 10)
{
case 10:
case 9:
Console.WriteLine("잘했어")
break;
case 8:
Console.WriteLine("8점")
break;
case 7:
Console.WriteLine("7점")
break;
default:
Console.WriteLine("몰라")
break;
}
num은 10이고 num을 10으로 나누었을 때,
그 값이 10이거나 9면 "잘했어"를 출력하고
8이면 "8점", 7이면 "7점"을 출력하라는 알고리즘이다.
맨 위 case 10을 보면 아무것도 없고 바로 case 9로 넘어가는데
이는 만약 (num / 10)의 값이 10이거나 9이면 Console.WriteLine("잘했어")를 실행하라는 의미다.
맨 아래 default는 위의 조건들 중 어느것도 해당하는게 없을 경우
실행하는 부분이다.
반복문
반복문에는 for문, while문, do~while문이 있으며 기본적인 형태는 아래와 같다.
for(초기식, 조건식, 증감식){
실행문
}
while(조건식){
실행문
}
do{
실행문
}while(조건식);
while문은 조건식 안의 내용이 참이면 실행문에 적힌 내용을 계속 반복하는 문이다.
while과 do~while은 사실상 거의 같으나 한 가지 차이가 있다면
do ~ while은 조건과 상관없이 무조건 한 번은 실행한다는 차이점이 있다.
while은 시작하기전에, 조건이 안맞으면 아예 실행 자체를 안한다.
for문은 초기식과 증감식이 있는데
이는 반복 조건용으로 사용한다고 보면 된다.
for (int i = 1; i < 10; i++){
실행문
}
보통 위와 같이 사용한다.
i라는 변수가 초깃값 1로 선언이 되고
i가 10보다 작으면 실행문을 실행한다.
그리고 실행문을 한 차례 다 실행했으면
증감문의 i++를 따라, i 값이 1 증가한다.
즉, 반복할 수록 i 값이 1씩 계속 증가하게 되는데, 어느 순간 i < 10을 만족하지
않는 순간이 오고 이 때가 되면 반복을 중단한다고 생각하면 된다.
for문은 중첩이 가능하다.
그러나 그다지 좋은 방법은 아니기 때문에 너무 많이 중첩하는 것은 지양하는 것이 좋다.
for (int i = 1; i < 10; i++){
실행문 1
for (int j = 1; j < 10; j++){
실행문2
}
실행문 3
}
중첩된 for문의 예시, 2~3번 중첩 정도는 할 수 있지만, 너무 많이 중첩하면 그만큼
최적화 효율이 떨어지니 지양할 것
무한 반복
while과 for문을 적당히 응용하면 무한 반복을 만들 수 있다.
while과 for문으로 무한 반복을 만드는 방법은 다음과 같다.
while(true){
실행문
}
for(;;){
실행문
}
while의 경우, 조건문에다가 그냥 true를 넣어버리면 말 그대로 무한히 반복하게 된다.
for문의 경우, 초기문, 조건문, 증감문을 그냥 빈값으로 넣어버리면 된다.
이러한 무한 반복은 왜쓸까 궁금할 수 도 있는데
저렇게 세팅했다고 무조건 무한반복을 하는 것은 아니고
무한 반복문을 중간에 탈출 할 수 있도록 코드를 구성하면 된다.
즉, 정확히 얼마나 반복해야하는지 알 수 없을 때 사용할 수 있다고 보면 된다.
이것에 대해선 다음 문단에서 다루겠다.
점프문(break, continue, goto)
break문은 가장 중요하고 또 자주사용될 문으로 반복문을 완전히 끝내는 역할을 한다.
continue는 이하의 내역을 스킵하고 다음 반복으로 넘어가는 역할을 하며
goto는 반복문 내에서 특정 명령을 수행하는 역할을 한다.
아래 break 예제를 보자
int a = 1;
while(true){
a++;
if (a > 10){
break;
}
}
a는 1로 시작하고 무한반복문 내에서 a값은 1씩 무한히 증가한다.
그러다가 a가 10을 넘어가는 순간 break가 실행되면서
반복문이 종료되게 된다.
이번엔 continue 예제를 보자
int a = 1;
int b = 1;
while(true){
a++;
if (a == 5){
continue;
}
b = a + b
}
a는 1씩 무한히 증가하고 b는 a값과 b 값을 더한만큼 증가한다.
그런데 a가 5가 될 때, continue가 실행된다.
이 경우, a가 5가 되었을 때, 바로 밑의 b = a + b가 실행되지 않고
다시 반복문의 첫 부분으로 돌아간다.
즉,
a + b는 아래 순서대로 진행이 된다.
2 + 1
3 + 3
4 + 6
6 + 10
7 + 16......
왼쪽 항은 1씩 증가하는데 여기서 5는 continue에 의해 스킵된 것이다.
이번엔 goto 예제를 보자
for(int i = 0; i < 10 ; i++){
if(i==5)
{
goto AA;
}
if(i==7)
{
goto BB;
}
}
AA:
Console.WriteLine("AA를 실행")
BB:
Console.WriteLine("BB를 실행")
i가 0에서 시작해, 1씩 증가하여 10이 될 때까지 반복하는 for문이다.
여기서 i가 5가 되는 순간, 반복문 밖의 AA를 실행하며
i가 7이 되는 순간, 반복문 밖의 BB를 실행하게 된다.