파파비의 블로그

C#) 다형성, 암시적 형변환, 명시적 형변환 본문

개발/c#

C#) 다형성, 암시적 형변환, 명시적 형변환

N. Dave 2020. 4. 3. 19:42
반응형

다형성은 객체지향 프로그래밍의 특징중 하나이다.

이 개념을 이해하는 데 참 오랜 시간이 걸렸던 것 같다.

 

오늘은 형변환에 대한 부분을 복습하며 다형성에 대해서도 정리해보고자 한다.

 

다형성은 다양한 형태를 갖고 있음을 의미하는데, 그 것을 이해하려면 먼저 

형변환을 이해하여야 한다.

 

short라는 타입은 int 범위에 포함된다.

그리고 int는 정수라는 범위에 포함된다.

 

정수 > int > short의 순서에서 short로 갈수록 제한된, 특수한 범위에 해당한다.

short는 무조건 int이며, int는 무조건 정수이다.

그래서 형변환이 가능하다

 

형변환은 형태를 변화시키는 것이다.

형변환은 2가지 종류가 존재한다.

암시적 형변환과 명시적 형변환이다.

암시적 형변환은 굳이 말하지 않아도 자연스럽게 되는 형변환이며

명시적 형변환은 꼭 표시를 해야하는 부분이다.

 

특수한 타입을 보다 일반화된 타입으로 형변환 시킬 때는 암시적 형변환으로 충분하다.

특수한 타입 : short

일반화된 타입 : int

 

short num1 = 10;

int num = num1;

 

이렇게 된 경우, num1의 10은 short지만,

num의 값인 10(num1과 똑같은 값이지만)은 int로 형태가 변환되었다.

 

이러한 부분이 class에서 똑같이 적용된다.

 

computer라는 부모 class에서

notebook과 pc라는 자식 class를 만들었다고 해보자.

 

그럴 경우 computer com = new notebook();

으로 컴파일해도 가능하다.

노트북은 컴퓨터이기도 하기 때문이다. 

 

여기서 포인트 com객체에서 notebook에서 오버라이딩된 메소드를 실행할 경우

computer class에서 구현된 메소드가 실행될까 or notebook에서 오버라이딩된 메소드가 실행될까?

정답은 notebook에서 실행된 메소드가 실행된다.

이런 포인트가 '다형성'이다.

 

같은 computer 객체지만 자식 class를 통해서 함수들을 오버라이딩하여 다양한 형태를 띄우는 것이다.

 

예를 들면 게임에서 weapon class를 부모 클래스로 만들고

attack 메소드를 구현해 놓은 뒤에

자식클래스로 'sword' class를 만들고 attack 메소드를 휘두르는 액션으로 오버라이딩하고,

자식클래스로 'arrow' class를 만들고 attack 메소드로 화살을 쏘는 액션을 오버라이딩이 가능하다.

 

그리고 플레이어에게는 weapon 객체에 sword 객체나 arrow 객체를 넣을 수 있다.

그러면 무기에 따라 다양한 공격모션을 구현할 수 있다.

 

명시적 형변환에 대해 얘기해보자.

이런 경우는 일반화에서 특수화로 바꿀 때에 실행된다.

(or 그냥 다른 형태로 바꿀때도 쓰인다)

 

다른 형태로 바꿀 때 말고 class에서 상속 관점에서 얘기를 해보자면,

notebook np = new computer(); 이라고 하면 컴파일에러가 뜬다.

왜냐하면 모든 컴퓨터는 notebook이 아니거니와

computer는 notebook에 부모 클래스여서, notebook이 구현한 부분을 갖고 있지 않을 수 있기 때문이다.

 

이럴 때 명시적 형변환이 가능하다.

computer com = new computer();

notebook np = (notebook)com;

 

앞에 괄호를 통해 type을 적어주면 된다.

이럴 경우 컴파일은 되지만 역시 실행은 되지 않는다.

 

그래서 일반에서 특수로 내려가는 케스팅(형변환)은 하지 않으면 된다.

괄호를 사용한, 명시적 형변환은 int를 string으로 바꾸거나 하는 등에 사용하자.

 

 

 

반응형
Comments