본문 바로가기

TECHIT 멋쟁이사자 강의 정리(유니티)

[멋쟁이사자처럼 유니티 게임 스쿨 TIL] 2일차 C# 클래스 문법까지

<aside> 💡 for

static void funtion(int min, int max)
        {
            for (int i = min; i < max; i++)
            {
                Console.WriteLine(i);
            }
        }
        public static void Main(string[] args)
        {
            funtion(0, 20);
        }

이렇게 나온다

이는 j는 0으로 초기화 되었고 10 미만이 충족될 때 j를 1씩 증가 시킨다 라는 의미이고 j가 1씩 증가 될 때 {}안의 조건을 실행시키고 1을 증가 시킨다.

</aside>

<aside> 💡 스코프

{} 로 쓰고 로컬 변수는 이 스코프 내에서만 살아있다. 스코프를 벗어나면 변수는 쓸 수 없다.

</aside>

<aside> 💡 함수

계산식의 묶음.

</aside>

<aside> 💡 static

지역함수와 전역함수가 있다. 전역함수에 static이 붙고 따로 뭔가 붙지 않은 상태는 지역함수라고 한다.

전역함수는 프로젝트 내에 유일한 함수이며 그 함수 내에 실행되는 함수들은 static이 되어야 한다.

</aside>

<aside> 💡 매개변수

파라미터라고 부르고 함수에 들어오는 수를 뜻한다. 이 수는 외부에서 받으며

</aside>

<aside> 💡 세미콜론

세미콜론은 한 줄의 마무리는 여기서 하겠다 라는 의미로 쓰임. 함수 선언같이 스코프로 감싸주는 경우에는 ;는 생략되고 특정 상황 (델리게이트 람다 등)에는 ;가 쓰이는 경우가 있다

</aside>

<aside> 💡 배열

데이터를 담는 그릇인데 변수와는 달리 여러 데이터를 담을 수 있음. 배열은 0부터 시작함.

.length를 사용해 배열의 길이를 가져올 수 있다.

</aside>

using System;

namespace ConsoleApplication10
{
    internal class Program
    {
        static int SumArray(int[] array, int length)
        {
            if (length == 0)
            {
                return 0;
            }
            else
            {
                return array[length - 1] + SumArray(array, length - 1);
            }
        }
        public static void Main(string[] args)
        {
            int[] array = { 1, 2, 3, 4, 5, 6 };
            Console.WriteLine(SumArray(array, array.Length));
            Console.ReadKey();
        }
    }
}

<aside> 💡 피보나치 수열(재귀)

using System;

namespace ConsoleApplication10
{
    internal class Program
    {
        static int Fibo(int a)
        {
            if (a == 1)
            {
                return 0;
            }
            else if (a == 2)
            {
                return 1;
            }

            return Fibo(a - 1) + Fibo(a - 2);
        }
        
        public static void Main(string[] args)
        {
            Console.WriteLine("수를 넣어주세요. 피보나치 수열이 될겁니다 :  ");
            int aa = int.Parse(Console.ReadLine());
            int result = Fibo(aa);
            Console.Write("피보나치 수열 : ");
            Console.WriteLine(result);
            
        }
    }
}

</aside>

<aside> 💡 클래스와 스트럭트

클래스

힙메모리에 생성되며 참조 타입으로 선언된다.

스트럭트(구조체)

스택메모리에 생성되며 값타입으로 선언되고 복사형식이다.

스트럭트는 반드시 파라미터가 있어야 하며 상속이 불가하다.

내가 이해한 바로는 스트럭트는 스택에 생성되고 작은수 변화시키지 않으며 읽어들이기만 할때 사용하면 유리하다. 복사의 형태이기에 데이터가 커지면 그만큼 불리해짐.

클래스는 참조의 형식이며 Get 말고도 Set도 가능하다. 힙에 생성되며 스택에 생성되는 스트럭트보다는 느리다. 하지만 큰 데이터에서도 힙메모리에 할당하기 때문에 큰 데이터에 효과적이다.

