공부/Unity

24.03.11

월러비 2024. 3. 11. 13:38

0. 생성한 스크립트

  • params(추가)
  • factorial : 재귀함수
  • Rescursion : 경로안에 파일 찾아서 몇줄 썼는지 재귀함수를 이용해 알아내기
  • Structure : 구조체 예시

 

1. 가변 파라미터

  • 가변 파라미터 : params 키워드를 사용하여 개수의 제한 없이 매개변수를 넘길 수 있게한다.
    • 즉, 개수가 변하는 인자들을 넘길 수 있는 매개변수.
  • 조건
    • 선언부에서 params 키워드는 타입 맨 앞에 와야한다.
    • 가변인자 매개변수를 선언할떄는 []를 이용해서 1차원 배열로 선언해야한다.
    • 데이터 타입이 애매할때는 모든 클래스의 최상위 클래스인 object 클래스 배열로 하는것이 가능하다.
    • 호출부에서 각 매개변수는 쉼표로 구분을 해야한다.
    • 호출부에서 매개변수를 보내지 않아도 된다. => 이 경우 길이가 0이 되고, 비어있는 매개변수가 된다.
string fullName = string.Empty; // 빈문자열 선언방법

fullName = Combine(1, System.IO.Directory.GetCurrentDirectory(), "bin", "Index.cs");
print(fullName);

fullName = Combine(2, System.Environment.SystemDirectory, "Temp", "Test", "Exam.cs");
print(fullName);

string[] folders = new string[]
{
    "C:\\", "Data", "Home", "Move.cs" // 역슬래시 쓰는 이유 : 뒤에 나올 문자가 특수문자인것을 미리 알려주는 역할이다.
};

fullName = Combine(3, folders);
print(fullName);

private string Combine(int number, params string[] paths) //파란색 : 예약어, 하늘색 : 지역변수
{
    string result = string.Empty;

    foreach(string path in paths) //
    {
        result = System.IO.Path.Combine(result, path); //result와 path를 /로  연결해주는 함수다.
    }

    return number.ToString() + " : " + result;
}

 

1-2 foreach

  • 배열이나 컬렉션(리스트 등)에 주로 사용하는데, 배열의 각 요소를 하나씩 꺼내와서 foreach 루프 내의 블럭을 실행할 때 사용된다.
  • 인자로 들어온 배열이나 컬렉션의 인덱스 끝까지 순환을 반복한다.
foreach(string path in paths) //
{
    result = System.IO.Path.Combine(result, path); //result와 path를 /로  연결해주는 함수다.
}

 

2. 컨테이너

  • 데이터를 저장하고 관리하기 위한 추상적인 개념을 나타낸다.
  • 컨테이너는 데이터 구조를 나타내며, 다른 데이터 타입의 요소를  포함할 수 있다.
  • C#에서는 배열, 리스트, 스택, 큐, 딕셔너리 등 다양한 컨테이너를 제공한다.
string[] folders = new string[]
{
    "C:\\", "Data", "Home", "Move.cs" // 역슬래시 쓰는 이유 : 뒤에 나올 문자가 특수문자인것을 미리 알려주는 역할이다.
};

 

3. 재귀함수

  • 함수 내부에서 자기 자신을 반복적으로 호출하는 것을 의미한다. => 자기 자신을 호출하는 함수
  • 주의점
    • 재귀호출은 반드시 중지되어야 한다.
    • 스택 오버플로우가 되면 안된다.
    • 시간복잡도를 줄일 수 있는 상황 또는 메모리 영역이 충분한 상황에서 사용해야 한다.
    • 데이터는 스택에 채워진다.
int result = Func(5);

print($"최종 값 : {result}");

private int Func(int x)
{
    int result = 0;

    print($"호출시작 : {x}");

    if (x == 1)
        result = 1;
    else
        result = x * Func(x - 1);

    print($"호출완료 : {x}, {result}");

    return result;
}

재귀함수 결과

