λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ–₯️/C#

[C#] μΈν„°νŽ˜μ΄μŠ€μ™€ μΆ”μƒν΄λž˜μŠ€

by HanaV 2023. 8. 18.
728x90

μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†λ°›λŠ” 것과 클래슀λ₯Ό μƒμ†λ°›λŠ” κ²ƒμ˜ 차이점

μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†λ°›λŠ” 것 (Interface Inheritance)

μΈν„°νŽ˜μ΄μŠ€λŠ” λ©”μ„œλ“œ μ‹œκ·Έλ‹ˆμ²˜(이름, λ§€κ°œλ³€μˆ˜, λ°˜ν™˜ κ°’)만 μ •μ˜ν•œλ‹€. 
ν΄λž˜μŠ€κ°€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†λ°›μœΌλ©΄ ν•΄λ‹Ή ν΄λž˜μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€κ°€ μ •μ˜ν•œ λ©”μ„œλ“œλ“€μ„ λͺ¨λ‘ κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€. (ν•˜λ‚˜λΌλ„ κ΅¬ν˜„λ˜μ§€ μ•ŠμœΌλ©΄ 컴파일 μ—λŸ¬κ°€ λ‚œλ‹€.)
그리고 닀쀑상속이 κ°€λŠ₯ν•˜λ‹€. (μ‰Όν‘œ(,)둜 이어쓰면 λœλ‹€.)

interface IShape
{
    double CalculateArea();
}

class Circle : IShape
{
    double radius;

    public Circle(double r)
    {
        radius = r;
    }

    public double CalculateArea()
    {
        return Math.PI * radius * radius;
    }
}

class Square : IShape
{
    double side;

    public Square(double s)
    {
        side = s;
    }

    public double CalculateArea()
    {
        return side * side;
    }
}

class Program
{
    static void Main()
    {
        IShape circle = new Circle(5);
        IShape square = new Square(4);

        Console.WriteLine($"Circle Area: {circle.CalculateArea()}");
        Console.WriteLine($"Square Area: {square.CalculateArea()}");
    }
}

 

클래슀λ₯Ό μƒμ†λ°›λŠ” 것 (Class Inheritance)

클래슀 상속은 κΈ°μ‘΄ 클래슀의 λͺ¨λ“  멀버(ν•„λ“œ, λ©”μ„œλ“œ)와 λ™μž‘μ„ μƒμ†λ°›λŠ” 것이닀.
μƒμ†λœ ν΄λž˜μŠ€λŠ” κΈ°μ‘΄ 클래슀의 λͺ¨λ“  κΈ°λŠ₯κ³Ό λ™μž‘μ„ κ·ΈλŒ€λ‘œ μ‚¬μš©ν•  수 있고, μ˜€λ²„λΌμ΄λ”©μ„ 톡해 λ™μž‘μ„ λ‹€λ₯΄κ²Œ ν•  μˆ˜λ„ μžˆλ‹€.
μΈν„°νŽ˜μ΄μŠ€μ™€ 달리 ν΄λž˜μŠ€λŠ” 닀쀑상속이 λΆˆκ°€λŠ₯ν•˜λ‹€. 기본적으둜 ν•˜λ‚˜μ˜ 클래슀만 상속받을 수 μžˆλ‹€.

using System;

class Vehicle
{
    public void StartEngine()
    {
        Console.WriteLine("Engine started");
    }

    public void StopEngine()
    {
        Console.WriteLine("Engine stopped");
    }
}

class Car : Vehicle
{
    public void Drive()
    {
        Console.WriteLine("Car is driving");
    }
}

class Program
{
    static void Main()
    {
        Car myCar = new Car();
        myCar.StartEngine();
        myCar.Drive();
        myCar.StopEngine();
    }
}

 

μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§Œλ“œλŠ” 이유

  • 기쑴의 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μž¬μ‚¬μš©ν•˜λ©΄μ„œ ν™•μž₯ν•  수 μžˆλ‹€.
  • κΈ°μ‘΄ μ†ŒμŠ€ μ½”λ“œμ— 영ν–₯을 주지 μ•Šκ³  μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•  λ•Œ, μΈν„°νŽ˜μ΄μŠ€λ₯Ό 직접 μˆ˜μ •ν•˜λ©΄ 이 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†ν•˜λŠ” ν΄λž˜μŠ€λ“€ 전뢀에 컴파일 였λ₯˜κ°€ 생긴닀. 이 λ•Œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λ©΄ μ’‹λ‹€.
using System;

interface IShape
{
    void Draw();
}

interface IResizableShape : IShape
{
    void Resize(int width, int height);
}

class Rectangle : IResizableShape
{
    public void Draw()
    {
        Console.WriteLine("Drawing a rectangle");
    }

    public void Resize(int width, int height)
    {
        Console.WriteLine($"Resizing rectangle to {width}x{height}");
    }
}

class Circle : IShape
{
    public void Draw()
    {
        Console.WriteLine("Drawing a circle");
    }
}

class Program
{
    static void Main()
    {
        IResizableShape rectangle = new Rectangle();
        rectangle.Draw();
        rectangle.Resize(10, 5);

        IShape circle = new Circle();
        circle.Draw();
    }
}

μœ„ μ½”λ“œλ₯Ό μ„€λͺ…ν•˜μžλ©΄

  • IShape μΈν„°νŽ˜μ΄μŠ€: Draw λ©”μ„œλ“œ μ •μ˜
  • IResizableShape μΈν„°νŽ˜μ΄μŠ€: IShape μΈν„°νŽ˜μ΄μŠ€λ₯Ό 상속(Draw λ©”μ„œλ“œ) + Resize λ©”μ„œλ“œ μ •μ˜
  • Rectangle 클래슀: IResizableShape μΈν„°νŽ˜μ΄μŠ€μ˜ Draw λ©”μ„œλ“œ, Resize λ©”μ„œλ“œ κ΅¬ν˜„
  • Circle 클래슀: IShape μΈν„°νŽ˜μ΄μŠ€μ˜ Draw λ©”μ„œλ“œ κ΅¬ν˜„

 

μΈν„°νŽ˜μ΄μŠ€μ˜ κΈ°λ³Έ κ΅¬ν˜„ λ©”μ„œλ“œ

μΈν„°νŽ˜μ΄μŠ€λŠ” 본래 λ©”μ„œλ“œλ₯Ό μ •μ˜ν•˜κΈ°λ§Œ ν–ˆμ§€, κ΅¬ν˜„ν•˜μ§€λŠ” μ•Šμ•˜λ‹€. 그리고 μΈν„°νŽ˜μ΄μŠ€λ₯Ό 상속받은 ν΄λž˜μŠ€μ—μ„œλŠ” μ •μ˜λœ λ©”μ„œλ“œλ₯Ό λͺ¨λ‘ κ΅¬ν˜„ν•΄μ•Όν–ˆλ‹€.
ν•˜μ§€λ§Œ μΈν„°νŽ˜μ΄μŠ€μ—μ„œ κ΅¬ν˜„μ„ ν•˜κ²Œ 되면, ν΄λž˜μ„œμ—μ„œλŠ” 이 λ©”μ„œλ“œλ“€μ΄ 이미 κ΅¬ν˜„μ΄ λ˜μ–΄μžˆκΈ° λ•Œλ¬Έμ— λ°˜λ“œμ‹œ κ΅¬ν˜„μ„ ν•΄μ•Όν•˜λŠ” λ¬Έμ œκ°€ 없어진닀. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 선택적 κ΅¬ν˜„μ΄ κ°€λŠ₯해진닀.

using System;

public interface ICalculator
{
    int Add(int a, int b);

    // κΈ°λ³Έ κ΅¬ν˜„ λ©”μ„œλ“œ
    // 이 λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ“œν•˜μ§€ μ•ŠλŠ” ν΄λž˜μŠ€λŠ” 이 κΈ°λ³Έ κ΅¬ν˜„μ„ μ‚¬μš©ν•˜κ²Œ 됨
    int Subtract(int a, int b)
    {
        return a - b;
    }
}

public class BasicCalculator : ICalculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }
    
    // Subtract λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ“œν•˜μ§€ μ•Šμ•„λ„ 됨
}

