추상, 인터페이스
추상 vs 인터페이스
- c# 9.0 프로그래밍 책에는 c++에는 다중상속이있지만 c#은 단일 상속, 그렇지만 interface는 추가로 받아 구현할 수 있다고 적혀있지만 의미론적으로는 추상은 뼈대를 만들고 그에 해당하는 기능들은 인터페이스로 둘 수 있다고 다른? 곳에서 본 것같다
House class
- 집이라는 것을 추상클래스로 뼈대를 잡았다 그에 상응하는 door는 기능적으로 인터페이스로 조정할 수 있다.
public abstract class House
{
private String roof = "House roof";
private String wall = "House wall";
private Door door;
public void setDoor(Door door)
{
this.door = door;
}
public Door GetDoor()
{
return door;
}
public virtual void OpenDoor()
{
Console.WriteLine("Basic door opend");
}
public virtual void CloseDoor()
{
Console.WriteLine("Basic door closed");
}
}
Door의 인터페이스 , 구현체
public interface Door
{
public void OpenDoor();
public void CloseDoor();
}
public class MyDoor : Door
{
public void OpenDoor()
{
Console.WriteLine("MyDoor - Open");
}
public void CloseDoor()
{
Console.WriteLine("MyDoor - Close");
}
}
public class MyDoor : Door
{
public void OpenDoor()
{
Console.WriteLine("MyDoor - Open");
}
public void CloseDoor()
{
Console.WriteLine("MyDoor - Close");
}
MyHouse
public class MyHouse : House
{
public override void CloseDoor()
{
GetDoor().OpenDoor();
}
public override void OpenDoor()
{
GetDoor().CloseDoor();
}
}
Main
House myHouse = new MyHouse();
Door door = new MyDoor();
myHouse.setDoor(door);
myHouse.OpenDoor();
myHouse.CloseDoor();
- 위에서 보듯이 myHouse는 House를 상속을 받았다. 여기서 House의 door를 보면 set, get이 존재한다, 이 부분을 위해서 door를 MyDoor로 만들어 놓은 후 myHouse의 setDoor부분에 내가 만든 MyDoor를 넣으면 추상과 인터페이스의 역할을 충분히 할 수 있다.
도서관련 정리
as, is 연산자
- as는 형변환이 가능하다면 지정된 타입의 인스턴스 값을 반환하고, 가능하지 않으면 null을 반환하기 때문에 null 반환 여부를 통해 형변환이 성공했는지 판단할 수 있다. as 연산자는 참조형 변수에 대해서만 적용할 수 있다.
- as가 형변환 결과값을 반환하는 반면 is 연산자는 형변환의 가능성 여부를 불린형의 결과값으로 반환한다. as와 is 연산자를 언제 쓰느냐에 대한 기준은 , 형변환 인스턴스가 필요하다면 as, 필요없다면 is를...
- is는 참조뿐만아니라 값형식에도 적용가능..
int n = 5; if(n is string) { Console.WriteLine("변수n은 string") } ///////////////////////////////////// public class AS_IS { public static void Init() { Computer pc = new(); NoteBook noteBook = pc as NoteBook; if (noteBook != null) { Console.WriteLine("Asdfasdfasdf"); //실행되지않음.. } } }
public class Computer
{
}
public class NoteBook : Computer
{
}
- cf : Ojbect는 참조형임에도 값형식의 부모이기도하다... 닷넷에서는 모든 값을 System.Value.Type 타입에서 상속받게 하고잇으면 다시 이것은 object를 상속받고있다... 다이어그램 그림을 참조하면 눈에 훤하다..
- 시그니처는 어떤 메서드를 고유하게 규정할 수 있는 정보인데 , 이름 반환타입, 매개변수의 수, 개별 매개변수 타입인데..
콜백을 델리케이트로..
콜백이란 역으로 피호출자에서 호출자의 메서드를 호출하는 것을 의미하고 이때 역으로 호출된 "호출자 측의 메서드"를 "콜백 메서드"라고한다.
델리게이트와 object를 이용한 범용 정렬 코드..
public delegate bool CompareDelegate(object arg1, object arg2); // object 인자가 2개
public class SortObject
{
private object\[\] things;
public SortObject(object[] things)
{
this.things = things;
}
public void Sort(CompareDelegate compareDelegate)
{
object tmp;
for (int i = 0; i < things.Length; ++i)
{
int lowPos = i;
for (int j = i + 1; j < things.Length; ++i)
{
if (compareDelegate(things[j], things[i]))
{
lowPos = j;
}
}
tmp = things[lowPos];
things[lowPos] = things[i];
things[i] = tmp;
}
}
}
public class Sort
{
static bool AscSortByName(object arg1, object arg2)
{
Person person1 = arg1 as Person;
Person person2 = arg2 as Person;
return person1.name.CompareTo(person2.name) < 0;
}
}
public class Person
{
public string name;
}
- 위의 현상을 보면 외각에서 오름 내림을 잘 결정지으면 오름 내림 정렬 구문은 그 자체 코드에만 집중하면된다..
구조체..
- c#에서 구조체를 new로 생성하면 해당 변수의 모든 값을 0으로 할당하는 것과 동일... 조심해야할 것은 int n이 0으로된다고 그대로 두면안된다.. 바로 출력하게 개발자가 직접 코드에 값을 넣어주지않아서 오류라고 발생한다..!!
ref 예약어.
1)ref는 메서드의 매개변수를 선언할 때 함께 표기해야하고 2)해당 메서드를 호출하는 측에서도 명시해야한다.
단순히 참조로 전달과 ref의 차이를 살펴보는 예제
namespace ConsoleApp1;
public class Ref
{
//예제를 위해서 Init으로 명시.
public void Init()
{
Point pt1 = null;
}
public static void Change1(Point pt)
{
pt = new();
pt.X = 6;
pt.Y = 7;
}
public static void Change2(ref Point pt) // ref를 이용한 참조에 의한 호출
{
pt = new();
pt.X = 7;
pt.Y = 8;
}
}
public struct Vector
{
public int x;
public int y;
}
public class Point
{
public int X;
public int Y;
}
- 출처 : 시작하세요 c# 9.0 프로그래밍
'c#' 카테고리의 다른 글
Generic, where, using static (0) | 2022.12.06 |
---|---|
Task vs TaskValue (0) | 2022.12.06 |
추상 vs 인터페이스 (0) | 2022.12.05 |
c#의 init access 문법과 top level (0) | 2022.07.24 |
Immutable (0) | 2022.07.07 |