📝 23.12.29
2023년의 마지막 개발 일지이다. 한 해의 마지막인만큼 열심히 강의를 수강했다. 기존에 알던 것들을 재복습하는 시간이지만, 평소 헷갈리던 것을 재정리하는 시간을 가질 수 있었다.
가상 메서드는 기본적으로 부모 클래스에서 정의되고 자식 클래스에서 재정의할 수 있는 메서드이다. virtual키워드를 사용하여 선언되는데, 자식 클래스에서 필요에 따라 재정의할 수도 있다. 하지만 재정의를 강제하지는 않는다.
public class Unit
{
public virtual void Move()
{
Console.WriteLine("두발로 걷기");
}
public void Attack()
{
Console.WriteLine("Unit 공격");
}
}
public class Marine : Unit
{
}
public class Zergling : Unit
{
public override void Move()
{
Console.WriteLine("네발로 걷기");
}
}
추상 클래스는 직접적으로 인스턴스를 생성할 수 없는 클래스이다. 주로 상속을 위한 베이스 클래스로 사용되는 것인데, 구현부가 없는 메서드이기 때문에 자식 클래스에서 구현하는 것을 강제한다. 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");
}
}
위의 설명에서 알 수 있듯 오늘은 상속과 관련된 것을 배운 것인데, 여기서 나오는 헷갈리는 개념이 오버라이딩과 오버로딩이다.
1. 오버라이딩
- 부모 클래스에서 이미 정의된 메서드를 자식 클래스에서 재정의하는 것을 의미합니다.
- 이는 상속 관계에 있는 클래스 간에 발생하며, 메서드의 이름, 매개변수 및 반환타입이 동일해야 합니다.
- 오버라이딩을 통해 자식 클래스는 부모 클래스의 메서드를 재정의하여 자신에게 맞는 동작을 구현할 수 있습니다.
public class Shape
{
public virtual void Draw()
{
Console.WriteLine("Drawing a shape.");
}
}
public class Circle : Shape
{
public override void Draw()
{
Console.WriteLine("Drawing a circle.");
}
}
Shape shape1 = new Circle();
shape1.Draw(); // Drawing a circle.
2. 오버로딩
- 동일한 메서드 이름을 가지고 있지만, 매개변수의 개수, 타입 또는 순서가 다른 여러 개의 메서드를 정의하는 것을 의미합니다.
- 오버로딩을 통해 동일한 이름을 가진 메서드를 다양한 매개변수 조합으로 호출할 수 있습니다.
public class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
public int Add(int a, int b, int c)
{
return a + b + c;
}
}
Calculator calc = new Calculator();
int result1 = calc.Add(2, 3); // 5
int result2 = calc.Add(2, 3, 4); // 9
평소에 어렴풋이 알고있던, 혹은 헷갈리던 개념을 명확하게 배울 수 있던 시간이었다. 텍스트 rpg 만들기 과제에서도 이를 활용할 일이 많을 것 같아서 정확하게 숙지하려고 노력하였다.