[사전캠프 4일차] 조건문의 활용
1. 오늘 학습 키워드
어제 조건문을 배웠으니, 오늘은 그 활용을 해볼 예정이다.
게임은 아주 많은 조건확인과 선택의 연속이다. 그러니, 단순히 어떻게 쓰는지 아는 것만으로는 부족하다.
내가 만들고 싶은 구성을 조직하고, 그에 따라 움직일 수 있는 코드를 마음껏 만들 수 있어야 완전한 습득이 된 것일 테니, 우선 간단한 것부터 만들어보자.
2. 오늘 학습 한 내용을 나만의 언어로 정리하기
step 1. 숫자를 두 번 입력받아서, 둘 다 숫자인지 확인하도록 만들자.
조건 1. 데이터 입력을 두 번 할 수 있어야 한다.
조건 2. 입력된 두 데이터가 숫자인지 판별할 수 있어야 한다.
일단 가볍게 시작해 보기로 하자. 단순하게 두 데이터가 모두 숫자면 통과, 숫자가 아닌 값이 있으면 오류가 있다고 알려주는 것을 목표로 한다.
코드 1.
Console.WriteLine("첫 번째 수를 입력해 주세요"); //첫 번째 데이터를 입력할 수 있도록, 먼저 상위에 입력을 요청하는 글을 올린다.
string first = Console.ReadLine(); //첫 번째 데이터를 입력할 칸
Console.WriteLine("두 번째 수를 입력해 주세요.");//두 번째 데이터를 입력할 수 있도록 요청
string second = Console.ReadLine(); //두 번째 데이터를 입력할 칸
int one;
int two;
bool a;
bool b;
a = int.TryParse(first, out one);
b = int.TryParse(second, out two);
//입력된 수가 정수인지 확인하기 위한 TryParse(); 함수. a와 b가 true가 된다면 입력된 값은 숫자(정수)이다.
// bool a = int.TryParse(first, out one);
// bool b = int.TryParse(second, out two);
// 로 작성하는 쪽이 더 간단하게 보인다.
if (a && b) // &&: a와 b 둘 다 충족해야 한다. 특별한 선언(==true/false)이 없으므로, 둘 다 true 일 때만 조건을 충족할 수 있다.
{
Console.WriteLine("두 데이터는 모두 숫자입니다.");
//둘 다 숫자라면 출력될 내용이다.
}
else
{
Console.WriteLine("숫자가 아닌 값이 있습니다.");
//둘 중 하나라도 숫자가 아니라면 표기해 줄 오류 선언이다.
}
결과:


원하는 대로 작동하는 것을 확인! 다음 단계로 넘어가자.
step 2. 숫자를 두 번 입력받아서, 숫자인 데이터가 하나인지, 둘인지, 없는지 확인한다.
조건 1. 하나만이라도 숫자일 때 "하나의 데이터만이 숫자입니다."라고 작동할 조건 실행문 작성.
조건 2. 둘 다 숫자일 때, 조건 1에 해당하는 내용이 출력되지 않아야 한다.
그럼 이 조건을 조금 더 세분화해보고 싶어진다.
두 가지의 수를 입력했을 때, 하나만이라도 숫자라면 '하나의 데이터'가 숫자임을 알려주고, 둘 다 숫자가 아니라면 '두 데이터 모두 숫자가 아니다'라고 알려줬으면 한다. 그럼 목적에 맞춰 코드를 수정해 볼 것이다.
코드 2.
//위에서 동일한 코드들은 작성하지 않고, 변경된 if 함수만 작성했다.
if (a && b)
{
Console.WriteLine("두 데이터는 모두 숫자입니다.");
//둘 다 같을 경우, 두 데이터 모두 숫자라는 글이 출력된다.
}
else if (a || b)
{
Console.WriteLine("하나의 데이터만 숫자입니다.");
//둘 다 true가 아니라면, 이 두 번째 조건을 확인한다.
//둘 중 하나라도 true값이라면 해당 코드를 실행한다.
}
else
{
Console.WriteLine("두 데이터 모두 숫자가 아닙니다.");
//둘 다 아닐 경우, 둘 다 숫자가 아니라는 이 코드를 실행한다.
}
결과



