C# 31

[C#] 제네릭의 형식 제약

[C#] 제네릭의 형식 제약제네릭 클래스나 메소드에서 T는 모든 데이터형식을 대신 할 수 있다.그런데 종족 특정 조건에 해당하는 데이터형식만 받고 싶을 때가 있다.이럴때는 형식에 제약 조건을 줄 수 있다.where 형식 변수 : 제약조건제약조건 classclass ArrayGeneric where T : class { private T[] arr; public T GetElement(int index) {return arr[index];} }T는 참조 형식이어야 한다.위의 예제에서 T에 int나 float과 같은 값 형식은 들어올 수 없다.따라서, ArrayGeneric arr = new ArrayGeneric()와 같은 코드는 컴파일에러가 발생한다.제약조건 structclass ArrayGeneric ..

아카이빙/C# 2018.06.21

[C#] 제네릭 클래스

[C#] 제네릭 클래스제네릭 클래스는 어떠한 형식을 일반화한 클래스이다.제네릭 메소드를 이해했다면 쉽게 이해가능class ArrayInt { private int[] arr; public int GetElement(int index) {return arr[index];} } ​ class ArrayFloat { private float[] arr; public float GetElement(int index) {return arr[index];} }위의 두 클래스의 필드와 메소드는 데이터 형식만 다르고 내용은 완전히 같다.제네릭 클래스 예시class ArrayGeneric { private T[] arr; public T GetElement(int index) {return arr[index];} }제네..

아카이빙/C# 2018.06.21

[C#] foreach 가능한 객체 만들기

[C#] foreach 가능한 객체 만들기인덱서와 IEnumerable, IEnumerator 인터페이스를 활용하여 foreach가 가능한 객체를 만들수 있다.IEnumerableIEnumerator GetEnumerator() : IEnumerator 형식의 객체를 반환IEnumeratorboolean MoveNext() : 다음 요소로 이동한다. 컬렉션의 끝을 지나면 false, 이동 성공하면 true 반환void Reset() : 컬렉션의 첫 번째 위치의 앞으로 이동.Object Current {get;} : 컬렉션의 현재 위치를 반환Item 클래스class Item { public string Name{get;set;} public int Count{get;set;} ​ public overrid..

아카이빙/C# 2018.06.20

[C#] 인덱서

[C#] 인덱서인덱서(Indexer)는 인덱스를 이용해서 객체 내의 데이터에 접근하게 해주는 프로퍼티이다.인덱서 선언class 클래스이름 { 한정자 인덱서형식 this[형식 index] { get { // index를 이용하여 내부 데이터 변환 } set { // index를 이용하여 내부 데이터 저장 } } }Item 클래스를 정의하고, Item 배열을 필드로 갖는 ItemList 클래스에 인덱서를 활용해보자Item 클래스class Item { public string Name{get;set;} public int Count{get;set;} ​ public override string ToString() { return string.Format("(Name : {0}, Count : {1})", Na..

아카이빙/C# 2018.06.20

[C#] System.Array

[C#] System.ArrayC#에서는 모든 타입이 객체이다.배열도 당연히 객체이며, 기반이되는 클래스는 System.Array 이다.ForEach()private static void Print(int value) { Console.Write("{0} ", value); } ​ private static void PrintArray(int[] arr) { Array.ForEach(arr, new Action(Print)); Console.WriteLine(); } ​ static void Main() { int[] arr = {90, 65, 72, 88, 73, 91, 63}; PrintArray(arr); }배열의 모든 요소에 동일한 작업을 수행할 수 있다.Sort(), Reverse()Array...

아카이빙/C# 2018.06.20

[C#] 프로퍼티

[C#] 프로퍼티클래스를 작성하다보면 private 필드를 선언해야할 경우가 많다.이 private 필드를 다른 클래스에서 접근하게 하려면 getter, setter 메소드를 따로 정의해 줘야 하는 데 여간 귀찮은 일이 아닐 수 없다.class MyClass { private int myInt; public int GetMyInt() { return myInt; } public void SetMyInt(int newInt) { this.myInt = newInt; } } ​ class MainApp { static void Main() { MyClass instance = new MyClass(); instance.SetMyInt(5); ​ Console.WriteLine(instance.GetMyInt..

아카이빙/C# 2018.06.20

[C#] 추상클래스와 인터페이스

[C#] 추상클래스와 인터페이스추상클래스는 인터페이스와 달리 구현을 가질 수 있다.그러나 추상클래스는 인스턴스를 생성할 수는 없다.또한 추상클래스는 추상 메소드를 가질 수 있어, 인터페이스의 역할도할 수 있다.추상 클래스 구현abstract class AbstractBase { protected void PrivateMethod() { Console.WriteLine("AbstractBase.PrivateMethod()"); } public void PublicMethod() { Console.WriteLine("AbstractBase.PublicMethod()"); } public abstract void AbstractMethod(); }상속받은 클래스에서만 접근가능한 PrivateMethod어디서든..

아카이빙/C# 2018.06.18

[C#] 여러 인터페이스의 멤버를 명시적 구현

[C#] 여러 인터페이스의 멤버를 명시적 구현명시적 인터페이스 구현을 통해 이름이 같은 각 인터페이스 멤소드를 별도로 구현할 수있다.아래 예시는 섭씨온도와 화씨온도를 구하는 예시이며, 두 인터페이스 모두 GetTemperature()라는 공통 메소드를 가진다.ICelsius, IFahrenheit 인터페이스interface ICelsius { float GetTemperature(); } ​ interface IFahrenheit { float GetTemperature(); }ICelsius, IFahrenheit을 상속받은 Temperature 클래스class Temperature : ICelsius, IFahrenheit { float temperature; ​ public Temperature(f..

아카이빙/C# 2018.06.18

[C#] 인터페이스 다중 상속

[C#] 인터페이스 다중 상속C#에서 클래스는 여러 클래스를 동시에 상속할 수 없다.대신 인터페이스는 다중 상속이 가능하다.IUpgradable, ISellable 인터페이스interface IUpgradable { void Upgrade(); } ​ interface ISellable { void Sell(); }IUpgradable, ISellable을 상속받은 Monster 클래스//Monster는 업그레이드도 할 수 있고, 팔 수도 있다. class Monster : IUpgradable, ISellable { public int Level {get; set;} public int Price {get; set;} ​ public void Upgrade() { Console.WriteLine("Up..

아카이빙/C# 2018.06.18