관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

상속 5 - 동물 계층 구조 만들기 실습 3 : 추상 클래스 사용하기 본문

프로그래밍 언어/자바

상속 5 - 동물 계층 구조 만들기 실습 3 : 추상 클래스 사용하기

huenuri 2024. 12. 1. 06:06

계속해서 동물 프로젝트 실습을 진행해 보겠다. 이번에는 추상 클래스에 대해서도 배우게 된다.


 

 

 

 

상속을 활용한 동물 프로젝트 실습 세 번째

 

1. animal 클래스에서 메소드 일부 삭제하기

animal에서 move() 메서드의 경우 클래스별로 다른 형태로 출력되니 이 부분을 없애보기로 하자.

 

 

하지만 이처럼 오류가 뜬다. body를 요구하는데 2가지 해결 방법을 제시한다. abstract는 추상인데 animal 클래스에 있는 것을 추상으로 바꾼다는 뜻이다.

우리는 두 번째 것을 실행해보겠다.

 

 

이제 오류가 사라지는데 이것이 추상 메서드이다. 바디는 없고 틀만 있는 상태를 말한다. body가 없는 메서드를 만들 때는 반드시 abstract라는 키워드를 써주어야 한다. 근데 자세히 살펴보면 코드 전체가 달라진 것을 볼 수 있다.


 

 

 

2. 추상 메서드로 선언하기

 

 

클래스 앞부분에 abstract가 생겼다. 만약 이 키워드를 지우면 어떻게 될까?

 

 

 

 

이러한 오류가 뜨는데 abstract가 정의되어 있으므로 타입을 변환해야 한다는 뜻이다. 여기서 중요한 특징은 abstract 메서드를 포함하고 있는 메서드는 반드시 추상 클래스로 정의되어야 한다.

 

 

 

 

추상 클래스로 정의하고 나면 왼쪽의 파일 아이콘에 A가 붙어 바뀌는 것을 보게 된다.


 

 

 

3. 추상 메서드의 특징 정리

 


 

 

 

 

 

4. 추상 클래스 구현 후 상속받는 Mammal 클래스에서 발생한 오류

Animal을 추상 클래스로 선언한 후 Mamal에서 오류가 발생했다.

 

 

Animal에 상속된 Mannal은 아직 추상 클래스로 구현하지 않았기 때문이다. 해결 방법은 2가지가 있는데 하나는 추상 메서드를 구현하는 것이고, 다른 하나는 Mammal 클래스를 추상 클래스로 선언하는 것이다. 추상 클래스는 자식 클래스에서 반드시 추상 메서드를 구현하도록 강제하는 구조를 제공한다.

그렇기에 Mammal 클래스는 추상 클래스 Animal을 상속받았기 때문에 move() 메서드를 구현하거나, 스스로 추상 클래스로 선언해야 한다.

 

 

 

추상 클래스로 구현하자 오류가 사라졌다. 하지만 Whale 클래스에서는 오류가 발생하지 않았는데 그 이유는 오버라이딩으로 재정의한 상태이기 때문이다. 물려받은 클래스는 자신만의 메서드로 만들었기에 추상 클래스로 선언할 필요가 없다.

만약 오버라이딩하지 않으면 이처럼 오류가 발생한다.

 

 


 

 

 

 

 

5. 메인 클래스에서 animal 객체 생성할 때 발생하는 오류

원래는 객체 생성이 되었으나 추상 클래스로 선언한 후 객체 생성이 되지 않는다. 그러면 추상 클래스는 왜 객체 생성을 할 수 없을까? 클래스는 설계도이다. 이 설계도가 완벽하게 만들어져 있어야 객체를 만들 수 있다. 하지만 지금 이 설계도는 불완전한 상태이다.

 

즉 animal과 mannal 클래스는 구체화가 되어 있지 않은 불완전한 설계도인 것이다.


 

 

 

6. 다른 객체 생성 및 업 캐스팅하기

노란 경고창이 사라지게 하기 위해 다른 객체를 생성하고 업 캐스팅한 후 이를 출력해 주었다.

 

 

 


 

 

 

 

학습을 마치고

여기까지 추상 클래스 수업을 마친다. 지금도 이해하기 어려운 내용인데 5달 전에 이를 이해하기는 거의 불가능에 가까웠다. 클래스에 대해 어느 정도 알아야 숙지할 수 있는 내용이기 때문이다. 그래서인지 GCC 사관학교에서도 C++ 시간에 배웠던 내용을 하나도 이해할 수 없었다.

나중에는 아무것도 이해가 되지 않아서 그냥 수업 시간에 딴짓을 하며 놀았던 기억이 난다. 모든 과정은 기초가 가장 중요하다. 하지만 우리나라 개발자 양성 교육 기관들은 대부분 6~7개월 안에 모든 성과를 다 보려고 하기에 학생들에게 무리한 교육을 요구한다.

 

차분하게 생각하며 사고력을 배양할 수 있는 수업은 거의 없고 무조건 외우라고 하고, 억지로 끼워 맞춰 가는 수업이었다. 특히 GCC 사관학교에 있을 때 이런 것들이 가장 심했다. 3개월만 있다가 나오길 정말 잘했다는 생각이 들었다. 난 이러한 교육 과정에 반기를 들며 나만의 독자적인 공부를 해나갔다는 것이 이번 인공지능 사관학교에서의 가장 큰 수확이었다.

 GCC에 있을 때 이러다가는 게임 개발에 대해 영영 흥미를 잃고 몸과 마음에 병을 얻을 것 같았다. 오히려 길을 우회함으로 난 더 많은 것들을 배우고 새로운 세상에 눈을 뜨게 되었다.

 

사람들은 지름길로 가길 바라지만 지름길을 가는 것이 꼭 좋은 것이 아니라는 것을 올 한 해 느낄 수 있었다. 오히려 정도를 걸으며 차근차근 한 계단씩 밟아나가는 것이 어떤 분야의 고수가 되는 가장 빠르고 확실한 방법임을 배웠다.