독개

[C#] 상속과 오버라이딩 간단하게 정복

by #독개#

이글을 보기전에 메모리에 대해 잘정리된 이전 포스팅을 보고오는 것을 추천드립니다.

[🔥 프로그래밍언어/C#] - [C#] 스택과 힙 메모리 완전 정복

 

독한 개발자

C++, C#, Autohotkey 의뢰,강의 등을 다룹니다

nanagame2.tistory.com

 

메모리에 대한 이해를 먼저 보고 보면 이해하기가 한결 쉽다.

여러가지 예제와 결과로 완벽하게 이해 해보자

 

기본 개념을 미리 알고 가자면,

Override는 말그대로 올라타는 것이다. (조상의 위에 올라타서 조상 또한 그것을 사용할 수 밖에없다)

new는 자식의 것만 새롭게 정의 하는 것이다.

 


상속의 관계는 아래의 코드와 같다

internal class Animal // :Object 모든클래스는 Object를 상속받는다
{
    public void FunAnimal() { }
    public void Run() { Console.WriteLine("동물Run"); }
}

internal class Human : Animal
{
    public void FunHuman() { }
    //조상에게 이미 있는 함수를 자식에서 새로이 선언하면 void new Run()하는게 맞다
    //요즘 컴파일러가 직접해줌
    public void Run() { Console.WriteLine("사람Run"); }
}

internal class Student : Human
{
    public void FunStudent() { }
    public void Run() { Console.WriteLine("학생Run"); }
}
자기자신은 this.
부모의 것은 base. 을 컴파일러가 자동으로 붙여준다 그래서 호출이 가능

 

생성자

Student student = new Student();

클래스 상속시 힙에쌓이는 과정

선언시 생성자는 아래의 순서대로 생성된다. 이는 힙 메모리 구조에서

호출은 높은메모리주소→낮은메모리주소로 불러오기 때문이다

  1. Animal();
  2. Human();
  3. Student();
is 함수를 사용해서보면
bool ret = student is Animal;		//True
bool ret = student is Human;		//True

//human에는 Student가 없기 때문
Human human = new Human();
bool ret = human is Animal;			//True
bool ret = human is Student;		//False

형변환

규칙1)

부모자료형은 자식의 주소를 가르킬 수 있다

자식자료형은 부모의 주소를 가르킬 수 없다

단! 자식의 인스턴스를 부모가 주소를 받은경우는 as를 통해서 다시 자식에게 주소를 줄수있다.

as로 명시적형 변환 (컴파일시 오류알수있다)

Student st2 = (Student)h1 	//이렇게 형변환도 가능하다 이건 동적형변환
							//런타임시 에러가 결정 미리 알 수 없다
							//근데 이때는 현재 주소의 인스턴스가 Student객체여서 가능한거고

Human h2 = new Human();
Student st2 = (Student)h2; 	//이건 오류가 발생한다 h2가 가르키고 있는 객체에는 Stduent가 없지

 

 

규칙2)

부모자료형이 자식의 주소를 가르켰을 경우 자식만의 맴버변수,맴버함수는 사용할 수 없다.

자식과 부모의 형변환

자식의 맴버함수인 FunStudent는 사용 할 수 없다

 


new

자식의 클래스에서 부모의 함수와 같은 함수를 new로 새로이 정의하면

자식은 부모의 함수가 아닌 자식의 함수를 사용한다.

이때 부모의 함수에 영향을 끼치지 않는다.

(요즘엔 new를 붙이지 않아도 컴파일러가 자동으로 붙여주는 듯)

new로 재정의 결과물


override

재정의를 허용할 조상의 함수에 virtual을 사용해주고

자식들은 override를 사용하여 조상위에 올라탄다. 조상조차 자식의 것을 사용해야 한다.

오버라이드의 결과물

internal class Animal // :Object 모든클래스는 Object를 상속받는다
{
    public void FunAnimal() { }
    public virtual void Run() { Console.WriteLine("동물Run"); }
}

internal class Human : Animal
{
    public void FunHuman() { }
    //조상에게 이미 있는 함수를 자식에서 새로이 선언하면 void new Run()하는게 맞다
    //요즘 컴파일러가 직접해줌
    public override void Run() { Console.WriteLine("사람Run"); }
}

internal class Student : Human
{
    public void FunStudent() { }
    public override void Run() { Console.WriteLine("학생Run"); }
}

'🔥 프로그래밍 학습 > C#' 카테고리의 다른 글

[C#] ToString()의 활용  (0) 2022.11.28
[C#] 모든 클래스의 조상 Object클래스  (0) 2022.11.28
[C#] 스택과 힙 메모리 완전 정복  (0) 2022.11.27
[C#] 상속  (0) 2022.11.24
[C#] For문 실습#3 달력출력  (0) 2022.11.24

블로그의 정보

독한 개발자

#독개#

활동하기