C# 기초 문법 - 조건문, 배열, 구조체(2주차 2일)
📕 문법강의-2주차
1)조건문과 반복문
2)배열과 컬렉션
3)메서드와 구조체
조건문
if문 - esle if, else
if(조건식)
{
//조건식이 참일 경우 실행할 코드
}
👀 만약 if문 2개를 만들고, 둘다 참일경우,
출력되는 것은 마지막의 if문의 내부에서 진행되는 것만 출력한다.
switch문
switch (변수나 식)
{
case 값1:
// 값1이 나온 경우 실행되는 코드
break;
case 값2:
// 값2가 나온 경우 실행되는 코드
break;
// ...
default: //생략가능
// 모든 case문에 해당하지 않는 경우 실행되는 코드
break;
}
3항 연산자
if / else 문과 같다
# 삼항연산자 구조
(조건식) ? 참일 경우 값 : 거짓일 경우 값;
# 예시
int currentExp = 1200;
int requiredExp = 2000;
# 삼항 연산자
string result = (currentExp >= requiredExp) ? "레벨업 가능" : "레벨업 불가능";
Console.WriteLine(result);
# if else 문
if (currentExp >= requiredExp)
{
Console.WriteLine("레벨업 가능");
}
else
{
Console.WriteLine("레벨업 불가능");
}
반복문
for문 - 구조 -10번 반복하는 예시 // for문의 무한루프 for(;;)
for(int i = 0 ; i<10; i++)
{
console.WriteLine(i);
}
while문 - 조건식이 참(true)인 동안 반복하는 반복문
while (조건식)
{
// 조건식이 참인 경우 실행되는 코드
}
do-while문 - 최초에 한번 실행하고 조건을 확인 하는 반복문 - 팀프로젝트때, 랜덤함수에서 사용함.
do
{
// 조건식이 참인 경우 실행되는 코드
}
while (조건식);
foreach문 - 배열이나 컬렉션에 대한 반복문을 작성할때 사용
foreach (자료형 변수 in 배열 또는 컬렉션)
{
// 배열 또는 컬렉션의 모든 요소에 대해 반복적으로 실행되는 코드
}
#예시
string[] inventory = { "검", "방패", "활", "화살", "물약" };
foreach (string item in inventory)
{
Console.WriteLine(item);
}
Break & Continue
Break - 반복문을 중지시키는 역할
Continue - 현재 반복문을 중지하고 다음 반복문을 진행하는 역할
for (int i = 1; i <= 10; i++)
{
if (i % 3 == 0)
{
continue; // 3의 배수인 경우 다음 숫자로 넘어감
}
Console.WriteLine(i);
if (i == 7)
{
break; // 7이 출력된 이후에는 반복문을 빠져나감
}
//결과 = 1,2,4,5,7
}
배열
동일한 자료형의 값들이 연속적으로 저장되는 자료, 데이터의 묶음.
인덱스를 사용하여 요소에 접근가능
// 배열 선언
데이터_유형[] 배열_이름;
// 배열 초기화
배열_이름 = new 데이터_유형[크기];
// 배열을 한 줄로 선언 및 초기화
데이터_유형[] 배열_이름 = new 데이터_유형[크기];
// 배열 요소에 접근
배열_이름[인덱스] = 값;
값 = 배열_이름[인덱스];
다차원배열
// 2차원 배열의 선언과 초기화
int[,] array3 = new int[2, 3]; // 2행 3열의 int형 2차원 배열 선언
// 다차원 배열 초기화
array3[0, 0] = 1;
array3[0, 1] = 2;
array3[0, 2] = 3;
array3[1, 0] = 4;
array3[1, 1] = 5;
array3[1, 2] = 6;
// 선언과 함께 초기화
int[,] array2D = new int[3, 4] { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
3차원배열
// 3차원 배열의 선언과 초기화
int[,,] array3D = new int[2, 3, 4]
{
{ { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } },
{ { 13, 14, 15, 16 }, { 17, 18, 19, 20 }, { 21, 22, 23, 24 } }
};
다차원배열의 활용
int[,] map = new int[5, 5];
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
map[i, j] = i + j;
}
}
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
Console.Write(map[i, j] + " ");
}
Console.WriteLine();
}
게임 맵 구현
int[,] map = new int[5, 5]
{
{ 1, 1, 1, 1, 1 },
{ 1, 0, 0, 0, 1 },
{ 1, 0, 1, 0, 1 },
{ 1, 0, 0, 0, 1 },
{ 1, 1, 1, 1, 1 }
};
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
if (map[i, j] == 1)
{
Console.Write("■ ");
}
else
{
Console.Write("□ ");
}
}
Console.WriteLine();
}
컬렉션
컬렉션은 자료를 모아 놓은 데이터 구조를 의미함배열과 비슷한 자료구조사용을 위해 System.Collection.Generic 네임스페이스 추가 필요
컬렉션 - 리스트
가변적인 크기를 갖는 배열
리스트에 담을 자료형을 지정해줘야함
List<int> numbers = new List<int>(); // 빈 리스트 생성
numbers.Add(1); // 리스트에 데이터 추가
numbers.Add(2);
numbers.Add(3);
numbers.Remove(2); // 리스트에서 데이터 삭제
foreach(int number in numbers) // 리스트 데이터 출력
{
Console.WriteLine(number);
}
#IndexOf
//List에 해당요소가 위치한 index를 반환합니다.
//해당요소가 없을 경우 -1을 반환합니다
// List : "Kim", "Lee", "Jang", "Park"
int idx = lst.IndexOf("Kim");
// 결과 0
int idx = lst.IndexOf("Jang");
// 결과 2
int idx2 = lst.IndexOf("Han");
// 결과 -1
컬렉션 - 딕셔너리(Dictionary)
키와 값으로 구성된 데이터를 저장
중복된 키를 가질수 없으며, 키와 값의 쌍을 이루어 데이터를 저장함.
using System.Collections.Generic;
Dictionary<string, int> scores = new Dictionary<string, int>(); // 빈 딕셔너리 생성
scores.Add("Alice", 100); // 딕셔너리에 데이터 추가
scores.Add("Bob", 80);
scores.Add("Charlie", 90);
scores.Remove("Bob"); // 딕셔너리에서 데이터 삭제
foreach(KeyValuePair<string, int> pair in scores) // 딕셔너리 데이터 출력
{
Console.WriteLine(pair.Key + ": " + pair.Value);
}
컬렉션 - 스택(Stack)
후입선출(LIFO)구조를 가진 자료 구조
Push는 List의 Add와 같은 역할이지만, 먼저들어온 값이 가장 아래에 쌓이는 구조
Pop을 진행 했을경우 가장 위의 마지막에 들어온 값을 반환함.
Stack<int> stack1 = new Stack<int>(); // int형 Stack 선언
// Stack에 요소 추가
stack1.Push(1);
stack1.Push(2);
stack1.Push(3);
// Stack에서 요소 가져오기
int value = stack1.Pop(); // value = 3 (마지막에 추가된 요소)
컬렉션 - Queue
선입선출(FIFO)구조를 가진 자료구조
Enqueue는 List의 Add와 같은 역할, 제일 뒤에 넣겠다는 의미
Dequeue을 진행 했을경우, 가장 처음 들어온 값을 반환함
Queue<int> queue1 = new Queue<int>(); // int형 Queue 선언
// Queue에 요소 추가
queue1.Enqueue(1);
queue1.Enqueue(2);
queue1.Enqueue(3);
// Queue에서 요소 가져오기
int value = queue1.Dequeue(); // value = 1 (가장 먼저 추가된 요소)
컬렉션 - HashSet
List와 비슷하지만, 중복되지 않은 요소들로 이루어진 집합
HashSet<int> set1 = new HashSet<int>(); // int형 HashSet 선언
// HashSet에 요소 추가
set1.Add(1);
set1.Add(2);
set1.Add(3);
// HashSet에서 요소 가져오기
foreach (int element in set1)
{
Console.WriteLine(element);
}
메서드
일련의 코드 블록으로, 특정한 작업을 수행하기 위해 사용되는 독립적인 기능 단위
필요시 호출하여 실행됨.
👀 메서드의 역할
- 코드의 재사용성
- 모듈화
- 가독성과 유지보수성
- 코드의 중복제거
- 코드의 추상화
👀 메서드 오버로딩
같은 이름 다른 동작의 메서드 오버로딩
예제 - 메서드를 호출 할때 변수에 맞는 메서드가 호출됨
void PrintMessage(string message)
{
Console.WriteLine("Message: " + message);
}
void PrintMessage(int number)
{
Console.WriteLine("Number: " + number);
}
// 메서드 호출
PrintMessage("Hello, World!"); // 문자열 매개변수를 가진 메서드 호출
PrintMessage(10); // 정수 매개변수를 가진 메서드 호출
💡 오버로딩은 매개변수의 자료형과 값, 순서가 달라야한다
반환형은 의미가 없음
👀 재귀호출
메서드가 자기 자신을 호출하는 것을 의미
- 문제를 작은 부분으로 분할하여 해결하는 방법 중 하나로,
작은 부분의 해결 방법이 큰 문제의 해결 방법과 동일한 구조를 갖고 있는 경우에 적합!
- 호출 스택에 호출된 메서드의 정보를 순차적으로 쌓고,
메서드가 반환되면서 스택에서 순차적으로 제거되는 방식으로 동작!
void CountDown(int n)
{
if (n <= 0)
{
Console.WriteLine("Done");
}
else
{
Console.WriteLine(n);
CountDown(n - 1); // 자기 자신을 호출
}
}
// 메서드 호출
CountDown(5);
💡 주의할 점
- 종료 조건을 명확히 정의 해야함 (무한루프 / 스택 오버플로우 발생)
- 메모리 사용량이 더 크고 실행속도가 느릴 수 있으므로, 필요시에만 사용하는 것이 좋음.
구조체
사용자 정의 자료형의 시작 - 여러개의 데이터를 묶어서 하나의 사용자 정의 형식으로 만들기 위함.
- 값 형식이며, 데이터를 저장하고 필요기능을 제공 할 수 있음
- Struct키워드 사용해 선언함.
- 구조체의 멤버는 변수과 메서드로 구성될 수 있음.
👀 구조체의 사용
- 구조체의 멤버에는 접근할 때 . 연산자를 사용합니다.
Person person1;
person1.Name = "John";
person1.Age = 25;
person1.PrintInfo();