이 코드도 정상적으로 작동하는 것을 확인했다. 단순한 함수 연계이기 때문에 어렵지 않았다.
코드 2에서 주의해야 할 것은, 둘 다 충족해야 하는 &&가 가장 첫 번째 조건, 둘 중 하나만 충족해야 하는 ||를 두 번째 조건으로 넣어야 한다는 점이다.
3일 차에 적어놨듯, if 조건문은 위에서부터 차례대로 계산하기 때문에, 두 조건 및 실행문의 위치가 바뀔 경우, 두 데이터 모두 숫자임에도 하나의 데이터만 숫자라는 내용이 출력된다. 그 예시가 바로 아래의 이미지이다.
잘못된 코드
//해당 코드는 일부러 우선순위를 뒤바꾼 코드이다. 숫자 두 개를 입력해도 원하는 대로 출력이 되지 않는다.
if (a || b)
{
Console.WriteLine("하나의 데이터만 숫자입니다.");
//둘 중 하나만이라도 작동되는 조건이다. 즉, a와 b 둘 다 true 값이 나와도 해당 조건문이 작동한다.
}
else if (a && b)
{
Console.WriteLine("두 데이터는 모두 숫자입니다.");
//이미 "하나의 데이터만 숫자"라는 조건이 실행되었으므로, 이 조건은 실행되지 않는다.
}
else
{
Console.WriteLine("두 데이터 모두 숫자가 아닙니다.");
//둘 다 숫자가 아닐 경우에는, 여전히 이 내용이 실행된다.
}

이미지처럼, 둘 다 숫자임에도 '하나의 데이터만 숫자'라는 문구가 출력된다. 다시금 조건문의 순서의 중요성을 확인할 수 있다.
step 3. 입력된 두 수의 크기를 비교한다.
조건 1. 두 수가 같을 경우 출력할 내용이 필요하다.
조건 2. 두 수가 다를 경우, 그 크기를 비교한 내용을 출력한다.
두 수가 숫자인지 아닌지는 판별할 수 있다. 하지만 판별만으로는 부족하다. 이어서 두 수의 크기를 알아서 비교해서 어떤 수가 더 큰지 말해주면 좋을 것 같다.
if문 속에 또 다른 if문을 넣어도 될 것 같고, if의 조건을 더 추가해도 될 것 같다.
step 2의 코드를 재응용해서 내용을 추가해 보도록 하자.
그리고 두 개의 방법이 다 괜찮은지, 한 가지 방법만 가능할지도 확인해 보겠다.
우선, if문의 조건을 추가하는 방식이다.
코드 3-1.
if (a && b && one> two)
{
Console.WriteLine("첫 번째 수가 두 번째 수보다 큽니다.");
//a와 b가 모두 true값이고, 첫 번째 수로 지정한 one이 두 번째 수로 지정한 two보다 클 때 작동한다.
}
else if (a && b && one == two)
{
Console.WriteLine("첫 번째 수와 두 번째 수가 같습니다.");
//a와 b가 모두 true값이고, 첫 번째 수로 지정한 one이 두 번째 수로 지정한 two와 같을 때 작동한다.
}
else if (a && b && one < two)
{
Console.WriteLine("첫 번째 수가 두 번째 수보다 작습니다.");
//a와 b가 모두 true값이고, 첫 번째 수로 지정한 one이 두 번째 수로 지정한 two보다 작을 때 작동한다.
}
//이하는 코드 2와 같다.
else if (a || b)
{
Console.WriteLine("하나의 데이터만 숫자입니다.");
}
else
{
Console.WriteLine("두 데이터 모두 숫자가 아닙니다.");
}
결과





