Deff_Dev

[Unity/C#] 다형성 (업 캐스팅, 메소드 오버라이딩, is/as 연산자) 본문

Unity(유니티)/유니티 공부

[Unity/C#] 다형성 (업 캐스팅, 메소드 오버라이딩, is/as 연산자)

Deff_a 2024. 3. 11. 01:33

해당 포스팅은 고박사님의 유니티 C# 강의를 보고 공부한 내용과 추가적으로 공부한 내용을 정리한 포스팅입니다.

 

다형성

  • 객체가 여러 가지 다양한 형태를 가지는 것을 뜻한다.

상속을 받는 자식 클래스가 다양한 형태를 가지게 된다.


업 캐스팅 (Up - Casting)

  • 부모 클래스의 객체 변수에 자식 클래스 메모리 할당이 가능한 것
  • 부모 클래스와 자식 클래스 사이에 형 변환이 가능하다.

부모 클래스의 참조 변수에 자식 클래스의 객체를 참조하는 업 캐스팅을 했을 때, 부모와 자식에게 동일한 메소드가 있다면 부모 클래스의 메소드가 호출된다.

업 캐스팅을 사용하는 이유

  • 형식을 통일해 효율적으로 작업하기 위해 사용한다.
  • 작성해야하는 코드가 더 간결해지고 추가 코드가 필요하지 않기 떄문에 수정에 용이하다.

업 캐스팅 Before

 

 

업 캐스팅 After

 

모든 적의 형식을 Enemy로 통일했기 때문에 Player 클래스의 Hit() 메소드를 하나만 정의해 여러 적에게 대응할 수 있다. 

 

 

이런식으로도 Enemy 배열을 만들어 업 캐스팅을 활용할 수 있다. (실행 결과는 위 코드와 똑같다.)

 

하지만 부모 클래스에 정의된 TakeDamage() 메소드를 호출하기 때문에 모든 종류의 적이 완전히 동일한 피격만 가능하다.

 

즉, 각 클래스마다의 개성을 잃어버린다. 메소드 오버라이딩으로 해결


메소드 오버라이딩

  • 업 캐스팅으로 형식이 통일되었을 때 부모 클래스의 메소드가 아닌 자식 클래스의 메소드가 호출되도록 하는 것

부모 클래스는 virtual로 메소드를 정의하고, 자식 클래스는 override로 메소드를 다시 정의한다.

private로 선언된 메소드는 오버라이딩 불가능

 

각각의 자식 클래스의 TakeDamage() 메소드가 호출되는 것을 볼 수 있다.


다운 캐스팅

업 캐스팅을 했을 땐 다운 캐스팅이 가능하지만, 업 캐스팅을 안한 변수는 다운 캐스팅이 불가능하다.

 

다운 캐스팅이 불가능한 경우에는 컴파일 할 때 오류가 발생하지 않고, 프로그램을 실행했을 때 오류가 발생한다.

 

그래서 형 변환이 가능한지, 형 변환에 성공했는지 확인하는 is, as 연산자를 사용한다.


is, as 연산자

 

is 연산자

  • 객체가 해당 형식에 해당하는지 검사한 후 그 결과를 bool 값으로 반환
  • 값, 참조 형식 모두 사용 가능

as 연산자

  • 형식 변환 연산자와 같은 역할로 형 변환이 가능하면 형 변환을 해서 인스턴스를 반환하고, 형 변환에 실패하면 null을 반환한다.
  • 참조 형식에만 사용 가능