제네릭의 제약 조건은 크게 두가지 역할을 한다고 볼수 있다. - 런타임 오류를 컴파일 오류로 발생하도록 바꿔준다. - 타입매개변수를 규정해 사용자에게 도움을 준다. 이때, 요구작어보이에 그 타입이 어떤 작업을 하는 지 기능이 있는 지, 신경을 쓰지 않지만, IDisposable을 구현할 경우 특별한 작업이 추가적으로 필요하다. 제네릭 메서드 내에서 타입 매개변수로 주어지는 타입을 이용하여 인스턴스를 생성할 경우 -> 타입 매개변수에서 IDisposable을 구현하고 있을 때 만약, 매개변수 타입의 인스턴스를 생성할 때, (T 변수명 = new)일경우 이타입의 메소드를 불러올 때, IDisposable을 체크해주지 않는다면, 리소스 누수가 일어날수있다고 한다. (using 변수명 as IDisposable..
제네릭을 사용하게 되면, 코드가 간결화 되지만, 타입을 제네릭화하면 그타입이 주는 특성을 잃어 버리게 된다. 그 특징을 활용하여 알고리즘을 최적화하는 게 좋다. => 타입 매개변수로 지정될 가능성이 있는 친구들에 대해 특화된 기능을 최대한 활용해 제네릭을 만들어 준다. 예시로, IList가 타입 매개변수로 들어오게 되면 IList일 경우 이런이런 기능을 쓰겠다고 해준다. 이렇게 함으로서 코드의 재사용성이 높아지고, 개별 타입에 대해 최적화된다. 실 예제를 자성할 필요가 있을 듯 하다..

이전에 싱글턴에 대해서 알아봤는 데, 간단히 말해 하나의 intance 만 만들어 놓고 여기저기서 가져오기 위한 패턴이다. 하지만, 싱글턴을 사용하고자 하는 클래스마다 싱글턴을 만들기엔 여러 문제가 있었고, 코드도 복잡하다. 또한, 싱글턴 패턴의 남용을 장려하지 않기 때문에, 잘 생각하고 만들어야한다. 유니티에서 싱글턴 클래스들을 한 곳으로 모아놓고 관리하는 게 편한데, 이를 위해 제네릭을 통한 싱글턴을 만들고자 한다. public class Singleton : MonoBehaviour where T : MonoBehaviour { private static T _Instance; public static T Instance { get { if (_Instance == null) { _Instance ..
C#의 제네릭은 타입을 특정하지 않고 데이터 타입 패러미터를 받아서 원하는 방식으로 처리를 해주는 방식이다. ex) public static void test (T left, T right) where T ~ 이렇게 생긴 친구들. T가 데이터 타입 패러미터라고 할수 있다. - 주로 컬렉션과 함께 사용해야 유용하다고 하는 의견들이 많다고 한다. 하지만, 인터페이스, 이벤트 핸들러, 공통 알고리즘에도 유용하다. - 제네릭 방식 -> 장점: 코드 짧아진다, 데이터가 준다, 박싱, 언박싱을 피할수 있다. 단점: 메모리 풋프린트가 많이 든다. (서로 다른 타입이 제네릭을 이용해 선언된다면, 서로 다른 머신 코드가 계속 파생되기 때문) List s, List d.. => 제네릭이 아닐 경우 하나의 머신코드 but,..

C#은 정적타이핑, 즉 데이터 타입을 미리 선언해줘서 컴퓨터의 부담을 덜어줄수 있다고 한다. 타입 불일치가 발생하더라도 컴파일러가 이를 확인해준다. object타입의 인자를 취하는 경우도 있는데, 이때 클래스나 혹은 인터페이스로 형변환하여 사용한다. 이렇게, 형변환의 사용이유들이 있는데, 그렇다면, c#에서는 형변환을 어떻게 할까 크게 두가지가 있다. 캐스팅과 is이다. 형변화을 할때 is를 사용하여 방어적인 코드, 쉽게 말해 null체크 같은 예외적인 상황을 대비 할수 있게 해준다. 캐스팅을 사용한다면, try-catch문으로 exception체크를 해줘야하는데, 가독성이 떨어진다. 반면, as를 사용할경우 형변환 실패시, null이 반환되므로 null체크만 해주면 되는데, 가독성 면에서 유리하다. a..

-왜 쓰는가? 프로퍼티는 속성이라는 의미가 있다. 이 프로퍼티를 사용하여 필드의 은닉성, 편의성을 고려하여 만들수있게 해주는 편의한 기능이다. 처음에는 솔직히 왜 쓰는지 이해가 가지 않았다. 그냥 다른 곳에서 쓰게 되면 public으로 클래스 내부에서만 쓰게 되면 private으로 쓰면 되지 않나 싶었다. 그래서 검색으로 해보니 코드가 길어지고 복잡 해질수록 데이터를 누가 어디서 가공하게 되는지 애매 해지고, 중요한 데이터일 경우 데이터가 원하는 방향이 아닌 식으로 변환 될수도 있다고 한다. 이를 방지 하기 위해서 은닉성을 추구하고, 어디서 데이터가 바뀐는 지 보기 쉽게 하기 위해, 프로퍼티를 사용한다고 한다. 또한, 데이터가 set, get이 불러올때 메소드를 정의하여 가공할수 있으니, 편리하다. 쉽게..

-들어가기에 앞서 객체지향 방식으로 개발을 하다보면, 클래스, 인스턴스화, 생성자, static 등 여러 용어가 나오면서 참조를 한다거나, 인스턴스를 만들어서 값만 변경해준다거나 하는 말을 많이 들어 봤을 것이다. 이러한 말을 이해 하기 위해선 작업 영역에 대한 근본적인 이해가 수반되어야 한다. 이번에는 이를 위한 내용을 다뤄 보고자 한다. 스택(stack) & 힙(heap) 스택(stack): 비교적 불안전한 메모리 영역이라 생각하면 좋다. 주로, int, double, float등 값타입의 메모리들이 들어간다. 이전 struct에서 다뤘던 내용에서 박싱과 언박싱에서 스택에 값이 들어가고 참조가 힙에 들어가는 이미지를 참고 하면 좋을 듯하다. 힙(heap): 안정적인 메모리영역. 주로 참조 타입이 머무..

객체지향의 4가지 속성 - 추상, 캡슐, 상속, 다형성 추상화 (Abstraction) 객체들의 공통적인 특징(기능, 속성)을 추출해서 정의하는 것 실제로 존재하는 객체들을 프로그램으로 만들기 위해 공통적인 특성을 파악한 후, 필요 없는 특성을 제거해 하나의 묶음으로 만들어내는 과정을 가르킨다. 객체지향적 관점에서는 클래스를 정의하는 것을 추상화라고 할 수 있다. ex) 게임에 대포를 만드는데 뭔가 필요할까..탄두방향 필요할것 같고, 탄두 범위도 필요할것같고, 공기저항은 총알에 줄까? 이런과정이 추상화 -> 이렇게 하면 큰대포, 작은 대포 등등 추가하여 쓸수 있다. 추상화하였기에. 쉽게말해, 프로그래밍에 들어가기 앞서 설계하는 단계라고 생각하면 된다. 캡슐화 (Encapsulation) 외부에서 객체를 ..