🤍 전 강의 25% 할인 중 🤍

2024년 상반기를 돌아보고 하반기에도 함께 성장해요!
인프런이 준비한 25% 할인 받으러 가기 >>

  • 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

부모클래스 = 자식클래스 부분이 잘 이해가 안갑니다ㅏㅏ

22.03.08 16:14 작성 조회수 246

0

(ex. Dog dog = bulldog )

개념적으로 Dog이 큰거고 bulldog이 작기 때문에

큰 Dog안에 bulldog을 대입하는게 가능하고

bulldog에 Dog을 대입하는거는 형변환이 필요하다.

개념적으로는 이해가 가지만.....

 

(ex. BullDog bulldog = dog )

dog는 의 멤버변수는 2개고 bulldog의 멤버변수는 상속받아서 3개 잖아요

그래서 dog는 size가 8byte 이고 bulldog은 size가 12byte라고 했을 때

작은바구니(dog)에 큰 데이터(bulldog)을 넣는게 왜 성립되는지 이해가 안갑니다.  (ex. Dog dog = bulldog )

오히려 큰바구니에 작은 데이터를 넣는게 자연스럽지 않나요? (ex. BullDog bulldog = dog )

답변 1

답변을 작성해보세요.

0

위에서 말한 '크다'는 의미는 메모리가 크다는게 아니라
'개념적으로 더 포괄적'이 핵심입니다.
Dog 즉 개는 BullDog 외에도 푸들이나 진도개 등 정말 다양한 견종을 포함할테니.

불독은 개입니까? -> YES
개는 불독입니까? -> NO

~로 인식할 수가 있습니다.

불독은 개이기 때문에, BullDog -> Dog 로 변환하기 위한 모든 정보를 이미 다 포함해서
일부 데이터(BullDog만 갖고 있는 데이터)를 버리면 Dog로 다시 변신할 수 있습니다.
다만 개는 불독이라는 보장이 없기 때문에, Dog->BullDog으로 변환해버리면
불독이 꼭 갖고 있어야 할 추가 정보가 채워지지 않을 수 있습니다.
따라서 문법적으로 맞지 않는 것이죠.

참고로 문법상은 그렇긴 한데,

(ex. Dog dog = bulldog )

이런 코드는 평생 작성할 일이 생기지 않습니다.
굳이 이렇게 데이터 일부를 버리고 Dog 형태로 다시 저장해야 할 이유도 상황이 전혀 없기 때문이죠.
실제로는 나중에 Dog* dog = bulldog; 형태로
부모 포인터 형태로 변환하는 경우는 빈번하지만,
이 경우 어떤 데이터를 '버리고' 복사하는 개념이 아니라
단지 포인터 타입을 다르게 간주해서
해당 주소를 타고 가면 Dog이 있는 것으로 일단 생각하며 관리합니다.
필요하다면, 나중에 타입을 체크해서 BullDog*으로 다시 변환하면 되겠죠.

넵 답변주셔서 감사합니다.

채널톡 아이콘