게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
오버라이딩 관련 질문
게시물ID : programmer_22228짧은주소 복사하기
작성자 : IPID
추천 : 0
조회수 : 902회
댓글수 : 6개
등록시간 : 2018/03/25 18:18:40
옵션
  • 창작글
초보인데요.
override 개념을 모르겠습니다.
부모 클래스의 메소드를 가져와서 재정의한다... 
만약 parent class에서 void name()을 정의했다고 치죠.
class parent(){
public void name(){
 console.writeline("고기")
}
}
 그리고
class child:parent{
public override void name()
{
 console.writeline("고기먹고싶드아")
}
}
하면 (예제를 보니)다른 클래스에서 parent.name();을 호출하고,child.name();을 호출하던데, override를 사용하지 않은것과의 차이가 없지 않나요. 만약 차이가 있다면 데이터상의 차이뿐만 아니라 
override를 사용한것과 사용하지 않은 것의 차이가 드러나는(용도파악이 안됩니다.)예제를 좀 들어서 설면해주시면 감사하겠습니다.
예제를 잘못 이해한건가...
전체 추천리스트 보기
[본인삭제]DIABLO3
2018-03-25 19:43:55추천 0
댓글 0개 ▲
2018-03-26 00:15:20추천 0
어... rpg 게임을 만든다고 가정해볼께요
게임캐릭터로 전사, 마법사, 사제 정도가 있고 이걸 구현한다고 했을 때
먼저 전사클래스, 마법사클래스, 사제클래스가 있어야겠죠?
그리고 이 세 클래스는 기본적으로 걷기/뛰기/맞기/죽기 의 내용은 동일하겠죠 ?
그렇다고 했을 때 클래스를 3개 만들어놓고 각각 클래스에 내용이 동일한 걷기/뛰기/맞기/죽기 함수를 만들어야하는데
어차피 똑같은내용인데 세 클래스에다 복사붙여넣기 하면, 나중에 전체적으로 걷기의 기능을 수정해야 할일이 있으면 복붙을 세번해야 하는거잖아요??
그래서 동일한 기능(걷기/뛰기/맞기/죽기)을 가진 클래스unit 를 하나 만들고, 이 클래스를 전사/마법사/사제가 상속받습니다
여기서 unit은 부모클래스, 이걸 상속받은 전사/마법사/사제 클래스는 자식 클래스가 됩니다
만약 걷기/뛰기/맞기/죽기 중 뭔가 수정을 해야한다면 부모클래스 하나만 수정하면되는거죠

근데 여기서 이런게 있을수가 있어요
1. 전사는 맞을 때 데미지를 50% 덜 받는다.
이런 경우 마법사와 사제는 따로 오버라이딩 하지 않고, 부모에 정의되어 잇는 맞기 함수를 그대로 호출하면 됩니다
하지만 전사는 데미지를 50% 덜 주어야 하는데 이렇게 만들 수 있습니다
override void 전사의맞기함수(float damage)
{
base.부모의맞기함수(damage * 0.5f); // 부모의 맞기함수 호출하는데 50%감소된 데미지를 줌
}
이런경우 부모의 함수를 호출할수가 있는거구요
댓글 2개 ▲
2018-03-26 00:15:24추천 0
2. 마법사는 걷는것이 나는것이다
전사/사제는 땅위를 걷는데 마법사만 걷지않고 난다고 해봅시다
그렇면 전사,사제는 부모의 걷기함수를 고대로 호출하면 되지만, 마법사는 걷기함수를 자신만의 걷기로 바꿔야됩니다
override void 마법사의걷기함수()
{
// 나는것에 대한 내용
}
이렇게 오버라이딩을 해서 부모 함수 내용을 숨기고, 마법사 쪽에서 다시 재정의해서 사용할 수 있습니다.

기본적으로는 이러한 편리함이 있고,

더 나아가서는 부모의 자료형으로 수많은 짓들(?)을 할 수 있는 점이 잇는데 이건 댓글로 설명하기가 참 애매해서.. 공부하시다 보면 , 실전을 겪어보시면 알거라고 생각이 듭니다

이해가 되셨는지 모르겠네용 ㅎㅎ
IPID
2018-03-26 03:30:06추천 0
감사합니다. 이런 설명이 필요했습니다
2018-03-26 00:58:16추천 0
oop의 다형성과 추상화를 모르면 상속은 이해할 수가 없어요.
이것 먼저 확실히 이해해 보세요.
댓글 0개 ▲
2018-03-26 01:34:22추천 1
코드의 언어가 c# 인가요? c#인경우 부모 클래스의 메소드에서 virtual 로 선언해 주지 않으면 상속받은 클래스에서 바로 override 선언을 하면 에러가 날 텐데요.
그리고.. 초보든 아니든 배우는 단계에선 읽는 것이 아니라 직접 돌려보는게 먼저입니다.
직접 돌려봤다면 그 차이를 바로 알 수 있을 내용이기 때문입니다.

부모 클래스 이름 : 도형
부모 클래스의 메소드 : 넓이

도형을 상속 받은 각각의 클래스들
삼각형, 사각형, 오각형, 육각형, 원.. 등등..
각각의 도형마다 넓이를 산출하는 방법은 전부 제각각임..
자식 클래스의 넓이 메소드를 각각의 넓이 산출 공식에 맞게 오버라이딩 처리를 한다.

사용 예시1 --------

삼각형 a = new 삼각형();
a.넓이(); --> 삼각형의 넓이가 출력된다.

도형 b = (도형)a;
b.넓이(); --> 도형의 넓이가 아닌 삼각형의 넓이가 출력된다.

사용 예시 2 -----------
public void 넓이출력(도형 x) {
Console.WriteLine(x.넓이());
}

넓이출력(new 삼각형());
넓이출력(new 사각형());
넓이출력(new 오각형());
넓이출력(new 원());

이 경우 도형의 넓이 메소드가 호출되는 것이 아닌 오버라이딩한 각각 자식 클래스의 넓이 메소드가 호출이 된다.

사용 예시 3 ------------
List<도형> list = new List<도형>();

list.Add(new 삼각형());
list.Add(new 사각형());
list.Add(new 오각형());
list.Add(new 원());

foreach (도형 item in list) {
Console.WriteLine(item.넓이());
}

이 경우 역시 도형의 넓이 메소드가 아닌 각 클래스의 넓이 메소드가 호출된다.
댓글 0개 ▲
2018-03-28 09:56:56추천 0
쉽게 생각하면 뭔가 클래스에 메소드들을 거창하게 많이 만들어서 여기저기 쓸건데
특정 상황에서는 그 기능이 살짝 다르지만 대부분의 기능은 동일하게 동작하는게 필요하다고 하면
그때 클래스를 상속받아서 오버라이드해서 살짝 다른 부분만 구현해주는겁니다.
댓글 0개 ▲
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호