STIKA

Unity 캠프 13일차 TIL < C# 문법 3-2 / 알고리즘 > 본문

프로그래밍/Unity + C#

Unity 캠프 13일차 TIL < C# 문법 3-2 / 알고리즘 >

STIKA 2024. 1. 10. 15:16

24.01.10 Wed

 

❤️ TIL

Today I Learned

❤️하루에 1%씩만 나아가도 4개월 동안 쌓이면 꽤 덩치가 커진답니다 :)


📌 오늘의 계획

  • C# 문법 3주차 강의 듣기
  • 알고리즘 강의 듣기

✏️ 작업 내용

✔️ C# 문법 3주차

 

static으로 만들어진 main(메서드)은 static으로 만들어진 메서드만 쓸수있음

 

제너릭

  • 선언하는 시점이 아니라 사용하는 시점에 자료형 결정
  • 클래스나 메서드를 일반화시켜 다양한 자료형에 대응할 수 있는 기능
  • 코드의 재사용성이 높아짐
  • C#에서는 <T> 형태의 키워드를 이용
// 제너릭 클래스 선언 예시
class Stack<T>
{
    private T[] elements;
    private int top;

    public Stack()
    {
        elements = new T[100];
        top = 0;
    }

    public void Push(T item)
    {
        elements[top++] = item;
    }

    public T Pop()
    {
        return elements[--top];
    }
}

// 제너릭 클래스 사용 예시
Stack<int> intStack = new Stack<int>();
intStack.Push(1);
intStack.Push(2);
intStack.Push(3);
Console.WriteLine(intStack.Pop()); // 출력 결과: 3

 

제너릭 클래스 선언 및 사용 예시

 

 

 

 

class Pair<T1, T2>
{
    public T1 First { get; set; }
    public T2 Second { get; set; }

    public Pair(T1 first, T2 second)
    {
        First = first;
        Second = second;
    }

    public void Display()
    {
        Console.WriteLine($"First: {First}, Second: {Second}");
    }
}

 

 

Pair<int, string> pair1 = new Pair<int, string>(1, "One");
pair1.Display();

Pair<double, bool> pair2 = new Pair<double, bool>(3.14, true);
pair2.Display();

제너릭 두개이상 사용 예시 


 

out, ref 키워드

메서드로 값을 반환하는 것이 아니라, 매개변수를 이용하여 값을 전달 가능

out

메서드에서 반환 값을 매개변수로 전달하는 경우에 사용

ref

메서드에서 매개변수를 수정했을 때 원래 값에 영향을 주는 경우에 사용

 

// out 키워드 사용 예시
void Divide(int a, int b, out int quotient, out int remainder)
{
    quotient = a / b;
    remainder = a % b;
}

int quotient, remainder;
Divide(7, 3, out quotient, out remainder);
Console.WriteLine($"{quotient}, {remainder}"); // 출력 결과: 2, 1

// ref 키워드 사용 예시
void Swap(ref int a, ref int b)
{
    int temp = a;
    a = b;
    b = temp;
}

int x = 1, y = 2;
Swap(ref x, ref y);
Console.WriteLine($"{x}, {y}"); // 출력 결과: 2, 1

 

주의 사항

  • 값의 변경 가능성
    ref 매개변수를 사용하면 메서드 내에서 해당 변수의 값을 직접 변경 가능
    예기치 않은 동작을 초래할 수 있음
  • 성능 이슈
    ref 매개변수는 값에 대한 복사 없이 메서드 내에서 직접 접근하여 성능상 이점이 있음
    너무 많은 매개변수를 ref로 전달하면 코드의 가독성이 떨어지고 유지보수가 어려워짐
  • 변수 변경 여부 주의
    out 매개변수는 메서드 내에서 반드시 값을 할당해야 한다
    out 매개변수를 전달할 때 해당 변수의 이전 값이 유지되지 않음

 

ref는 쓸지 안쓸지 확실치 않지만

out은 무조건 메서드 내에서 값을 할당하기때문에 어떤방식으로든 쓰였다는 것을 알수있다


 

