조건문의 기본 형태는 다음과 같다.
if (조건1)
{
// 조건1 에 해당될 시 실행할 내용
}
else if (조건2)
{
// 조건2에 해당될 시 실행할 내용
}
else if ... // 원하는 조건만큼 else if 구문 작성
else
{
// 모든 경우에 해당 안되는 경우 실행할 내용
}
❓ if문 여러개 사용 VS if - else if - else 사용
if문을 여러개 쓴 경우 특정 조건이 만족되었을 때 뒤를 보고 싶지 않아도 다 확인하는데 반해 else if로 분기를 나누게 되면 특정 케이스의 조건이 만족되면 뒤의 다른 케이스들은 보지 않는다는 차이가 있다.
int choice = 0; // 0: 가위, 1: 바위, 2: 보
// if문만 사용한 경우
// 만약 choice = 0 인 경우 바위와 보인지 확인할 필요가 없음에도 밑에 if문들을 모두 실행한다.
if (choice == 0) Console.WriteLine("가위");
if (choice == 1) Console.WriteLine("바위");
if (choice == 2) Console.WriteLine("보");
// if - else if - else 사용
// 만약 choice = 0 인 경우 밑의 바위와 보는 실행하지 않는다.
if (choice == 0) Console.WriteLine("가위");
else if (choice == 1) Console.WriteLine("바위");
else Console.WriteLine("보");
❓사용 이유❓
- 반복되는 것에 대해 가독성을 늘리기 위함
- if-else문 보다는 좀 더 한정적인 상황에서 사용되며, 값에 따른 간단한 분기문으로 주로 사용
🔸 구조
switch - case - break
switch문 안에는 case를 확인할 문자열 또는 정수를 넣는다. break문은 앞의 내용을 실행 후 나간다는 의미를 가진다. default는 조건문에서 else와 유사한데 앞의 case 문들에 걸리지 않으면 이곳을 실행하게 된다.
switch (choice)
{ // switch - case - break
case 0:
Console.WriteLine("가위");
break;
case 1:
Console.WriteLine("바위");
break;
case 2:
Console.WriteLine("보");
break;
default:
Console.WriteLine("다 실패");
break;
}
짧은 조건문을 확인하고 한 변수에 값을 대입하게 될 때 if-else문을 한줄로 간단히 표현할 수 있게 해준다.
표기는 다음과 같이 한다.
변수타입 변수명 = 조건 ? true인 경우 : false인 경우;
다음의 짝수 홀수 판별기 예제를 살펴보자. 본 예제에서는 bool 값의 변수에 삼항 연산자를 사용해 if-else문을 간결하게 표현했다. (boolean 외에도 다양한 데이터 타입에 활용 가능하다!)
int number = 12;
bool isPair;
// if-else문
if (number % 2 == 0) isPair = true;
else isPair = false;
// 삼항 연산자
bool isPair2 = (number % 2) == 0 ? true : false;
while (조건)
{
반복할 내용
}
while 안의 조건이 만족되면 다음 줄을 실행한다. while 문 내의 코드를 실행 한 후 다시 조건을 체크하는 식으로 반복문이 실행된다.
while문에서 가장 중요하게 고려해야할 것은 끝나는 조건을 만족할 수 있는가이다. while 안의 조건이 만족될 수 없는 경우 무한 loop에 빠지게 되고 이는 프로그램의 비정상적 종료를 초래한다. (프로그램 실행했는데 무한 loop에 빠지면 강제 종료해야하기에..😂 while을 쓸 때는 항상 탈출 가능한지 확인하도록 하자!)
int count = 5;
while (count > 0)
{
Console.WriteLine("Hello World");
count--; // 이 줄이 없으면 무한 loop에 빠진다!
}
do
{
반복할 내용 (조건 관계 없이 1회는 무조건 실행)
}
while (조건);
조건을 확인하기 전 무조건 한 번 실행한 후 while문을 확인하여 계속 실행할 지 말지에 대한 여부를 결정한다.
string answer;
do
{
Console.WriteLine("종료하시겠습니까? (y/n) : ");
answer = Console.ReadLine();
}
while (answer != "y"); // y 입력 시 while문 탈출
Console.WriteLine("종료");
for(초기화식; 조건식; 반복식) {}
for(int i = 0; i < 5; i++)
{
Console.WriteLine("Hello~");
}
for문은 index로 데이터에 접근하고 끝을 직접 지정하였다. foreach문은 주어진 iterable-item를 순회하며 끝에 도달했을 때 자동으로 반복을 종료하는 반복문이다.
foreach (데이터타입 변수명 in iterable-item) {}
해당 예제 외에도 string, list 등 다양한 iterable-item 들을 순회할 수 있다.
// 예제 1) 1차원 배열 순회
int[] arr = new int[3] { 1, 2, 3 };
foreach(int num in arr)
{
Console.WriteLine(num);
}
// 결과
// 1
// 2
// 3
// 예제 2) 2차원 배열 순회
int [,] 2dArray = new int [2, 3]
{
{1, 2, 3},
{4, 5, 6}
};
foreach(int num in 2dArray)
{
Console.WriteLine(num);
}
// 결과
// 1
// 2
// 3
// 4
// 5
// 6
반복문에서 특정 조건을 만족 시 탈출하고 싶은 경우가 있다. 이 경우 break 또는 continue가 사용된다.
- break: 바로 반복문 탈출
- continue: 반복문의 해당 차례 뛰어넘고, 다음 루프로
코드를 재사용하고자 묶는 방법이라고 할 수 있다. 함수는 무조건 클래스 안에서 정의되어야 하며 다음의 형태로 선언한다.
한정자 반환형식 함수명(매개변수 목록)
// 덧셈 함수
static int Add(int a, int b) // a,b는 함수 내부에서만 유효
{
return a + b;
}
static void AddOne(int number)
{
number++;
}
int result = Program.Add(4,5);
int a = 0;
Program.AddOne(a); // 출력 결과 : 0 (함수랑 동일한 a가 아님!)
System.Console.WriteLine(a);
함수는 입력으로 넘기는 것(인자)이 중요하다. 이때 넘기는 값을 복사 또는 참조 두 가지 방식으로 넘길 수 있다. 기본적으로 명시하지 않으면 복사로 넘기게 된다. 복사는 진짜 a가 아닌, a가 들고 있는 값을 넘기는 것이다. 즉, a를 1 증가 시켜도, 실제 a가 들고 있는 메모리와는 다른 것이다. 만약 진짜 a를 변경하고 싶다면 ref를 사용해야한다.
AddOne(ref int number);
Program.AddOne(ref a);
복사는 실제 값이 아니라 그 안의 값 자체만 넘기는 것이고, 참조는 진짜 메모리에 해당하는 것 자체를 넘겨주는 것이다. 일반적으로는 ref 대신 return하고 대입하는 방식의 함수를 사용하는 것을 추천한다.
static int AddOne2(int number) return number++;
a = Program.AddOne2(a); // 이런 식으로 a에 return 값을 대입하는 방식!
만약 결과만 테스트 하고 싶은 경우가 있을 수 있는데, 이 경우 ref가 문제가 될 수 있다. 한편, ref를 꼭 사용해야하는 케이스도 있는데 다음을 살펴보자.
static void Swap(ref int a, ref int b)
{
int temp = a;
a = b;
b = temp;
}
// swap
int num1 = 1;
int num2 = 2;
Program.Swap(ref num1, ref num2);
오버로딩은 함수 이름을 재사용하는 것이다. (오버라이딩과 헷갈릴 수 있는데, 오버라이딩 같은 경우에는 자식에서 함수를 다른 방식으로 사용하기 위해 재정의하는 것! (다형성과 관련))
함수에 같은 이름을 사용한다면 매개변수의 타입과 개수를 다르게 해야한다!
반환 형식은 딱히 영향을 주지 않고, 형식과 개수에 초점을 둔다는 것을 명심하자.
int a, int b => float a, float b 이건 ok!
static int Add(int a, int b, int c = 0)
다음과 같이 매개변수에 값을 대입하는 방식으로 작성하면, option의 개념이 된다. 만약, 유저가 해당 함수를 호출할 때 2개의 매개변수만 넣으면 c는 자동으로 0이 된다. 이 방식은 매개변수가 굉장히 복잡해졌을 때 주로 사용이 된다.
순서를 잘 맞춰야 하고, 다음과 같이 특정 값만 따로 지정해서 넣는 것이 가능하다!
Program.Add(1,2, d:2.0f);