본문 바로가기
Unity & C#

[C#] 문법 정리 2

by 이재현9999 2024. 7. 23.

컬렉션(Collection)

컬렉션은 여러 개의 객체를 관리하는데 사용되는 클래스들의 집합이다.

배열과 다르게 크기가 정해져 있지 않다.

 

컬렉션의 종류로는 List, Dictionary, Queue, SortedList, Stack, ArrayList 등이 있다.

 

List

유니티에서 List는 다양한 게임 오브젝트와 컴포넌트를 관리하는 데 자주 사용된다.

ex) 여러 개의 적 캐릭터 관리, 인벤토리 시스템 구현

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // List<int> 생성 및 초기화
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
        
        // 원소 추가
        numbers.Add(6);
        
        // 특정 위치에 원소 삽입
        numbers.Insert(2, 10);
        
        // 원소 제거
        numbers.Remove(4);
        
        // 원소 출력
        foreach (int number in numbers)
        {
            Console.WriteLine(number);
        }
    }
}

주요 메서드

Add(item) : 리스트 끝에 원소 추가

Insert(index, item) : 특정 위치에 원소 삽입

Remove(item) : 특정 원소 제거

RemoveAt(index) : 특정 인덱스의 원소 제거

Clear() : 리스트의 모든 원소 제거

Contains(item) : 특정 원소가 리스트에 있는지 확인

Count : 리스트의 원소 개수

 

Dictionary

Dictionary는 키와 값을 쌍으로 데이터를 저장하는 컬렉션이다.

각 아이템의 이름과 아이템 데이터를 매핑하는 데 유용하다.

using UnityEngine;
using System.Collections.Generic;

public class Inventory : MonoBehaviour
{
    // 아이템 데이터를 저장하는 딕셔너리
    private Dictionary<string, Item> items;

    void Start()
    {
        // 딕셔너리 초기화
        items = new Dictionary<string, Item>();

        // 인벤토리에 아이템 추가
        items.Add("HealthPotion", new Item { name = "Health Potion", description = "Restores health", icon = healthPotionIcon });
        items.Add("ManaPotion", new Item { name = "Mana Potion", description = "Restores mana", icon = manaPotionIcon });

        // 아이템에 접근
        if (items.ContainsKey("HealthPotion"))
        {
            Item healthPotion = items["HealthPotion"];
            Debug.Log("Item: " + healthPotion.name + ", Description: " + healthPotion.description);
        }
    }
}

[System.Serializable]
public class Item
{
    public string name;
    public string description;
    public Sprite icon;
}

주요 메서드

Add(key, value) : 딕셔너리에 키-값 쌍 추가

Remove(key) : 특정 키의 원소 제거

ContainsKey(key) : 특정 키가 딕셔너리에 있는지 확인

TryGetValue(key, out value) : 특정 키의 값을 안전하게 가져오기

Clear() : 딕셔너리의 모든 원소 제거

Count : 딕셔너리의 원소 개수

 

컬렉션을 효율적으로 사용하는 방법

1. 초기화 및 관리 : 리스트와 딕셔너리를 적절하게 초기화하고 관리하여 메모리 사용을 최적화한다.

2. Null 체크 : 게임 오브젝트나 컴포넌트가 null인지 항상 확인하여 NullReferenceException을 방지한다.

3. 퍼포먼스 : 컬렉션의 크기가 커질수록 성능에 영향을 줄 수 있으므로, 필요 없는 데이터를 제때 제거하고 관리한다.

4. 커스텀 클래스 사용 : 필요에 따라 커스텀 클래스를 만들어 컬렉션의 원소로 사용하면, 데이터 관리가 더 쉬워진다.

 

foreach

foreach문은 컬렉션이나 배열의 요소를 반복할 때 사용되는 반복문이다.

foreach문을 사용하면 컬렉션의 요소들을 순서대로 읽어올 수 있다.

int[] numbers = { 1, 2, 3, 4, 5 };

foreach (int number in numbers)
{
    Console.WriteLine(number);
}

numbers 배열의 각 요소들을 순서대로 출력하게 된다.

 

함수

특정 작업을 수행하는 코드블럭.

    int Square(int x)
    {
        return x * x;
    }

함수의 실행이 끝나고 결과 값을 돌려줄 데이터 타입을 통해서 함수를 선언해야 한다.

 

void로도 함수를 선언할 수 있다.

함수를 실행하지만 그 함수의 결과값을 돌려주지 않을 때 void라고 쓴다.

 

Scope

스코프(Scope)은 프로그램 내에서 변수가 유효하고 접근 가능한 범위를 의미한다.

변수의 선언 위치에 따라서 스코프가 결정된다.

 

1. 블록 스코프(Block Scope)

블록 스코프는 중괄호('{}')로 둘러싸인 코드 블록 내에서 변수가 유효한 범위이다.

조건문, 반복문과 메서드 내부의 코드 블록에서 자주 사용된다.

public class Example
{
    public void BlockScopeExample()
    {
        if (true)
        {
            int x = 10;  // x는 이 블록 내에서만 유효
            Console.WriteLine(x);  // 10 출력
        }
        // Console.WriteLine(x);  // 컴파일 오류: x는 이 블록 밖에서 유효하지 않음
    }
}

 

2. 메서드 스코프(Method Scope)

메서드 스코프는 메서드 내에서 선언된 변수들이 유요한 범위이다.

메서드 스코프 내의 변수는 메서드가 호출될 때 생성되고, 메서드가 종료될 때 소멸한다.

public class Example
{
    public void MethodScopeExample()
    {
        int y = 20;  // y는 MethodScopeExample 메서드 내에서만 유효
        Console.WriteLine(y);  // 20 출력
    }

    public void AnotherMethod()
    {
        // Console.WriteLine(y);  // 컴파일 오류: y는 MethodScopeExample 메서드 내에서만 유효
    }
}

 

3. 클래스 스코프(Class Scope)

클래스 스코프는 클래스 내에서 선언된 필드와 메서드가 유효한 범위이다.

클래스의 인스턴스 변수는 클래스의 인스턴스가 존재하는 동안 유효하다.

public class Example
{
    private int z = 30;  // z는 클래스 스코프 내에서 유효

    public void ClassScopeExample()
    {
        Console.WriteLine(z);  // 30 출력
    }

    public void AnotherMethod()
    {
        z = 40;
        Console.WriteLine(z);  // 40 출력
    }
}

 

params

params는 메서드 매개 변수를 가변 길이로 사용할 수 있게 해준다.

즉, 호출 시 매개 변수의 개수를 가변적으로 지정할 수 있게 된다.

public void PrintNumbers(params int[] numbers)
{
    foreach (int number in numbers)
    {
        Console.WriteLine(number);
    }
}

이 메서드는 호출 시 여러 개의 정수를 인수로 전달할 수 있고, 전달된 정수들은 numbers 배열로 받아들여진다.

 

params 매개 변수는 메서드당 하나만 사용할 수 있으며, 마지막 매개 변수로만 사용할 수 있다.

 

params 매개 변수는 배열로 처리되므로, 배열 자체를 전달할 수도 있다.

using System;

class Program
{
    public static void PrintNumbers(params int[] numbers)
    {
        foreach (int number in numbers)
        {
            Console.WriteLine(number);
        }
    }

    static void Main()
    {
        int[] myNumbers = { 10, 20, 30 };
        PrintNumbers(myNumbers);  // 배열을 직접 전달
    }
}

'Unity & C#' 카테고리의 다른 글

[Unity] 캐릭터 이동  (0) 2024.08.02
[C#] 문법 정리 1  (1) 2024.07.12