4. 선형 자료구조 (이론추가)

  1. 배열
    • public int[] array = new int[3];
    • 배열 데이터 구조에 형식이 동일한 변수를 여러 개 저장할 수 있다.
    • 데이터 할당 시 데이터의 크기가 정해져있다면 배열을 사용한다.
    • 장점 : 연속된 공간을 사용한다.
    • 단점 : 자료의 추가 / 죽소가 불가능하다.
  2. 리스트
    • public List<int> list = new List<int>();
    • 배열과 유사하게 인덱스로 액세스할 수 있는 강력한 형식의 개체 목록을 나타낸다.
    • 데이터 할당 시 데이터의 크기가 정해져있지 않다면 리스트를 사용한다.
    • 장점 : 자료의 개수를 유동적으로 변경 가능하다(충분한 공간 할당이 필요하다), 연속된 공간을 사용한다.
    • 단점 : 중간에서 자료의 삽입 / 삭제가 발생할 경우 관련된 모든 자료의 이동이 필요하다.
  3. 연결리스트
    • public LinkedList<int> list = new LinkedList<int>();
    • 데이터를 포함하는 노드들을 연결하여 컬렉션을 만든 자료구조로, 각 노드는 데이터와 다음 / 이전 링크 포인터를 갖게 된다.
    • 장점 : 중간에서 자료의 삽입 / 삭제가 용이하다.
    • 단점 : N번째 방을 바로 찾을 수 없다(연속된 공간을 사용하지 않기 때문이다)
  4. 스택
    • Stack stack = new Stack();
    • 스택은 가장 나중에 추가된 데이터가 먼저 출력되는 LIFO(후입선출) 자료 구조다.
    • 장점 : 구현이 쉽다. 저장, 읽기 속도가 빠르다.
    • 단점 : 내부 데이터의 접근, 변경이 느리다.(먼저온 데이터는 가장 마지막에 나가기 때문이다)
    • 먼저 추가된 데이터가 먼저 출력 처리되는 FIFO(선입선출) 자료 구조다.
  5. 스택 스레임
    • 메모리의 스택 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역이다.
    • 스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.
    • 함수가 호출되면 스택에는 함수의 매개변수, 호출이 끝난 뒤 돌아갈 반환 주소값, 함수에서 선언된 지역 변수 등이 저장된다.
    • 이렇게 스택 영역에 차례대로 저장되는 함수의 호출 정보를 스택 프레임이라고 한다.

 

5. 컴퓨터 구조 - I/O (이론추가)

  1. I/O 시스템
    • 단일 파일에 대한 만들기, 복사, 삭제, 이동 및 열기를 위한 정적 메서드를 제공하고 FileStream 개체 만들기를 지원한다.
  2.  스트림(Stream)
    • 컴퓨터에서 데이터를 이동시키기 위한 중요한 개념이다.
    • 데이터가 흐르는 통로를 의미하며, 데이터를 이동시키는 역할을 수행한다.
  3. 파일 스트림(FileStream 클래스)
    • File Stream 인스턴스를 생성하여 메모리에 할당하여 사용하는 클래스다.
    • 파일과 연결된 스트림이 생성되며, 파일과 직접적으로 접근하여 데이터를 주고받을 수 있다.
    • 파일경로, 파일명, 파일 확장자를 성정할 수 있으며, 파일 모드와 파일 권한을 설정할 수 있다.
  4. 스트림 리더(StreamReader 클래스)
    • Stream으로부터 텍스트 데이터를 읽어 오기 위한 클래스다.
    • string ReadLine()메서드를 사용하여 현재 커서가 있는 위치의 데이터를 한 줄씩 읽어 반환하는 메서드다.

 

6. 경로안에 파일 찾아서 몇줄 썼는지 알아내기

string path = Directory.GetCurrentDirectory(); //현재폴더 경로를 가져오는 함수

