본문 바로가기
🌐 유니티 (Unity)

Day 8 - C# 문법(조건문, 반복문, 배열, 딕셔너리, 메서드, 오버로딩, 구조체)

by shin0707 2024. 4. 23.
728x90

  • 주제

1. 조건문(중첩 조건문, switch, 3항 연산자)

2. 반복문(for vs. while, do-while, foreach, 이차원 반복문, break & continue)

3. 배열(1차원 배열, 다차원 배열)

4. 컬렉션(List, Dictionary)

5. 메서드(선언 및 호출, 매개변수와 반환값)

6. 오버로딩

7. 구조체


  • 공부내용

1. 조건문

1-1. 중첩 조건문

if절 안에 다른 if절

int itemLevel = 3; // 아이템 레벨
string itemType = "Weapon"; // 아이템 종류

if (itemType == "Weapon")
{
    if (itemLevel == 1)
    {
        // 레벨 1 무기 효과
        Console.WriteLine("공격력이 10 증가했습니다.");
    }
    else if (itemLevel == 2)
    {
        // 레벨 2 무기 효과
        Console.WriteLine("공격력이 20 증가했습니다.");
    }
    else
    {
        // 그 외 무기 레벨
        Console.WriteLine("잘못된 아이템 레벨입니다.");
    }
}
else
{
    // 그 외 아이템 종류
    Console.WriteLine("잘못된 아이템 종류입니다.");
}

 

1-2. switch

(카드 뒤집기 게임에서, 매칭에 성공한 카드 번호(값)에 따라 다른 값을 도출하는데 쓰였음)

자료형 변수 = Console.ReadLine(); //사용자가 입력한 값을 변수에 저장

switch (변수나 식)
{
    case 값1:
        // 값1이 나온 경우 실행되는 코드
        break;
    case 값2:
        // 값2가 나온 경우 실행되는 코드
        break;
    // ...
    default:
        // 모든 case문에 해당하지 않는 경우 실행되는 코드
        break;
}

 

1-3. 3항 연산자

if문에 작성하면 긴 코드(if... else...)를 간단하게 바꿀 수 있는 연산자.

다만, 출력 가능한 내용은 2가지 밖에 없음.

// A가 B보다 크거나 같으면, "레벨업 가능" 출력
// A가 B보다 작으면, "레벨업 불가능" 출력
string result = (A >= B) ? "레벨업 가능" : "레벨업 불가능";
Console.WriteLine(result);

2. 반복문

2-1. for vs. while

-for문

(반복 조건들을 한 눈에 확인 가능)

for (int i = 0; i < 3; i++) //for (초기식; 조건식; 증감식)
{
  Console.WriteLine(i);      //조건식이 참인 경우 실행되는 코드
}

//초기식: 반복문이 시작될 때 단 한 번 실행
//조건식: 반복분이 실행될 때마다 평가, 참(true)인 경우 계속 실행
//증감식: 반복문이 실행될 때마다 실행

 

-while문

(반복 조건에 따라 for문 보다 코드가 더 간결해질 수 있음)

int i = 0;                //초기식
while (i < 3)            //while (조건식)
{
    Console.WriteLine(i); //조건식이 참인 경우 실행되는 코드
    i++;                  //증감식
}

[출력]
0
1
2

 

2-2. do-while

(while문의 중괄호 부분이 do 부분으로 옴)

int sum = 0;
int num;

do
{
    Console.Write("숫자를 입력하세요 (0 입력 시 종료): ");
    num = int.Parse(Console.ReadLine());
    sum += num;
} while (num != 0);

Console.WriteLine("합계: " + sum);

[출력]
숫자를 입력하세요 (0 입력 시 종료): 5
숫자를 입력하세요 (0 입력 시 종료): 2
숫자를 입력하세요 (0 입력 시 종료): 3
숫자를 입력하세요 (0 입력 시 종료): 0
합계: 10

 

2-3. foreach

-배열이나 컬렉션에 대한 반복문을 작성할 때 사용

(카드뒤집기 게임에서 매칭 실패시마다 3단계로 색상변경하는 기능을 List를 사용하여 구현하였는데, if절을 써서 코드가 너무 길어지고 복잡했었다. foreach를 사용하면 코드가 간결해질 것 같다.)

2024.04.17 - [유니티] - Day 3 - 카드 색상 3단계로 변경(매개변수&리스트 활용) 

string[] inventory = { "검", "방패", "활", "화살"}; //배열

foreach (string item in inventory)     //foreach (자료형 변수 in 배열 또는 컬렉션)
{
    Console.WriteLine(item);           //배열 또는 컬렉션의 모든 요소에 대해 반복적으로 실행되는 코드
}

[출력]
검
방패
활
화살

 

- Dictionary value값을 List에 추가할 때도 사용 가능

Dictionary<int, string> items = new Dictionary<int, string>(); //items 딕셔너리

List<string> valueList = new List<string>();                   //valueList 리스트

foreach (KeyValuePair<int, string> item in items)
{
    if (item.Key != null)             //딕셔너리에 key값이 존재하면,
    {
        valueList.Add(item.Value);    //value값을 리스트에 추가             
    }
}

 

 

 

2-4. 이차원 반복문(=중첩 for 반복문)

(배열과 함께 사용하여 2차원 게임맵과 틱택토 게임화면 등을 구현할 수 있다.)

