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# 프로그래밍 - 한빛아카데미
댓글남기기