Deep Copy 같은 클래스로 서로 다른 객체를 생성할 때, 클래스 내부의 필드 값을 각각 다르게 설정하려면 보통 new 키워드로 객체를 생성한 후 초기화 작업을 반복해야 한다. 하지만 이 작업을 간소화하려면, 클래스 내부에 자기 자신의 타입을 반환하는 메서드를 만들어 새로운 객체를 생성할 수 있다. class Knight{ public int hp; public int attack; public Knight Clone() { Knight knight2 = new Knight(); knight2.hp = this.hp; knight2.attack = this.attack; return knight2; }} ..
일반적으로 우리는 함수를 이용할 때 함수의 연산 이후함수의 body부분에서 값을 return하고, 함수를 호출한 부분에서 그 return된 값을 따로 저장하여 사용하였다.함수 내부의 연산은 호출이 끝나고 나면 기억되지 않지만, 함수가 끝나기 전에 return에 연산한 값을 복사하여 결과를 반환하는 방식이다. 하지만 return하여 따로 저장하기보다값 그 자체에 접근하여 연산해야 할 필요가 있는 경우 어떻게 해야할까? ref 는 매개변수 안의 값을 복사하여 계산하는 것이 아닌 값 주소를 참조하여 계산한다.때문에 함수를 벗어나도 매개변수 안의 값 또한 함수의 연산이 적용되어 함수 밖으로 빠져나온다. static void swap(ref int a, ref int b){ int temp = a; a..
lamda 함수 임의의 Item 클래스 중에서 특정 Item을 찾을 수 있는 기능을 구현한다고 하자.이 Item 안에는 ItemType과 Rarity라는 열거형이 포함되어 있다. static Item FindWeapon(){ foreach (Item item in _items) { if (item.ItemType == ItemType.Weapon) return item; } return null;}static Item FindRareItem(){ foreach (Item item in _items) { if (item.Rarity == Rarity.Rare) return item; } return null;}..
함수 자체를 함수의 인자로 넘겨서 나중에 필요할 때함수 안쪽에서 인자로 받은 함수를 역으로 호출하는 것을 call back 방식이라고 한다. 요약하면 함수 자체를 인자로 넘겨주는 방식이다. 주로 console.readline처럼 이미 만들어진 함수를 바꿀 수없는 경우 사용하게 된다.이미 만들어진 함수를 건드릴 수는 없지만, 함수를 인자로 받아서 호출하는 것을 통해이렇게 저렇게 건드릴 수 있는 것으로 무수한 활용 가능성이 있다. delegate 문법을 사용하면 그 함수 자체가 타입이 된다.타입은 타입인데 함수 자체를 인자로 넘겨주는 타입이다. delegate int OnClicked();// 의미 : 반환값 int, 입력값 void, OnClicked는 delegate 형식의 이름// UIstati..
은닉성이란, 불필요한 정보를 외부로 노출하지 않겠다는 것이다. 은닉성에 대해 설명할 때 봤었던 Get과 Set 함수들을 보면만약 정말 필요한 경우는 함수를 통해 접근 가능하도록 구현했었다. 참고로 Get과 Set 함수에 break point를 잡고 호출 스택을 보는 것으로 디버깅을 하면 편리하다. C++에서는 이렇게 get과 set 함수를 일일이 사용하는게 최선이었겠지만,C#에서는 더 편리한 property라는 문법이 있다. 함수랑 거의 비슷한데, 예를 들어 GetHp과 SetHp을 합친 프로퍼티를 만들어보자 class Knight{ protected int hp; public int Hp { get {return hp;} set {this.hp = value..
추상클래스는 클래스를 설계할 때 어떠한 행위에 강요를 주는 문법이다. 예를들어 부모 클래스를 상속받는다면 무조건 특정 함수를 오버라이딩해야 하는 경우, 클래스에 abstract를 붙인다. abstract class Monster{ public virtual void Shout() {}}class Orc : Monster{ public override void Shout() { // 구현 }} 위 코드의 경우, Monster class를 상속받은 오크 클래스는 반드시 Shout() 함수를 구현해야 한다. 이렇게 추상클래스를 만들었으면, 이 Monster 클래스는 인스턴스를 만들지 못하고 추상적으로만 사용하는 개념이 된 것이다.(new로 인스턴스 생성 시 오류) 추상 클래스 안에서는 함..