본문 바로가기
Java/Java 활용 개념 정리

[Java] 추상클래스(일부 다형성 보장)

by Dev dreamer 2023. 2. 4.

 

 

💡 1. 추상클래스 활용


 

다형성이 보장이 되기 위해서는 반드시 자식 클래스에서 재정의(override)를 해줘야 한다.

 

만약 Dog 와 Cat 클래스에서 eat() 메서드를 재정의 하지 않았다면

 

Dog d= new Dog();

Cat c= new Cat ();

d.eat();

c.eat(); 의 출력은 Animal의 출력인 ? 만 나올것이다.

 

이러한 다형성을 보장하기 위해서 추상클래스를 사용할 수 있다.

 

 

 

추상메서드로 바꿔줄 땐 구현부를 없애줘야 한다.

 

어떤 클래스에 추상 메서드를 가지고 있으면

클래스 자체에 abstract 키워드를 추가해줘야 한다.

 

이때 추상 클래스가 된 경우에 그 클래스로 직접 객체를 생성해서 메서드를 사용할 수 없으며

부모 역할만으로 이용이 가능하다.

 

 

 

부모클래스가 추상클래스이고 추상 메서드가 있다면 자식클래스에 어떠한 영향을 미칠까?

 

 

 

Animal에 추상클래스이고 추상메서드 eat()을 가지고 있다고 할때

 

Animal을 extends 한 Dog와 Cat 클래스는 반드시 부모클래스 내부의 추상 메서드를 재정의 해야만 한다.

 

이러한 추상 메서드를 통해 자식 클래스에 반드시 eat() 메서드가 재정의 되어 있을 것이다.

 

 

 

 

따라서 추상 클래스인 부모클래스 Animal 로 자식 객체에 추상 메서드를 이용하면 반드시 동작하는 것이 보장되어 있다.

 

해당 추상메서드는 다형성이 반드시 보장 된다는 것이다.

 

 

 

 

추상 클래스에 있는 추상메서드가 아닌 일반 메서드는 어떠한 경우에서 활용 될까??

 

move() 라는 일반 메서드를 살펴보자

내용으로는 " 무리를 지어서 이동한다 " 이다.

 

이 메서드 같은 경우에 Dog나 Cat 클래스에서 반드시 재정의 해야하는 메서드는 아니다.

 

다만! Dog나 Cat 클래스가 move() 라는 메서드를 가져다 써도 클래스 내용(정보)에 크게 벗어나지 않는다.

 

개와 고양이 모두 무리를 지어서 이동하는 특성이 있기 때문이다.

 

Dog.move() Cat.move() 모두 "무리를 지어서 이동한다." 라는 값이 출력되어도 클래스 특성에 벗어나지 않는다.

 

즉 이러한 비슷한 공통분모가 있는 클래스들의 부모클래스는 모든 부분을 추상메서드로 다룰 필요가 없는것이다.

 

그래서 추상 클래스의 경우 다형성이 일부 보장된다.

 


어? 그러면 모든것이 다른 놈들은 하나의 부모 클래스 밑에 못있는 건가요?? 공통부분이 없으면요?

 

서로 기능이 비슷한 클래스끼리 묶인것이 아닌 전혀 다른 특성 즉 모든것을 재정의해서 써야하는 자식클래스들을

 

하나의 클래스로 묶기 위해서 쓰는 방법이 있다. 바로!

 

인터페이스 이다.

 

인터페이스는 모든 메서드를 다 추상메서드로 만들어줘야만 한다.

즉 자식은 모든 메서드를 클래스에 맞게 재정의 해야만 한다. => 다형성이 100% 보장된다.

 

인터페이스의 더 자세한 부분은 다음 포스트에서 다루겠다.

 

 

 

💡  2. 코드로 보는 추상메소드


🔍 2.1 추상메서드의 역할 살펴보기.

 

Dog가 Animal 클래스의 상속을 받아 eat을 재정의 해둔 상태이다.

 

 

이때 재정의 했던 eat() 메서드를 지워버려도

프로그램 상에서 에러 없이 그대로 실행되고 

Animal 에 있는 ? 가 그대로 출력이 된다.

 

 

이러한 문제점 때문에 메서드를 반드시 구현해야만 하도록 추상메서드를 통해 강제 할 수 있다.

 

이렇게 추상 클래스로 바꿔주고 나면 추상 클래스 자체로 객체를 생성할 수 없다.

Animal ani = new Animal(); ➡ (불가능)

 

이 추상클래스는 오로지 부모의 역할로 자식클래스에게 명령을 내려 다형성을 보장하는 용도로 사용한다.

 

 

❗ 추상 클래스인 Animal을 상속받은 Dog가 추상 메서드를 구현하지 않으니까 에러가 발생했다.

 

오류가 난 Dog에 마우스를 가져가서 Add unimplemented method 를 실행시키면

 

 

이렇게 바로 구현해야할 메서드가 작성된다. 

또 다른 재정의 방법은

 

구현해야만 하는 메서드가 있는 코드 빈 공간에 오른쪽 마우스를 눌러서

Source 탭의 Override implement Methods 에 들어가 구현할 기능을 구현해준다.

 

 

🔍 2.2 추상 클래스에 구현 메서드 넣기

 

 

 

추상 클래스 Animal 에 추상 메서드 eat() 뿐만 아니라 구현 메서드(일반메서드?)를 함께 넣어 줄 수 있다.

 

여기서 구현 메서드의 내용은 자식 클래스에 공통된 부분을 다룬다.

 

그래서 추상 클래스는 자식 클래스들의 공통된 부분이 있을 때 사용해주고.

 

자식 클래스의 공통된 부분이 없을 때에는 추상 클래스 보다는 인터페이스를 써서

 

각 클래스에 맞는 특징들을 모든 메서드 마다 재정의 해주는 것이 맞다.

 

 

추상 클래스는 독단적으로 객체(instance)를 만들 수 없다.

 

 

추상 클래스는 부모 역할로서 자식 메서드에 명령을 내리는 역할을 하는게 주 기능이다.

 

upcasting을 활용한 부모의 역할을 해주는 것이다.

 

 

 

 

 

 

 

 

 

Java 관련 개념을 알려주실 때 그 내부 동작이 어떻게 구현되는지 자세하게 알수 있는 강의입니다.

출처: Java TPC (생각하고, 표현하고, 코딩하고) 대시보드 - 인프런 | 강의 (inflearn.com)

댓글