✔️ 알고리즘 강의

 

알고리즘 코드카타

매일 아침 9시~10시

반복되는 연습이라는 뜻을 가진 Kata를 통해 매일 아침 코딩을 훈련해봅시다.

 

자료구조 = 데이터를 다루기 위해 저장해두는 방식

알고리즘 = 문법을 활용해 저장된 데이터로 문제를 푸는 방법론

 

코딩테스트

https://school.programmers.co.kr/learn/challenges?order=recent

 

코딩테스트 연습 | 프로그래머스 스쿨

개발자 취업의 필수 관문 코딩테스트를 철저하게 연습하고 대비할 수 있는 문제를 총망라! 프로그래머스에서 선발한 문제로 유형을 파악하고 실력을 업그레이드해 보세요!

school.programmers.co.kr

 

코딩테스트 GitHub로 자동 Push - 백준 허브

https://github.com/BaekjoonHub/BaekjoonHub

 

GitHub - BaekjoonHub/BaekjoonHub: 백준 자동 푸시 익스텐션(Auto Git Push for BOJ)

백준 자동 푸시 익스텐션(Auto Git Push for BOJ). Contribute to BaekjoonHub/BaekjoonHub development by creating an account on GitHub.

github.com

 

 


 

가변배열

//가변 배열
int[][] arr3 =
{
    new int[]{1, 2 },
    new int[]{3, 4, 5 },
    new int[]{6, 7, 8, 9}
};

Console.WriteLine(arr3.Length);
Console.WriteLine(arr3.GetLength(0));
Console.WriteLine(arr3.GetLength(1));

for (int i = 0; i < arr3.Length; i++)
{
    for (int j = 0; j < arr3[i].Length; j++)
    {
        Console.Write(arr3[i][j] + " ");
    }
    Console.WriteLine();
}

c++인줄

근데 이걸로 가변배열이 가능하다함

그냥 이차원 배열은 [ , ]

 

 

List → 동적

할당한 크기가 넘어가면 2배의 크기로 재할당

(얻는게 있으면 잃는게 있지)

그래서아무리 리스트여도 기본크기는 잡고가는게 나음

List<int> list = new List<int>()

()안에 비워두면 약 4개의 원소가 들어갈정도를 만든다고 함

 

list는 index X count O

 

list.insert는 원소 추가

list.insert(2,0) 2번째 원소에 0추가

 

remove는 Remove(5) 5라는 값을 찾아서 삭제

 

clear는 싹지우기

 

 

배열

  • 연속된 메모리 공간에 할당되어 접근이 빠름
  • 참조를 위한 추가 메모리 할당이 필요 없음
  • 삽입, 삭제 시 뒤 요소들을 이동해야 해서 비효율적
  • 크기 변경 불가
  • 메모리 재할당 불가

리스트

  • 삽입 / 삭제 전후 노드의 참조 관계만 수정하면 되기 때문에 배열보다 비교적 효율적
  • 메모리 재사용 가능
  • 참조를 위한 메모리가 추가로 필요
  • 배열보다 실행 속도가 느림

📝 오늘의 마무리

매일 아침 1시간씩 알고리즘 공부

즉 코딩테스트 연습을 하게 되었다.

슬쩍 봤는데 초반은 쉬워보이던데 뒤로 갈 수록 어마무시해지겠지

예전에 c++을 배운적이 있었는데

비슷한 듯 다른 부분이 많아서 헷갈린다


 

✏️ 스스로 어제보다 한 발 더 나아갔다는 것을 자각하기

✏️ TIL을 쓰기 위해서라도, 오늘 반드시 단 하나라도 배우기

✏️ 꾸준히 기록을 남기는 습관 가지기

 

📕 오늘의 학습 키워드

📕  공부한 내용 본인의 언어로 정리하기

📕  오늘의 회고

📕  12시간 중 얼마나 몰입했는지

📕  더 나은 미래를 위해 내일 어떤 공부를 진행할 것인지