Unity 내배캠 TIL

C# 기초 문법 - 조건문, 배열, 구조체(2주차 2일)

오늘도즐겨 2024. 9. 23. 10:52

📕 문법강의-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();