큰걸 유연하게 사용할때 클래스 , 작은수를 변화없이 값을 반환받기만 하면 스트럭트.

  • 클래스와 구조체 차이점구조체(struct)
    1. 작고 간단한 데이터:
      • 구조체는 주로 간단한 데이터를 저장할 때 사용됩니다. 예를 들어, 3D 좌표를 나타내는 Vector3 구조체는 x, y, **z**의 세 개의 값만을 포함합니다.
    2. 불변 데이터:
      • 구조체는 기본적으로 값 타입이기 때문에 불변성을 유지하기에 적합합니다. 값을 변경할 필요가 없는 데이터에 적합합니다.
    3. 퍼포먼스:
      • 성능이 중요한 경우, 특히 메모리 할당과 해제를 최소화하고자 할 때 구조체를 사용할 수 있습니다. 값 타입이기 때문에 힙 대신 스택에 저장됩니다.
    이유:
    • 값 타입(Value Type): 구조체는 값 타입이므로 할당된 변수는 데이터를 직접 저장합니다. 복사 시 값 자체가 복사되므로 참조 타입보다 빠를 수 있습니다.
    • 불변성(Immutability): 불변 데이터를 사용하면 데이터의 무결성을 유지하기 쉬우며, 멀티스레드 환경에서 안전하게 사용할 수 있습니다.
    예시:클래스(class)
    1. 복잡한 데이터:
      • 클래스는 복잡한 데이터 구조와 동작을 캡슐화할 때 사용됩니다. 메서드, 이벤트, 상속 등의 기능이 필요할 때 적합합니다.
    2. 참조 동작:
      • 여러 곳에서 동일한 데이터를 참조해야 할 때 사용됩니다. 클래스는 참조 타입이므로 동일한 인스턴스를 여러 변수가 가리킬 수 있습니다.
    3. 가변 데이터:
      • 데이터가 자주 변경될 필요가 있을 때 사용됩니다. 클래스는 힙에 저장되며, 참조를 통해 값을 변경할 수 있습니다.
    이유:
    • 참조 타입(Reference Type): 클래스는 참조 타입이므로 동일한 객체를 여러 곳에서 참조할 수 있습니다. 이로 인해 데이터 공유와 수정이 용이합니다.
    • 기능 풍부: 클래스는 메서드, 속성, 상속, 인터페이스 구현 등 풍부한 기능을 지원합니다.
    예시:주요 차이점 요약:
    1. 메모리 할당:
      • 구조체: 스택에 할당되며 값 타입이다.
      • 클래스: 힙에 할당되며 참조 타입이다.
    2. 불변성:
      • 구조체: 값 타입이므로 주로 불변 데이터에 사용된다.
      • 클래스: 참조 타입이므로 가변 데이터에 사용된다.
    3. 성능:
      • 구조체: 작고 간단한 데이터를 처리할 때 성능 이점이 있다.
      • 클래스: 복잡한 데이터와 동작을 처리할 때 적합하다.
    4. 상속:
      • 구조체: 상속을 지원하지 않는다.
      • 클래스: 상속을 지원하며 다형성을 제공한다.
    결론
  • 구조체는 작고 불변하며 간단한 데이터를 효율적으로 처리할 때 사용하고, 클래스는 복잡한 데이터 구조와 동작, 가변성을 필요로 하는 경우에 사용합니다. 두 타입을 적절하게 사용하면 성능과 코드 유지보수 측면에서 이점을 얻을 수 있습니다.
  • public class Person { public string Name { get; set; } public int Age { get; set; } public Person(string name, int age) { Name = name; Age = age; } public void CelebrateBirthday() { Age++; } }
  • 사용 시기:
  • public struct Point { public int X { get; } public int Y { get; } public Point(int x, int y) { X = x; Y = y; } }
  • 사용 시기:
  • C#에서 구조체(struct)와 클래스(class)는 각각 다른 용도로 사용되며, 두 가지 타입을 사용하는 이유는 성능, 메모리 관리, 데이터의 불변성 등의 측면에서 차이가 있기 때문입니다. 언제 구조체를 사용하고 언제 클래스를 사용해야 하는지에 대한 가이드라인을 제공하겠습니다.

</aside>

<aside> 💡 상속

상속은 부모클래스를 받는것으로 공통된 상위 함수를 구현해야 할 때 사용한다. 예를들어 animal이라는 객체를 만들고 그 안에는 울음소리라는 함수가 있다. 이 울음소리는 동물이라면 공통적으로 내는것이고 animal을 상속받는 dog라는 객체를 만들었을때 이 울음소리를 그대로 쓸 수도 있지만 그 울음소리를 override를 사용해 그 함수를 재정의 해서 개의 울음소리를 내도록 할수도 있다. 이때 오버라이드를 위해선 상위 함수가 virtual으로 선언되어 있어야 한다.

</aside>

<aside> 💡 인터페이스

한 객체를 생성할 때 이거는 무조건 있어야해 ! 하고 쓰는 설계도면 같은것. 인터페이스를 상속받은 객체는 인터페이스 안에 있는 이름만 있는 함수의 구현부를 무조건 구현해야 한다. 안그럼 객체로 인정 안해줌.

</aside>