본문 바로가기

C#/이것이 C#이다

8장. 인터페이스와 추상 클래스

반응형

1. 인터페이스의 선언과 활용

// 1. 인터페이스의 선언
    interface ILogger
    {
        void WriteLog(string log);
    }

2. 인터페이스의 구현 vs 상속

우선 둘의 가장 큰 차이점은 "왜" 만들어졌냐입니다.
구현이 다중상속을 지원하기 위해서 만들어졌다는 말도 있지만 이것은 맞는 말은 아닙니다. (라고 들었습니다.)


구현(implements): 특정 메소드를 꼭 만들라 강제

구현은 특정 인터페이스를 클래스에서 구현한다는 것을 의미합니다.
이를 통해 인터페이스에서 정의한 메서드에 강제력이 생깁니다.
따라서, 해당 인터페이스를 구현한 클래스에서는 인터페이스의 메서드를 재정의함으로써 구현해야 합니다.

상속(extends): 다형성을 위해서 만들어짐

상속은 자식이 부모의 특징을 상속받아서 사용가능하다는 특징을 가집니다.
이를 통해 코드의 재사용성을 높이고 코드의 중복성을 최소화할 수 있습니다.
따라서, 자식은 부모의 특징을 상속받아 사용함으로써 코드의 효율을 높일 수 있고,
또한 자식이 원하는 특징을 추가 및 확장하는 것이 가능합니다.
참고로 여러 개를 상속하는 것은 불가능합니다.

 

[JAVA] 상속(extends)과 구현(implements)의 차이

■ 상속(extends) 상속은 자식이 부모의 특징을 상속받아서 사용가능하다는 특징이 있습니다. 이를 통해 코드의 재사용성을 높이고 코드의 중복성을 최소화 할 수 있습니다. 따라서 자식은 부모의

hyunmin1906.tistory.com


3. 추상 클래스

추상 클래스: 인터페이스와 달리 멤버를 구현할 수 있으나, 인스턴스는가질 수 없는 클래스입니다.
목적은 자식 클래스에서 공유할 수 있도록 추상 클래스(부모)의 공통적인 정의를 제공하는 것입니다.

abstract class 클래스이름
{
    // 클래스와 동일한 구현
}

 

 

C# 추상 클래스 (abstract) / 추상 메서드

추상 클래스는 인터페이스와 달리 멤버를 구현할 수 있습니다. 그러나 인스턴스를 가질 수 없습니다. 추상 클래스는 abstract 키워드를 사용합니다. abstract class 클래스이름 { // 클래스와 동일한 구

qzqz.tistory.com

 

C# 6. 추상클래스, 인터페이스

추상 클래스 (Abstract class) 추상 클래스란 미완성된 클래스를 말합니다. 클래스가 미완성이라는 것은 ...

blog.naver.com


4. 추상 메서드

추상화된 메서드를 담고 있는 클래스는 추상 클래스로, abstract 키워드로 설정해주어야 한다.

abstract class Animal
{
    public string name;
    public abstract void Move();
    public void Move2();
    {
    	Console.WriteLine("일반 메소드");
    }
}
// 추상 메서드 구현
class Dog : Animal
{
    public override void Move()
    {
        Console.WriteLine("네 발로 이동한다.")'
    }
}

5. 프로퍼티

프로퍼티란 필드에 대한 getter, setter 메소드라고 이해하면 편하다.

 class 클래스명
{
    데이터타입 필드명;
    접근한정자 데이터타입 프로퍼티명
    {
        get
        {
            return 필드명;
        }
        set
        {
            필드명 = value;
        }
    }
}
 

C# 강좌 21편. 프로퍼티(Property)

1. 프로퍼티(Property) 프로퍼티(Property)는 속성이란 의미를 가지고 있습니다. 이 프로퍼티를 사용하게 되면, 속성 값을 반환하거나 새 값을 할당할 수 있습니다. 우리가 클래스를 하나 만들다가 필

blog.hexabrain.net

 

자동 구현 프로퍼티

 class 클래스명
{
    데이터타입 필드명{ get; set; }
}
자동 구현 프로퍼티를 사용하면 더 간단하게 구현할 수 있다 (컴파일러가 자동으로 private 필드를 생성해준다).
 

C#의 자동 구현 프로퍼티 (Auto-Implemented Properties, 자동 구현 속성)

C#에는 프로퍼티라는 개념이 있습니다. 프로퍼티는 객체지향 패러다임의 정보은닉을 좀 더 간결하고 간단하게 구현 할 수 있도록 해줍니다. class MyClass { private string name; public string GetName(){ return n

dobby-the-house-elf.tistory.com


6. 무명 형식

무명 형식: 선언과 동시에 인스턴스를 할당하고, 인스턴스를 만들고 다시는 사용하지 않을 때 사용

var a = new { Name = "보영", Age = 22 };
Console.WriteLine("Name: {0}, Age: {1}", a.Name, a.Age);

var b = new { Subject = "수학", Scores = new int[] { 90, 80, 88, 95 } };
Console.Write("Subject: {0}, Scores: ", b.Subject);
foreach(var score in b.Scores)
    Console.Write("{0} ", score);
Scores에서 무명 형식을 만듦

 

 

C# 무명 형식 (Anonymous Type)

무명 형식은 선언과 동시에 인스턴스를 할당하고 인스턴스를 만들고 다시는 사용하지 않을 때 사용합니다. 무명 형식의 인스턴스는 프로퍼티에 접근하여 사용할 수 있습니다. 그러나 무명 형식

qzqz.tistory.com


정리. Logger 인터페이스 구현

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestConsoleApp_4._20
{
    // 1. 인터페이스의 선언
    interface ILogger
    {
        void WriteLog(string log);
    }

    // 2. 인터페이스의 활용
    class ConsoleLogger : ILogger
    {
        public void WriteLog(string message)
        {
            Console.WriteLine(message);
        }
    }

    class FileLogger : ILogger
    {
        public void WriteLog(string message)
        {
            Console.WriteLine($"파일에 작성합니다: {message}");
        }
    }

    class ClimateMonitor
    {
        private ILogger logger;
        public ClimateMonitor(ILogger logger)
        {
            this.logger = logger;
        }

        public void Start()
        {
            logger.WriteLog("시작합니다");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // 1. 인터페이스의 선언
            ILogger logger = new ConsoleLogger();
            logger.WriteLog("Hello");

            // 2. 인터페이스의 활용
            var monitor1 = new ClimateMonitor(new ConsoleLogger());
            var monitor2 = new ClimateMonitor(new FileLogger());
            monitor1.Start();
            monitor2.Start();
            Console.ReadLine();
        }
    }
}

 

작업 소스 (개인 기록용 private)

https://github.com/bonjenny/CHash/tree/main/8%EC%9E%A5%20-%20%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4%EC%99%80%20%EC%B6%94%EC%83%81%ED%81%B4%EB%9E%98%EC%8A%A4

반응형