함수 자체를 함수의 인자로 넘겨서 나중에 필요할 때함수 안쪽에서 인자로 받은 함수를 역으로 호출하는 것을 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로 인스턴스 생성 시 오류) 추상 클래스 안에서는 함..
만약에 나만의 리스트를 만들고 싶을 때, 리스트의 타입마다 하나씩 만들 수도 있을 것이다.그렇다면 이 때, 각 타입의 리스트를 선언하기 위해 매번 다시 새롭게 선언해야 할까? 이를 위해 우선 생각해볼 수 있는 문법이 object이다.object 타입은 어떤 타입을 받아도 소화할 수 있다.하지만 반환할 때 캐스팅을 해야 한다.object obj = 3;object obj2 = "hello";int num = (int)obj;string str = (str)obj2; var 라는 것도 비슷하지만 조금 다르다.var는 타입을 명시적으로 입력하지 않아도 할당받은 값을 보고 컴파일러가 적당히 때려맞춘다는 느낌이다.그래서 우리가 코드편집기에 값을 입력하자마자 바로 해당 타입이 된다. (그래서 여러개 받기는..
배열int[] arr = new int[5]// int[5]로 저장공간을 확정해줄수도 있지만 비워놓고 뒤에 따로 선언해도 무관int[] arr = new int[]{0,1,2,3,4}// 심지어 new int[]도 쓰기 귀찮아서 바로 element 해도 괜찮음int[] arr = {0,1,2,3,4} 보통 배열이라는 것을 더 가독성있게 표현하려고 new int[ ]를 많이 사용한다고 한다. 배열은 참조형식이라서 해당 변수 이름에 주소를 넣어서 스택에 저장하고,주소에 있는 데이터들 (본체?)를 힙에 저장한다. 위 배열의 선언은 1차원 배열이고, 다차원 배열 또한 이와 같은 방식으로 선언한다. int[ , ] map = new int [2, 3];int [][] a = new int[3][];a[0] = ..
상속성 부모의 필드와 메소드를 상속받는 것으로 자식 클래스 또한 해당 데이터를 사용할 수 있음매번 같은 필드나 메소드를 다시 선언할 필요가 줄어든다.class Player { public Player() { // 초기화 }}class Knight : Player{ public Knight() : base() { // 부모 클래스의 생성자 값 가져오기 }} 실행 로직은 부모에 선언된 필드나 메소드를 한번 다 실행 후에 자식 클래스를 실행한다. 우리는 부모에 있는 생성자와 자식 클래스에 선언된 생성자 중 어떤 것을 호출할 지 선택할 수 있다.자식 클래스의 생성자에 : this.Class() 를 사용하거나: base()를 통해 부모 클래스에 있는 생성자 값들을 불러올..