[C#] 명쾌한 abstract 메소드와 virtual 메소드 차이점

왠지 모르게 다들 어렵게 설명한다.
데브피아만 가도 “abstract는 없으면 인스턴스 생성 안되고 virtual 은 없어도 인스턴스 생성된다…”
한국 종특인 돌려말하기인지 모르겠지만, 초보들에게는 더럽게 이해 안되는 답변이다.
심지어 그런거 모르냐, 책을 읽어라, 알게된다. 이지랄까지 하고 있으니…
선배 개발자들 맞는지 의문 투성이다 정말. 먹고살기 빠듯한 건 아는데 그렇게 가르쳐주기 귀찮았냐 하는 생각이 든다.
내가 후배 개발자를 위해 간단명료하게 설명한다.

자. 네가 얻은 새로운 집에 시멘트만 있는 방 내부를 꾸미게 됐어.
이게 abstract class 다.

벽지는 붙여야지? 안그럼 방이냐? 폐가지.
그리고 장판 깔아야지 안그럼 맨발로 방 못들어가잖아.
그래서 벽지와 장판 붙이는 기능을 가진 메소드를 abstract로 선언한다.

좋아. 벽지는 일단 붙였어. 그럼 벽지에 데코를 붙이는 생각도 했을거야.
예를 들면, 벽에 뭐 매달거나, 야광 스티커를 붙이거나 할거야.
근데 이건 안해도 지장 없잖아.
그래서 벽지 데코를 붙이는 메소드를 virtual로 선언한다.

이해했지?

public abstract class 추상인테리어{
    public abstract 벽지 벽지칠하기();
    public abstract 장판 장판붙이기();
    public virtual 데코레이션 데코붙이기(){
        return null; // 기본 데코 안붙일거다.
    }
}

public sealed class 철수인테리어 : 추상인테리어{
    public override 벽지 벽지칠하기(){
        var 벽지칠 = new 벽지();
        var 벽지색 = 벽지색깔.파란색;
        //벽지 칠하는 프로세스 구현
        return 벽지칠;
    }
    public override 장판 장판붙이기(){
        var 장판깔기 = new 장판(장판.흔한거);
        //장판 까는 프로세스 구현
        return 장판깔기;
    }
}

public class 영희인테리어 : 추상인테리어{
    public override 벽지 벽지칠하기(){
        var 벽지칠 = new 벽지();
        var 벽지색 = 벽지색깔.분홍색;
        벽지칠.패턴 = 벽지패턴.꽃무늬;
        //벽지 칠하는 프로세스 구현
        return 벽지칠;
    }
    public override 장판 장판붙이기(){
        var 장판깔기 = new 장판(장판.예쁜거);
        //장판 까는 프로세스 구현
        return 장판깔기;
    }
    public override 데코레이션 데코붙이기(){
        var 데코 = new 데코레이션();
        데코.종류 = 스티커.야광(색깔.초록색);
        //데코 붙이는 프로세스 구현
        return 데코.다붙였다();
    }
}

존나 흔한 이름으로 클래스 붙였다.
끗.

composite / 2015년 8월 21일 / Piss Development
태그:, , , , , , ,

Comments

  1. ted - 2017년 6월 19일 @ 12:02 오전

    와 대박이네요

    한방에 이해했어요 감사합니다!

    Reply
  2. ajh322 - 2017년 8월 17일 @ 8:57 오전

    ㄹㅇ

    “한국 종특인 돌려말하기인지 모르겠지만, 초보들에게는 더럽게 이해 안되는 답변이다.

    심지어 그런거 모르냐, 책을 읽어라, 알게된다. 이지랄까지 하고 있으니…”

    이거 개공감가네요 저만 느낀게 아니었나봐요

    그래서 한국에서는 카카오톡 이런 국내 자료 뺴고는 거의 안찾아봅니다

    Reply

답글 남기기

Your email address will not be published / Required fields are marked *