다행히 해당 코드가 오류 하나 없이 정상작동한 것을 확인했다. 하지만 이렇게 하니까 else if가 주렁주렁 달려 나온다.
지금은 그렇게 긴 코드가 아니지만, a&&b&& 부분을 반복해서 쳐두어야 하고, a와 b가 둘 다 숫자여야 한다는 것은 동일한 조건인데 한 번에 처리할 수도 있을 것 같다.
그럼 if 조건문에 또 다른 if 조건문을 넣어보는 건 어떨까. (어느 쪽이 쉬운 지는 한 번 해봐야 알 수 있을 것 같다.)
코드 3-2.
if (a && b)
{ //첫 번째 수와 두 번째 수가 이미 모두 정수임을 확인하고, 그 안에서 다시 새로운 조건문을 세운다.
if (one > two)
{
Console.WriteLine("첫 번째 수가 두 번째 수보다 큽니다.");
}
else if (one == two)
{
Console.WriteLine("첫 번째 수와 두 번째 수가 같습니다.");
}
else
{
Console.WriteLine("첫 번째 수가 두 번째 수보다 작습니다.");
}
}
else if (a || b)
{
Console.WriteLine("하나의 데이터만 숫자입니다.");
}
else
{
Console.WriteLine("두 데이터 모두 숫자가 아닙니다.");
}



다행히 이렇게 써도 정상적으로 작동한다. if 조건문 안에 if조건문이 추가로 들어가자, 오히려 더 깔끔해 보이는 것 같다.
사실 지금은 큰 조건이 많지 않아서 잘 못 느낄 수도 있다.
하지만 저렇게 하나의 if 조건문으로 묶는 것이 일종의 분류작업이라고 생각한다면 어떨까.
코드 3-1. 와 코드 3-2. 의 차이를 글로 써서 비교하자면 이런 느낌이다.
코드 3-1.
-둘 다 정수이고 숫자 1이 2보다 크다
-둘 다 정수이고 숫자 1이 2랑 같다
-둘 다 정수이고 숫자 1이 2보다 작다
-둘 중 하나가 정수가 아니다
-둘 다 정수가 아니다
코드 3-2.
-둘 다 정수이다.
>숫자 1이 2보다 크다
>숫자 1이 2랑 같다.
>숫자 1이 2보다 작다.
-둘 중 하나가 정수가 아니다.
-둘 다 정수가 아니다.
길이는 비슷해보이지만, 결정적으로 차이가 있다. 같은 조건끼리 묶여있으니 좀 더 정리가 된다. 문서를 정리할 때, 종이를 차례대로 넣는 것도 중요하지만, 같은 작업의 서류는 같은 폴더에 넣어두는 게 찾기 더 쉬운 것과 같다.
코드 3-1. 의 경우 매번 이 두 수가 정수인지 확인하는 작업을 거쳐야하지만, 코드 3-2. 는 이미 선제조건으로 두 수가 정수임을 확인했으니 수의 비교만 하면 되어서 더 효율적이다.
또한, 3-1. 의 경우 연속된 else if의 반복으로 추가적으로 코드를 넣을 때 어디에 끼워둬도 좋을지 금방 알 수 없지만, 코드 3-2. 의 방식이라면 우선 같은 선제조건을 찾아서 그 속에 있는 코드들만 확인하고 정리하면 된다.
결론: 가능하면, 같은 선제조건을 가진 조건은 묶어서 그 안에 새로운 if 조건문을 작성하자. 스크립트에서는 같은 단계의 코드끼리 들여쓰기가 맞춰지므로 어렵지 않다.
Step4. 번외편! 조건문 속에 조건문 넣고, 입력한 데이터도 섞어넣기.
조건 1. 마지막 결과문에서 입력한 숫자가 나타나게 만들기.
조건 2. 둘 중 하나만 숫자일 때, 숫자가 아닌 데이터를 표기하고 "해당 데이터"가 숫자가 아니라고 나타나게 만들기.
이제 조건문 안에 새 조건문도 넣을 수 있고, 3일차에 문자열 속에 내가 넣은 데이터를 집어 넣는 것도 해봤다.
그러니 이제 이걸 전부 섞어서 한 번 코드를 짜볼 것이다. 숫자 A는 B보다 큽니다. 문자 T는 숫자가 아닙니다. 같은 내용이 그때 그때 출력되면 성공이다.
코드 4.
//참고. 코드 1. 에서 input값을 처음 입력값은 first, 두번째 입력값은 second로 설정했다.
if (a && b)
{
if (one > two)
{
Console.WriteLine(first+"(이)가"+second+"보다 큽니다.");
//단순히 첫번째 수라고 문자로 지정하지 않고, first와 second로 명명한 string 값을 이용해 창에 출력되도록 만든다.
}
else if (one == two)
{
Console.WriteLine(first+"(와)과"+second+"(은)는 같은 수 입니다.");
}
else
{
Console.WriteLine(first+"(이)가"+second+"보다 작습니다.");
}
}
else if (a || b)
{
if (a==false)
{
Console.WriteLine(first + "(은)는 숫자가 아니지만" + second + "(은)는 숫자입니다.");
}
else
{
Console.WriteLine(first + "(은)는 숫자이지만" + second + "(은)는 숫자가 아닙니다.");
}
//둘 중 하나는 false일 때 작동하는 조건문이었으므로, a의 값이 거짓일 경우를 내부에서 1번조건으로 걸었다. 그럼 그 외의 경우는 자동으로 b가 false 값일 경우가 된다.
}
else
{
Console.WriteLine(first + "(와)과" + second + "모두 숫자가 아닙니다.");
}
결과