for (int i = 0; i < 5; i++)
{
    for (int j = 0; j < 3; j++)
    {
        Console.WriteLine("i: {0}, j: {1}", i, j);
    }
}

2차원 배열 게임 맵(배열, 이차원 반복문 활용)

 

2-5. break & continue

break: 반복문을 중지시키는 역할

continue: 현재 반복을 중지하고 다음 반복으로 진행시키는(조건을 다시 검토시키는) 역할

for (int i = 1; i <= 10; i++)
{
    if (i % 3 == 0)
    {
        continue; // 3의 배수인 경우 다음 숫자로 넘어감
    }

    Console.WriteLine(i);
    if (i == 5)
    {
        break; // 5이 출력된 이후에는 반복문을 빠져나감
    }
}

[출력]
1
2
4
5

3. 배열

3-1. 1차원 배열

-동일한 데이터 유형을 가지는 요소들을 한 번에 모아서 다룰 수 있음.

-인덱스 [숫자] 를 사용하여 각 요소에 접근

-선언된 크기만큼 저장 가능

int[] numbers = new int[]{1,2,3,4};   //int형 배열 선언 및 초기화

int[] numbers = {1, 2, 3, 4};
// 캐릭터 능력치 배열 만들기
int[] playerStats = new int[4];               //선언된 크기가 4인 int형 배열 선언

Random rand = new Random();                   //Random형 rand 변수 선언
for (int i = 0; i < playerStats.Length; i++)  //playerStats.Length = 4
{
    playerStats[i] = rand.Next(1, 11);        //1~11 사이의 숫자 중 랜덤으로 각 배열의 인덱스에 저장
}

// 능력치 출력
Console.WriteLine("플레이어의 공격력: "  + playerStats[0]);
Console.WriteLine("플레이어의 방어력: "  + playerStats[1]);
Console.WriteLine("플레이어의 체력: "    + playerStats[2]);
Console.WriteLine("플레이어의 스피드: "  + playerStats[3]);

[출력]
플레이어의 공격력: 4
플레이어의 방어력: 6
플레이어의 체력: 3
플레이어의 스피드: 6

 

3-2. 다차원 배열(표 형식)

-여러 개의 배열을 하나로 묶어 놓은 배열

-다차원 배열 선언 시, 각 차원의 크기를 지정(int[a, b])하여 생성

// 선언과 함께 초기화
int[,] array2D = new int[3, 4]  //3행 4열의 int형 2차원 배열
{ 
	{ 1, 2, 3, 4 }, 
	{ 5, 6, 7, 8 }, 
	{ 9, 10, 11, 12 } 
};

4. 컬렉션

4-1. List

List<int> numbers = new List<int>(); // 빈 리스트 생성(int형)
numbers.Add(1); // 리스트에 데이터 추가
numbers.Add(2);
numbers.Add(3);
numbers.Remove(2); // 리스트에서 데이터 삭제

foreach(int number in numbers) // 리스트 데이터 출력
{
    Console.WriteLine(number);
}

[출력]
1
3

 

4-2. 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);
}

5. 메서드

-접근 제한자(보안 강도: public < protected < private)

public: 누구나 / protected: 같은 클래스 내부, 상속받은 클래스만 / private: 같은 클래스 내부만

 

-리턴 타입

반환값(return)이 있을 경우: 자료형(int, string, bool)

반환값이 없을 경우: void

 

-메서드 이름(함수 이름) ex) Matched

 

-호출 방법: [메서드 이름]([전달할 매개변수]);

[접근 제한자] [리턴 타입] [메서드 이름]([매개변수])
{
    // 메서드 실행 코드
}

public bool Matched(int a, int b)  //Matched 메서드 선언
{
	bool isMatched = a == b;
	return isMatched;
}

Console.WriteLine(Matched(5, 3));  //Matched 호출방법 1

bool result = Matched(5, 3);       //Matched 호출방법 2
Console.WriteLine(result);

[결과]
false
false

6. 오버로딩

함수이름은 유지(AddNumbers)한 채, 매개변수만을 바꾸어서 함수를 실행하는 방법

int AddNumbers(int a, int b)
{
    return a + b;
}

int AddNumbers(int a, int b, int c)
{
    return a + b + c;
}

// 메서드 호출
int sum1 = AddNumbers(10, 20);  // 두 개의 정수 매개변수를 가진 메서드 호출
int sum2 = AddNumbers(10, 20, 30);  // 세 개의 정수 매개변수를 가진 메서드 호출

7. 구조체

-여러 자료형의 데이터(변수)나 메서드를 한 데 모아 나만의 형식으로 만드는 방법(클래스와 공통)

-struct 키워드를 사용하여 선언(클래스는 class를 사용해 선언)

-상속 불가능(반면 클래스는 상속 가능)

-적은 데이터 저장 또는 단순한 데이터 구조에 적합(반면 클래스는 복잡한 데이터 구조)

-간단한 변수선언방식

//구조체 선언
struct Person
{
    public string Name;
    public int Age;

    public void PrintInfo()
    {
        Console.WriteLine($"Name: {Name}, Age: {Age}");
    }
}

//구조체 실행
static void Main(string[] args)
{
    Person person1;         //변수 선언 방식: 구조체 이름 변수명;
    person1.Name = "John";  //.을 통해 구조체 내 변수 값에 접근 가능
    person1.Age = 25;
    person1.PrintInfo();    //구조체 출력 
}

[출력]
Name: John, Age: 25
728x90

loading