본문 바로가기
c#

c# (시작하세요 c# 프로그래밍 도서 )

by kcj3054 2022. 12. 5.

추상, 인터페이스

추상 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