다행히 둘 다 정상 작동하는 것을 확인할 수 있다.
다만 데이터 값을 직접 넣을 때, 자연스럽게 넣기 위해 조사부분을 확인하도록 할 것.
가끔 게임에서도 볼 수 있는, 치명적이지 않지만 눈에 거슬리는 오류 중 하나이므로, 신경쓰는 쪽이 좋다.
(가령, 닉네임이 '강산'이고 이것이 시스템 채팅으로 올라올 때,
'[system] 강산이(가) 보스를 물리쳤습니다.'
로 나온다면 눈에 거슬리지 않지만,
'[system] 강산가 보스를 물리쳤습니다.'
라고 나오면 눈에 거슬린다. 별 것 아니지만, 상당히 신경쓰인다.)
3. 학습하며 겪었던 문제점 & 에러
오늘은 진행하면서 오류가 없었다. 놀랍게도, 정말 없었다.
그래서 일부러 만든 오류 코드가 step2에 적은 잘못된 코드이다.
그러니 오늘의 3번 문항은, 내용 요약으로 마무리 하려고 한다.
내용 요약
1. if 문은 위에서부터 차례대로 프로그램이 읽어들인다.
2. if ~ else 까지, 모든 조건들 중 단 하나만 실행된다.
=하나가 실행되면 그 뒤에 달린 조건들은 전부 무시된다.
3. 조건에 bool값이 들어갈 경우, 특별한 선언이 없다면 해당값이 true일 때, 라고 본다.
4. 같은 선제조건을 쓴다면, 그 안에 새로운 조건문을 만들자.
=큰 조건별로 분류한 뒤, 그 안에 작은 조건을 집어넣자.
5. 문자열을 조합하여 쓸 경우, 조사를 신경써보자.
4. 내일 학습할 것은 무엇인지
내일은 switch~case를 이용해, 선택지를 만들어볼 것이다.
그리고 그 switch~case를 if문으로도 만들어볼 예정이다.
두 조건문의 차이점은 3일차에도 가볍게 보고 넘어갔지만, 내일의 주체는 switch~case 문이다.