이번 포스팅에서는 오버라이딩(overriding)에 대한 개념과 오버라이딩을 하는 3가지 방법에 대해서 알아보겠습니다.
1. 오버라딩 기법 3가지
(1) 오버라이딩 기본 형태
Animal이라는 클래스와 Animal을 상속받은 Monkey라는 클래스가 있습니다.
그런데 이 두 클래스의 메소드가 완전히 같은 형태이네요.
결과를 실행하면 어떤 출력이 나올까요?
정답은 아래와 같습니다.
Output:
즉 부모 클래스의 메소드를 자식(파생) 클래스의 메소드가 덮어 쓴 상황이 일어났습니다.
이러한 현상을 우리는 오버라이딩이라고 합니다.
(오버로딩과 이름이 비슷하여 헷갈리시는 분들이 있을텐데요, 오버로딩은 해당 포스팅 내용을 참고바랍니다.)
(2) new 키워드 사용
그런데 아래 잘 보시면 정상적으로 실행되었음에도 불구하고 경고 메세지가 뜹니다.
내용을 정리하자면, 오버라이딩을 하기 위해서 "자식(파생) 클래스의 메소드를 쓰겠다"라고 명시적으로 적어주기를 요청하고 있는것입니다.
우리는 여기서 요청하는대로 new라는 키워드를 추가해보겠습니다.
마찬가지로 이렇게 작성하여도 결과는 똑같습니다.
(3) virtual, override 키워드 사용하기
마지막을 제가 가장 추천 드리는 방법인데요.
new를 사용할때는 자식 클래스의 메소드에만 표시를 해주었다면, 이번에는 부모 클래스, 자식 클래스 모두에게 명시적으로 표현해주는 방법입니다.
보시는것처럼 부모 클래스 메소드에는 virtual 키워드를 넣어줍니다.
이렇게 적어주는것만으로도 여러명이 개발을 진행할때, "아 이 기반 클래스를 상솓받아서 메소드를 재 정의하라는 뜻이구나" 라는 걸 알 수있게 되는거죠.
뿐만아니라 이렇게 적어주었을때 강력함은 다형성(polymorphism)에서도 발휘가 됩니다.
(관련내용은 다형성 포스팅에서 다루도록 하겠습니다.)
마지막으로 자식 클래스의 메소드에도 override라는 키워드를 적어 명시적으로 표현해주었습니다.
참고로 virtual을 사용하면, 자식(파생) 클래스에서 오버라이딩할 메소드 작성시 자동완성기능이 있으니 적극 사용하길 추천드립니다.
2. base 사용법
오버라이딩을 하면 더이상 부모 클래스의 메소드는 사용할 수 없을까요?
방법이 있는데요.
그때 사용하는것이 base입니다.
base라는 단어에서도 느낄수 있듯 base는 자식 클래스(Monkey)의 부모가 되는 클래스를 의미하고, 당연히 여기선 Animal이겠죠.
결과적으로 base.sleep();은 Anlmal.sleep();를 의미하게 됩니다.
출력을 해보면 부모 클래스 메서드가 실행이 되는걸 알 수 있습니다.
Output:
3. Sealed사용법
Sealed 키워드는 내가 만든 클래스를 다른 곳에 상속하지 못하게 막는 기법입니다.
만약 Animal클래스 앞에 sealed를 적으면 아래와 같이 상속을 받아 사용할 수 있었던 모든 기능을 사용할 수 없게 됩니다.
이 글과 읽으면 좋은글
'c#' 카테고리의 다른 글
[c# wpf] 마우스 이벤트(더블클릭, 오른쪽클릭, 왼쪽 클릭) 하는법 (0) | 2022.05.25 |
---|---|
[c#] 다형성(polymorphism) 이란? | 왜 사용하는가? + 오버라이딩 (1) | 2022.05.20 |
[c#] null값 다루기(nullable type, ?, ??) (0) | 2022.05.19 |
[c#] 생성자 오버로딩 개념 정리( + 다른 생성자 호출) (0) | 2022.05.19 |
[c#] visual studio 괄호 색깔이 검정으로 바뀌는 에러? (0) | 2022.05.19 |
댓글