조건문 : 특정 조건의 결과에 따라 프로그램의 제어 흐름을 변경함.
if/else문
if문 : 조건식의 결과에 따라 실행 여부 결정.
else문 : if문의 조건식이 거짓일경우 실행.
else if문 : if문의 조건식이 거짓일 때, 새로운 조건식 사용.
if (조건식1) { // 조건식1이 참일 경우 실행할 코드 } else if (조건식2) { // 조건식2가 참일 경우 실행할 코드 } else { // 모든 조건식이 거짓일 경우 실행할 코드 }
switch 문
switch : 변수나 식의 결과에 따라 다른 코드블록을 실행.
case : 변수나 식의 결과에 따라 실행할 코드를 지정.
break : switch문을 탈출시켜주는 역할.
switch (변수나 식) { case 값1: // 값1이 나온 경우 실행되는 코드 break; case 값2: // 값2가 나온 경우 실행되는 코드 break; // ... default: // 모든 case문에 해당하지 않는 경우 실행되는 코드 break; }
3항 연산자 : if 문의 간단한 형태로, 조건식의 결과에 따라 두 값을 선택하는 연산자.
(조건식) ? 참일 경우 값 : 거짓일 경우 값;
반복문 : 특정 조건을 만족할 때 까지 계속 반복하여 실행하는 문장.
for문 : 초기식, 조건식, 증감식을 사용.
초기식 - 반복문이 시작될 때 단 한 번 실행
조건식 - 참(true)인 경우 반복문이 계속 실행
증감식 - 반복문이 실행될 때마다 실행되는 식
for (초기식; 조건식; 증감식) { // 조건식이 참인 경우 실행되는 코드 }
while문 : 조건식이 참(true)인 동안 코드를 반복 실행.
while (조건식) { // 조건식이 참인 경우 실행되는 코드 }
do - while문 : 코드블록을 무조건 한번은 실행하고 조건을 검사하여 반복.
do { // 조건식이 참인 경우 실행되는 코드 } while (조건식);
foreach문 : 배열이나 컬렉션에 대한 반복문을 작성할 때 사용.
foreach (자료형 변수 in 배열 또는 컬렉션) { // 배열 또는 컬렉션의 모든 요소에 대해 반복적으로 실행되는 코드 }
배열 : 동일한 자료형의 값들을 모아놓은 데이터 집합.
데이터_유형[] 배열_이름; // 배열 선언 배열_이름 = new 데이터_유형[크기]; // 배열 초기화 데이터_유형[] 배열_이름 = new 데이터_유형[크기]; // 배열을 한 줄로 선언 및 초기화 배열_이름[인덱스] = 값; 값 = 배열_이름[인덱스]; // 배열 요소에 접근
컬렉션 : C#에서 지원하는 자료구조 클래스, 애플리케이션의 요구가 변경됨에 따라 작업하는 개체 그룹이 동적으로 확장되거나 축소될 수 있음.
메서드(Method) : 일련의 코드 블록으로, 특정한 작업을 수행하기 위해 사용되는 독립적인 기능 단위.
메서드 선언
[접근 제한자] [리턴 타입] [메서드 이름]([매개변수]) { // 메서드 실행 코드 }
접근제한자 : 메서드에 접근할 수 있는 범위 지정(public, private, protected 등)
리턴 타입 : 반환값의 데이터 타입 지정, 반환값이 없으면 void사용
메서드 이름: 메서드를 호출할 때 사용하는 이름
매개변수 : 메서드에 전달되는 입력 값
실행 코드: 중괄호({})안에서 수행하는 작업을 구현하는 코드
메서드 호출 방법
[메서드 이름]([전달할 매개변수]);
매개변수와 반환값
메서드 오버로딩
동일한 이름의 메서드를 다양한 매개변수 목록으로 다중 정의.
동일한 이름으로 매개변수의 개수, 타입, 순서를 다르게 정의하여 호출 시 매개변수의 형태에 따라 선택되도록 함.
재귀호출
메서드가 자기 자신을 호출하는 것, 문제를 작은 부분으로 분할하여 해결하는 방법 중 하나.
public int Factorial(int num) //재귀호출로 팩토리얼 구현 { int result = 0; if(num == 1) { result = 1; } else { result = num * Factorial(num - 1); } return result; }
구조체 : 여러 개의 데이터를 묶어서 하나의 사용자 정의 형식으로 만들기 위한 방법,
값 형식(Value Type)으로 분류되며, 데이터를 저장하고 필요한 기능을 제공.
struct Person { public string Name; public int Age; public void PrintInfo() { Console.WriteLine($"Name: {Name}, Age: {Age}"); } }
Person person1; person1.Name = "gildong"; person1.Age = 17; person1.PrintInfo();
중첩조건문 : 하나의 조건문 안에 또 다른 조건문이 들어있는 형태.
if (조건) { if (조건식1) { // 조건에 부합하고, 조건식1이 참일 경우 실행할 코드 } else if (조건식2) { // 조건에 부합하고, 조건식2가 참일 경우 실행할 코드 } else { // 조건에 부합하고, 모든 조건식이 거짓일 경우 실행할 코드 } } ...
for문과 while문
for문 - 반복횟수가 직관적, 가독성이 좋음.
while문 - 반복조건에 따라 실행횟수가 유동적, 코드가 간결할 수 있음.
중첩 반복문 : 반복문도 중첩해서 사용할 수 있음.
for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { Console.WriteLine("i: {0}, j: {1}", i, j); } //총 i x j 번 실행. }
break는 반복문을 중지시키는 역할.
continue는 현재 반복을 중지하고 다음 반복을 진행하는 역할.
배열은 선언된 크기만큼 공간을 할당받음.
컬렉션은 object 형식을 사용하여 데이터를 관리하기 때문에, 박싱(Boxing)과 언방식(Unboxing)이 발생.
컬렉션을 많이 사용하게 되면, 프로그램의 성능 저하가 옴.
배열과 리스트
리스트는 동적으로 크기를 조정할 수 있어 배열과는 다르게 유연한 데이터 구조를 구현가능.
하지만 리스트를 무분별하게 사용하는 것은 좋지 않은 습관.
1.메모리 사용량 증가 - 배열보다 많은 메모리 사용.
2.데이터 접근 시간 증가 - 연결 리스트로 구현되기 때문에 데이터접근이 배열보다 느림.
3.코드 복잡도 증가 - 리스트를 사용할 때 추가 삭제등의 작업을 처리하는 코드를 작성해야되므로 가독성과 유지보수성이 떨어짐.
재귀 호출의 활용과 주의점
종료 조건을 명확히 정의해야 함, 종료조건을 만족하지 못하면 스택 오버플로우 등의 오류가 발생할 수 있음.
메모리 사용량이 크고 실행속도가 느릴 수 있으므로, 필요한 경우에만 사용.
매서드 활용사례
일단 필요한 변수를 선언합니다.
static char[] arr = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
static int player = 1;
static int choice;
static int flag = 0;
do while문으로 화면에 표시할 보드와 제목 등을 만듭니다.
static void title()
{
Console.Clear();
Console.WriteLine("플레이어 1: X 와 플레이어 2: O");
Console.WriteLine();
if (player == 1)
{
Console.WriteLine("플레이어 1의 차례");
}
else
{
Console.WriteLine("플레이어 2의 차례");
}
Console.WriteLine();
}
static void setboard()
{
// Line 1
Console.WriteLine(" | | |");
Console.WriteLine(" {0} | {1} | {2} |", arr[1], arr[2], arr[3]);
Console.WriteLine("_____|_____|_____|");
// Line 2
Console.WriteLine(" | | |");
Console.WriteLine(" {0} | {1} | {2} |", arr[4], arr[5], arr[6]);
Console.WriteLine("_____|_____|_____|");
// Line 3
Console.WriteLine(" | | |");
Console.WriteLine(" {0} | {1} | {2} |", arr[7], arr[8], arr[9]);
Console.WriteLine("_____|_____|_____|");
}
그다음 플레이어가 이겼는지 체크하는 checkwin함수를 만듭니다.
static int CheckWin()
{
// 가로 승리 조건
if (arr[1] == arr[2] && arr[2] == arr[3])
{
return 1;
}
else if (arr[4] == arr[5] && arr[5] == arr[6])
{
return 1;
}
else if (arr[7] == arr[8] && arr[8] == arr[9])
{
return 1;
}
// 세로 승리 조건
else if (arr[1] == arr[4] && arr[4] == arr[7])
{
return 1;
}
else if (arr[2] == arr[5] && arr[5] == arr[8])
{
return 1;
}
else if (arr[3] == arr[6] && arr[6] == arr[9])
{
return 1;
}
// 대각선 승리조건
else if (arr[1] == arr[5] && arr[5] == arr[9])
{
return 1;
}
else if (arr[3] == arr[5] && arr[5] == arr[7])
{
return 1;
}
// 무승부
else if (arr[1] != '1' && arr[2] != '2' && arr[3] != '3' && arr[4] != '4' && arr[5] != '5' && arr[6] != '6' &&
arr[7] != '7' && arr[8] != '8' && arr[9] != '9')
{
return -1;
}
else { return 0; }
}
마지막으로 메인함수에서 do-while문으로 함수를 계속 불러주면서 게임을 실행합니다.
string line = Console.ReadLine();
if (int.TryParse(line, out choice))
위 코드로 입력을 받아서 조건문으로 다른 값이 들어왔을 때 걸러주는 작업을 하였습니다.
중첩반복문으로 조건을 추가해서
if (choice > 0 && choice < 10)
if (arr[choice] != 'X' && arr[choice] != 'O')
arr[choice] = (player % 2 == 0) ? 'O' : 'X';
player++;
게임을 진행되게 하고
flag = CheckWin();
flag 변수로 게임이 끝났는지 판단합니다.
실행결과 잘 되는것을 확인했습니다.
09:00 ~ 09:30 : 팀원 간 인사 및 하루 계획 작성
09:30 ~ 14:00 : 지급 받은 강의 복습
12:00 ~ : 프로그래밍 기초 주차 개인과제 발제
12시-1시: 점심식사
14:00 ~ 18:00 : 지급 받은 강의 복습
6시-7시: 저녁식사
19:00 ~ 20:00 : 지급 받은 강의 복습
20:00 ~ 20:30 : 6조 회의
20:30 ~ 21:00 : TIL,마무리 회고 진행