path = path + "\\Tests\\A\\Factorial.cs";
int totalCount = DirectoryCOuntLines("./Tests/"); //현재폴더인 .폴더 하위의 Tests 폴더
print($"전체 라인 수 : {totalCount}");
int DirectoryCOuntLines(string directory)
{
    int count = 0;

    foreach(string file in Directory.GetFiles(directory, "*.cs")) //directory, "*.cs" : 경로안에있는 cs파일 전체를 가져와라
    {
        count += CountLines(file);
    }

    foreach (string subDirectory in Directory.GetDirectories(directory)) //경로 아래에 있는 폴더 경로를 가져와라
    {
        count += DirectoryCOuntLines(subDirectory);
    }

    return count;
}
int CountLines(string file)
{
    FileStream stream = new FileStream(file, FileMode.Open);
    StreamReader reader = new StreamReader(stream);

    int lineCount = 0;

    while (reader.ReadLine() != null) //reader.ReadLine() : 파일 한줄을 읽어 가져오는 함수
    {
        lineCount++;
    }
    reader.Close(); //파일을 열었으면 끝날때 닫아줘야한다.

    return lineCount;
}

바이트 스트림 이용한 코드 라인 갯수 결과

 

7. 구조체

  • 구조체는 사용자 정의 데이터 유형(data type)으로 새로운 유형, 여러가지 유형을 사용하기위해 사용자가 직접 만들어 사용한다.
  • C# 구조체에 메소드, 필드, 속성등을 가질 수 있다.
  • 구조체에 생성자를 정의할 수 있다.
  • 프로그램에서 new 연산자를 이용하여 struct 객체를 생성할 수 있다.
  • 구조체에 기본 생성자 / 소멸를 정의할 수 없다.
  • 구조체는 다른 구조체나 클래스의 기본 구조체(상속하기 위한)가 될 수 없다.
  • public을 쓰지 않으면 함수 외부에서 변수에 접근이 불가능하다. -> 접근지정자를 안쓰면 private가 기본으로 사용된다.
struct Player
{
    public string Name;
    public int Hp;

    public void Damage(int amount)
    {
        Hp -= amount;
    }

    public string GetData()
    {
        string temp = "";
        temp = $"Name : {Name}, Hp : {Hp}";

        return temp;
    }
}

Player player;
player.Name = "player";
player.Hp = 100;

player.Damage(20);
print(player.GetData());

구조체 결과

8. 구조체 / 클래스 형식 차이 (이론추가)

  • 상속 여부 : Class는 상속이 가능하지만, 구조체는 상속이 불가능하다.
  • 형식의 차이 : Struct는 값 타입(ValueType)이지만 Class는 참조(Reference Type)이다.
  • 1. 구조체 = 값 형식
struct Player
{
    public string Name;
    public int Hp;

    public void Damage(int amount)
    {
        Hp -= amount;
    }
}

Player player;
player.Name = "player";
  • 값 형식은 값을 복사해서 주기 때문에 본래의 값에는 영향을 미치지 않는다. => ??
  • 2. 클래스 = 참조 형식
class Character
{
    private string name;
    private float health;
    private float magician;

    public float Magician
    {
        get { return magician; }
        set
        {
            magician = Mathf.Clamp(magician, 0, 100);
        }
    }
}

Character character = new Character();
character.Magician = 100;
  • 참조 형식은 주소를 참조로 주기때문에 이전값에 영향을 미친다.
  • 정리 : 구조체 변수1 생성 및 선언 -> 구조체 변수2 = 변수1 후 선언 => 변수1에서 선언한 값과 변수2에서 선언한 값이 서로 다르다.
  • 클래스 변수1 생성 및 선언 -> 클래스 변수2 = 변수1 후 선언 => 변수 1에서 선언한 값과 변수2에서 선언한 값이 변수2의 값으로 똑같이 출력됐다.

'공부 > Unity' 카테고리의 다른 글

24.03.13  (0) 2024.03.13
24.03.12  (1) 2024.03.12
24.03.08  (1) 2024.03.08
24.03.07  (0) 2024.03.07
24.03.06  (3) 2024.03.06