0629

윾띵진·2022년 6월 29일
0

#define EXAMPLE_TYPE_ARRAY
#define EXAMPLE_TYPE_STATIC_CLASS
#define EXAMPLE_TYPE_EXTEND_METHOD

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

#region 배열 / 정적 클래스 / 확장 메서드

/*
▶ C# 언어의 배열 특징
List는 권장하지 않음 - 퍼포먼스 저하

  • C#언어의 배열은 참조 형식의 데이터 타입에 속한다.
    ㄴ 즉, 가비지 컬렉션에 의해서 메모리가 관리된다.
  • C# 언어의 배열은 가변 길이 배열을 지원한다.
    ㄴ 즉, 배열의 각 행의 길이를 서로 다르게 명시하는 것이 가능하다.

단, 가변 길이 배열은 2차원 배열만 지원한다

C++은 다차원을 지원한다.
C++는 4차원이상의 배열부터는 프로그래머가 힘들다
C#은 2차원까지만 지원한다.
왜? 행렬을 지원하기 위해

▶ 정적 클래스

  • 클래스의 멤버 변수, 함수가 모두 정적으로 이루어진 클래스를 의미한다.
    ㄴ 정적 클래스는 객체화 시키는 것이 불가능하다.

  • 또한, 정적 클래스는 정적 변수, 함수 이외에 멤버 변수, 함수 등을 선언하는 것이
    불가능하며, 상속 또한 불가능

C# 언어 정적 클래스 특징:

  • C# 언어의 정적 클래스는 static 키워드를 명시함으로 정의하는 것이 가능
    ㄴ static 키워드가 명시된 클래스는 클래스 변수, 함수 이외에는 다른 멤버를 정의하는 것이
    불가능

▶ 확장 메서드란?

  • 기존에 제공되는 클래스 또는 외부 라이브러리에 속해있는 클래스에 새로운 기능을 "상속"이 아닌
    메서드를 이용해서 기능을 확장하는 것을 의미한다.

▶ 확장 메서드의 특징

  • C# 언어의 확장 메서드는 정적 클래스만을 통해서 정의하는 것이 가능하다.
    즉, 정적 클래스가 아니면 확장 메서드 자체를 구현하는 것이 불가능하다.

  • C# 언어의 확장 메서드를 정의하는 정적 클래스는 반드시 최상단 영역에 위치 시켜야 한다.
    (using과 클래스 사이)

  • 특정 클래스의 중첩 클래스로는 확장 메서드를 정의하는 것이 불가능
    (클래스 안에 클래스 : 중첩)
    C#은 다중상속을 지원하지 않는다 (상속이 1개만 들어간다)
    C#은 상속 + 확장메서드 + 인터페이스를 해야함.

유니티에서는 이미 MonoBehaviour를 상속 받고 시작한다.

확장메서드가 제일 중요하다! 많이 써야함

*/

#endregion
public class Example_02 : MonoBehaviour
{

private void Awake()
{

#if EXAMPLE_TYPE_ARRAY
//1. 평균적으로 사용하는 방법
int[] oValues = new int[5];
//2.
int[] oOtherValues = new int[]
{
1,2, 3, 4, 5
};

    /*
     var: auto와 비슷한 키워드
    C#의 형식 검사는 강한 or 약한이 있다.

    강한 형식 검사 : int, float string 등등
    ㄴ 데이터 손실 및 프로그래머 실수 방지
    라운딩에러, 반올림 오차 

    약한 형식 검사 : 자동으로 해당 변수의 형식 지정(추정)
    ㄴ 단, 지역 변수로 선언하고 선언과 동시에 초기화를 해줘야 한다. 



    auto : C++ STL
     var : 컴파일러에게 유추하라고 시킴
    단점 : 가독성이 현저하게 떨어질 수 있다.
    멤버변수여야 유추할 수 있으며 전역변수는 유추할 수 없다.

     */

    /*
     String :
    - 읽기가 많은 경우는 String 클래스를 사용하는게 더 적합하다.
    
    게임쪽 로딩 데이터
    상점 등에 많이 쓰인다. 

    - 삽입에 있어 StringBuilder 느리다.


    StringBuilder :
    - 객체의 참조 값을 힙에 관리한다. (추가, 삽입, 삭제) - 힙은 동적메모리이기 때문에 
    - 새로운 객체를 만들지 않고 문자열을 수정할 수 있다.
    
    
    ㄴ 기존 + 연산자를 통한 문자열 연결은 메모리의 할당과 복사가 지속적으로 수행된다
    ㄴ 이건 모든 언어 공통 -> 느려진다.
    ㄴ 반복문에서 많은 문자열을 연결하면 매우 느리다.
    ㄴ 성능이 떨어지는 이유는 연결한 문자열 복사를 위해 매번 새로운 객체를 생성하기 때문에
    ㄴ 반면 stringBuilder는 메모리를 블럭 단위로 할당한 후 현재 블럭 내 메모리가 모두 소진된 경우에 한하여 
    메모리를 재할당하게 되어 있다. 

            - 읽어 들일때만 String을 쓰고 나머지는 빌더를 쓰자
     0
     */


    var oStringBuilder = new System.Text.StringBuilder();

    for (int i = 0; i < oValues.Length; i++)
    {
        oStringBuilder.AppendFormat("{0}", oOtherValues[i]);
    }

    Debug.Log(oStringBuilder.ToString());

#elif EXAMPLE_TYPE_STATIC_CLASS
#else
#endif
}
#if EXAMPLE_TYPE_ARRAY
#elif EXAMPLE_TYPE_STATIC_CLASS
#else
#endif
}

profile
Sprezzatura

0개의 댓글