public class AdvancedCalculator : ICalculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }

    // κΈ°λ³Έ κ΅¬ν˜„ λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ“œν•˜μ—¬ κ³ μœ ν•œ λ™μž‘μ„ μ •μ˜ν•¨
    public int Subtract(int a, int b)
    {
        return Math.Abs(a - b);
    }
}

class Program
{
    static void Main()
    {
        ICalculator basicCalc = new BasicCalculator();
        ICalculator advancedCalc = new AdvancedCalculator();

        Console.WriteLine("Basic Calculator:");
        Console.WriteLine("Add: " + basicCalc.Add(5, 3));
        Console.WriteLine("Subtract: " + basicCalc.Subtract(10, 4));

        Console.WriteLine("\nAdvanced Calculator:");
        Console.WriteLine("Add: " + advancedCalc.Add(8, 2));
        Console.WriteLine("Subtract: " + advancedCalc.Subtract(4, 10));
    }
}

 

좔상 클래슀

좔상 ν΄λž˜μŠ€λ„ μΈν„°νŽ˜μ΄μŠ€μ²˜λŸΌ κ΅¬ν˜„λΆ€κ°€ μ—†λŠ” λ©”μ„œλ“œλ₯Ό 가지고 μžˆλ‹€. μ΄λ ‡κ²Œ κ΅¬ν˜„λΆ€κ°€ μ—†λŠ” λ©”μ„œλ“œλ₯Ό μΆ”μƒλ©”μ„œλ“œλΌκ³  ν•œλ‹€. μΆ”μƒν΄λž˜μŠ€λ„ λ§ˆμ°¬κ°€μ§€λ‘œ μƒμ†λ°›μœΌλ©΄ 이 좔상 λ©”μ„œλ“œλ“€μ„ μ „λΆ€ κ΅¬ν˜„μ„ ν•΄μ•Όν•œλ‹€.
μΈν„°νŽ˜μ΄μŠ€μ™€μ˜ 차이점이라면, 좔상 ν΄λž˜μŠ€λŠ” κ΅¬ν˜„λΆ€κ°€ μžˆλŠ” 일반 λ©”μ„œλ“œλ„ 포함할 수 μžˆλ‹€. 즉, 좔상 ν΄λž˜μŠ€λŠ” ν•˜λ‚˜ μ΄μƒμ˜ 좔상 λ©”μ„œλ“œλ₯Ό ν¬ν•¨ν•˜κΈ°λ§Œ ν•˜λ©΄ λœλ‹€. 그리고 클래슀이기 λ•Œλ¬Έμ— 닀쀑상속이 μ•ˆ λœλ‹€.

*좔상 λ©”μ„œλ“œκ°€ μ•„λ‹Œ 좔상 ν”„λ‘œνΌν‹°λ₯Ό ν•˜λ‚˜λ§Œ ν¬ν•¨ν•˜κ³  μžˆμ–΄λ„ λœλ‹€.

using System;

abstract class Shape
{
    public abstract double CalculateArea(); // 좔상 λ©”μ„œλ“œ
}

class Circle : Shape
{
    private double radius;

    public Circle(double r)
    {
        radius = r;
    }

    public override double CalculateArea()
    {
        return Math.PI * radius * radius;
    }
}

class Rectangle : Shape
{
    private double width;
    private double height;

    public Rectangle(double w, double h)
    {
        width = w;
        height = h;
    }

    public override double CalculateArea()
    {
        return width * height;
    }
}

class Program
{
    static void Main()
    {
        Circle circle = new Circle(5);
        Rectangle rectangle = new Rectangle(4, 6);

        Console.WriteLine("Circle Area: " + circle.CalculateArea());
        Console.WriteLine("Rectangle Area: " + rectangle.CalculateArea());
    }
}
728x90

"); wcs_do();