C# - C# 학습 정리 + Windows Form (2)

업데이트:

C# 프로그래밍

is 키워드

is 키워드를 사용하면 객체의 타입을 확인할 수 있습니다.

foreach (var item in Animals)
{
    if(item is Dog) { }
    if(item is Cat) { }
}

만약 Dog 객체일때, Animal과 Object임을 확인하여도 다형성의 개념이 들어가 모두 true를 출력하게 됩니다.

if(item is Animal)
if(item is Object)


this와 base

  • 현재 클래스의 멤버를 사용할 때에는 this.
  • 부모 클래스의 멤버를 사용할 때에는 base.


형 변환

  • (클래스) 변수: 실패할 경우, 예외를 발생시킵니다.
  • 변수 as 클래스: 실패해도 예외를 발생시키지않고 단지 null을 넣게 됩니다. 따라서 일반적으로 다음과 같이 사용합니다.
foreach (var item in Animals)
{
    var dog = item as Dog;
    if (dog != null) { dog.Bark(); }
}


상속과 생성자

자식 인스턴스를 생성하면 부모클래스의 멤버 초기화를 위해 부모 생성자가 우선적으로 호출됩니다.

명시적으로 부모 생성자를 호출하도록 할 수도 있습니다.

class Child: Parent
{
    public Child(): base()
    {
        Console.WriteLine("자식");
    }
}


섀도잉과 하이딩

섀도잉

class Program
{
    public static int number = 10;

    static void Main(string[] args)
    {
        int number = 20;
        Console.WriteLine(number);
    }
}

여기서 출력은 20이 되게 됩니다. 변수의 이름이 겹칠 때, 가장 가까운 변수를 사용하기 때문입니다.

  • 섀도잉: 이처럼 특정한 영역에서 이름이 겺쳐서 다른 변수를 가리는 것

하이딩

class Program
{
    class Parent
    {
        public int variable = 273;
    }

    class Child: Parent
    {
        public string variable = "shadowing";
    }

    static void Main(string[] args)
    {
        Child child = new Child()
        Console.WriteLine(child.variable);
    }
}

다음과 같이 호출이 된다면 역시 가장 가까운 child 클래스의 변수를 출력합니다.

  • 하이딩: 하이딩을 하게되면 정상직인 상속을 막을 수 있습니다.

하지만 명시적으로 부모 클래스의 변수를 실행하도록 할 수도 있습니다.

Console.WriteLine(((Parent)child).variable);


하이딩과 오버라이딩

new 메서드

하이딩을 했을 경우, 하이딩됨을 명확하게 알려주어야합니다. 그떄 사용하는데 new 메서드 입니다.
new 키워드를 사용하면 이 멤버를 하이딩하겠다고 명확하게 선언할 수 있습니다.

class Program
{
    class Parent
    {
        public int variable = 273;
    }

    class Child: Parent
    {
        public new string variable = "shadowing";
    }

    static void Main(string[] args)
    {
        Child child = new Child()
        Console.WriteLine(child.variable);
    }
}


virtual과 override 메서드

다른 언어와 마찬가지로 오버라이딩을 할 수 있습니다.
부모 메서드에 virtual, 자식 메서드에 override 키워드를 달아주면 됩니다.

class Program
{
    class Parent
    {
        public virtual void method()
        {
            Console.WriteLine("부모");
        }
    }

    class Child: Parent
    {
        public override void method()
        {
            Console.WriteLine("자식");
        }
    }

    static void Main(string[] args)
    {
        Child child = new Child()
        ((Parent)child).method();
    }
}

다음과 같이 오버라이딩하면 부모 메서드를 자식메서드가 덮어씌운 형태가되어 ‘자식’이 출력됩니다.


하이딩 vs 오버라이딩

  • 하이딩: 멤버 전처에서 모두 일어남
  • 오버라이딩: 메서드와 관련되어서만 일어남


상속과 오버라이딩 제한

상속과 오버라이딩을 임의로 제한할 수 있습니다.

sealed 메서드

클래스에 적용하면 상속을 제한하고 메서드에 적용하면 오버라이딩을 제한합니다.

// 클래스
sealed class Parent
{

}

// 메서드 (특정 지점에서 오버라이딩을 제한함)
sealed public override void Test()
{

}


abstract 키워드

abstract 키워드는 클래스의 경우 반드시 상속을 강요하고 메서드의 경우 오버라이딩을 강요합니다.

// 클래스 (abstract 키워드가 붙은 클래스는 추상클래스로 인스턴스를 생성할 수 없습니다)
abstract class Parent
{
    
}

// 메소드 (abstract 메소드는 반드시 abstract 키워드가 붙은 클래스안에 있어야합니다. 또한 함수의 내용을 정의하지않고 선언만 합니다.)
// 부모 메소드에 virtual 키워드를 입력하지 않는건, abstract가 반드시 오버라이딩을 해달라는 의미이기때문에 불필요하기 때문입니다.
abstract class Parent
{
    public abstract void Test();
}

class Child: Parent
{
    public override void Test() { }
}


enum 자료형(열거자)

enum 자료형은 숫자값에 이름을 부여하여 가독성을 증가시킴과 동시에 오류발생을 줄일 수 있습니다.

enum OrderState { Ordered, Paymented, Prepared, Sended };

class Program
{
    static OrderState OrderCheck(int order)
    {
        return OrderState.Ordered;
    }


    static void Main(string[] args)
    {
        if (OrderCheck(12345) == OrderState.Ordered)
        {
            Console.WriteLine("주문 완료");
        }
    }
}


윈도우 폼

모달리스

모달리스란 새로운 폼을 띄웠을때 기존의 폼을 조작할 수 있는 형태를 말합니다.
일반적으로 새로 실행시킬 폼에 form.show()를 호출하면 모달리스 형태의 폼입니다.

모달으로 사용하려면 form.ShowDialog()를 호출하면 됩니다.


MDI

MDI는 하나의 화면 내부에 여러 개의 화면을 띄우는 것입니다.

public Form1()
    {
        InitializeComponent();
        IsMdiContainer = true;  // 자신을 Mdi 컨테이너로 설정
        myButton.Text = "코드에서 변경";
        Button button = new Button();
        Controls.Add(button);
        button.Location = new Point(13, 13+23+3);
        button.Text = "동적 생성";

        myButton.Click += myButton_Click;
    }

    private void myButton_Click(object sender, EventArgs e)
    {
        CustomForm form = new CustomForm();
        form.MdiParent = this;  // Mdi 부모를 자기자신(Form1)로 설정
        form.Show();
        Button self = (Button)sender;
        self.Text += "야야";
    }


  • 참고자료: C# 프로그래밍 - 한빛아카데미

댓글남기기