상속
부모 클래스라 불리는 기존의 클래스를 확장하거나 재사용할 수 있는 자식 클래스라 불리는 새로운 클래스를 생성하는 것.
자식 클래스는 부모 클래스의 맴버를 상속받을 수 있으며, 부모 클래스의 기능을 확장하거나 새로운 클래스로 재정의하는 것이 가능하다. 코드를 재사용할 수 있고 계층 구조로 표현할 수 있으며 유지 보수가 증가한다.
- 단일 상속: 부모 클래스 하나, 자식 클래스 하나
- 다중 상속: 부모 클래스가 여러 개 (C#에서는 지원X)
- 인터페이스 상속: 인터페이스를 상속할 때만 다중 상속 가능. 하나의 클래스와 여러 개의 인터페이스를 상속한다.
// 부모 클래스
public class Animal
{
public string Name { get; set; }
public int Age { get; set; }
public void Eat()
{
Console.WriteLine("Animal is eating.");
}
public void Sleep()
{
Console.WriteLine("Animal is sleeping.");
}
}
// 자식 클래스
public class Dog : Animal
{
public void Bark()
{
Console.WriteLine("Dog is bark.");
}
}
public class Cat : Animal
{
public void Meow()
{
Console.WriteLine("Cat is meow.");
}
public void Sleep() // 부모 클래스인 Animal의 Sleep을 숨긴다
{
Console.WriteLine("Cat Sleep!");
}
}
static void Main(string[] args)
{
Dog dog = new Dog();
dog.Name = "Bobby";
dog.Age = 3;
dog.Eat();
dog.Sleep();
dog.Bark();
Cat cat = new Cat();
cat.Name = "Kkami";
cat.Age = 10;
cat.Eat();
cat.Sleep();
cat.Meow();
}
}
다형성
같은 타입이지만 다양한 동작을 수행할 수 있는 능력
가상 메서드
부모 클래스에서 정의되고 자식 클래스에서 재정의된다.
virtual 키워드를 사용하여 선언되며, 자식 클래스에서 필요에 따라 재정의 될 수 있다. 이를 통해 자식 클래스에서 부모 클래스의 메서드를 변경하거나 확장 가능하다.
// 가상 메서드
public class Unit
{
public virtual void Move() // virtual -> 자신을 상속한 자식들이 재구현 할 수 있음을 선언. 실형태가 다를 수 있음을 확인해라
{
Console.WriteLine("두발로 걷기");
}
public void Attack()
{
Console.WriteLine("Unit 공격");
}
}
public class Marine : Unit
{
}
public class Zergling : Unit
{
public override void Move() // override로 재정의
{
Console.WriteLine("네발로 걷기");
}
}
// 가상 메서드 호출
// #1 참조형태와 실형태가 같을때
Marine marine = new Marine();
marine.Move();
marine.Attack();
Zergling zergling = new Zergling();
zergling.Move();
zergling.Attack();
// Unit 클래스로 관리
// #2 참조형태와 실형태가 다를때
List<Unit> list = new List<Unit>();
list.Add(new Marine());
list.Add(new Zergling());
foreach (Unit unit in list)
{
unit.Move();
}
추상 클래스와 메서드
직접적으로 인스턴스를 생성할 수 없다. 주로 이걸 기점으로 만든다는 느낌으로 베이스로 사용된다.
abstract 키워드를 사용하여 선언되며, 추상 메서드는 추상 메서드를 포함할 수 있다. 선언만 하고 구현하지 않기 때문에 자식 클래스에서 반드시 구현되어야 한다.
// 추상클래스
abstract class Shape
{
public abstract void Draw();
}
class Circle : Shape
{
public override void Draw() // 추상 메서드를 상속 받았기 때문에 반드시 구현
{
Console.WriteLine("Drawing a circle");
}
}
class Square : Shape
{
public override void Draw()
{
Console.WriteLine("Drawing a square");
}
}
class Triangle : Shape
{
public override void Draw()
{
Console.WriteLine("Drawing a triangle");
}
}
// 추상 메서드 호출
// Shape shape = new Shape(); // 인스턴스를 만들 수 없음
List<Shape> list = new List<Shape>();
list.Add(new Circle());
list.Add(new Square());
list.Add(new Triangle());
foreach (Shape shape in list)
{
shape.Draw();
}
오버라이딩과 오버로딩
오버라이딩
부모 클래스에 이미 정의되어 있는 메서드를 자식이 재정의 하는 것.(덮어쓰기) 이때 메서드의 이름과 매개변수의 반환 타입이 똑같아야 한다.
부모의 클래스에 정의되어 있는 동작이 아니라 새로운 동작을 재구현 할 수 있다.
오버로딩
매개변수의 갯수나 타입, 순서가 다른 동일한 이름의 메서드들이 여러 개 있는 것.
함수를 읽어올 때 골라 읽어올 수 있다.
'부트캠프 > Study' 카테고리의 다른 글
C# 문법 4강(1) - 인터페이스와 열거형 (0) | 2023.11.10 |
---|---|
C# 문법 3강(3) - 고급 문법 및 기능 (0) | 2023.11.08 |
C# 문법 3강(1) - 클래스와 객체 (0) | 2023.11.08 |
C# 문법 2강 - 문제 풀이 (0) | 2023.11.08 |
C# 문법 2강(3) - 메서드와 오버로드, 구조체 (0) | 2023.11.07 |