본문 바로가기
IT/Java

자바 추상 클래스, 추상 메서드란 무엇인가

by flatsun 2019. 2. 18.
반응형

추상 클래스 예전에 학원에서 배웠는데

기억이 잘 안나더라


예전에도 그랬지만

학원 강사가 이해가 어렵고 이상하게 가르쳤기 때문이다


원래 기승전 강사 잘못이기 때문에

강사가 문제다

강사가 잘했으면 내가 왜 모르겠나


어쨌든 추상(Abstract) 클래스가 뭔지 알아보자면

추상의 뜻부터 알아야된다




비겁하게 직접 해석 안하고

파파고 번역기 돌려보니까


생각이나 아이디어로는 존재하지만 물리적이거나 구체적으로는 존재하지 않는 것!!

라고 하던데


이게 추상의 뜻이니 이제 코드를 통해 알아보자



추상 클래스를 만들었는데

이게 전부다


call 메소드를 만들었는데

메소드에서 뭘 하는지 내용도 없고 {} 없이 ;로 끝냈는데

에러가 안 뜬다


근데 다시 뒤로 돌아가 추상화가 뭐다?


생각이나 아이디어로는 존재하지만

물리적이거나 구체적으로는 존재하지 않는 것!!!


즉 껍데기만 만들었다고 생각하면 된다

추상 클래스를 정의하려면 클래스명 앞에 abstract를 추가하면 되고

추상 메소드도 메소드 앞에 abstract를 추가하고

메소드 옆에 { body } 없이 메소드명(); 로 바로 끝내버리면 된다


내용물은 없이 껍데기만 존재하는 것이 추상 클래스고

그 추상 클래스 안에 마찬가지로 껍데기만 있는 메소드가 추상 메소드가 되겠다


이제 추상 클래스, 추상 메소드가

뭔지 알았으니 이걸 왜 쓰는지를 알아보자



추상 클래스 같은 경우에는 상속받으면


반드시 해당 추상 클래스의 추상 메소드를 사용해야 하는데

스크린샷을 보면 추상 클래스 Abs를 상속받은 AbsTest가 

Abs에 있는 추상 메소드 call(); 을 사용하지 않았다고 에러가 뜬다


즉 추상 클래스는 다른 클래스가 추상 클래스를 상속받으면

그 안에 있는 추상 메소드를 반드시 구현하도록 하는 것이다


자주 쓰는 예로

동물 같은 경우에는 울음소리가 다 다르다


사자는 어흥 개는 멍멍 고양이는 야옹 이런 식인데

일반 클래스에서 상속을 받으면


부모 클래스에서 울음소리를 작성하는 것이 아무 의미가 없다

사자와 개 울음소리는 다르기 때문에..


결국 상속을 받은 다음 오버라이드를 해서

사자는 어흥, 개는 멍멍 이렇게 바꿔주어야 하는데

일반 클래스가 아닌 추상 클래스에서 가져오면


기껏 의미없는 메소드의 바디를 작성할 필요 없이

껍데기만 정의해 놓고 어흥, 멍멍은 상속받는 클래스에서 구현해주면 된다


또한 추상 클래스를 사용하면

해당 메소드명 사용이 강제되는데


만약 여러명에게 울음소리를 메소드명으로 쓰시오!

이러면 call, roar, cryingSound . . .

이런 식으로 다들 근본없고 다른 이름으로 메소드를 작성하는데


이러면 나중에 사자와 개 클래스의 메소드를 보다가

이게 동일한 울음소리가 맞나? 하고 헷갈리기 쉽다


이름이 다르니까..




하지만 추상 클래스를 상속받으면

근본있게 call()만을 사용해야 한다

안그러면 에러가 뜨니까..


다만 추상 클래스를 사용하면

설계를 잘 해야되는데


동물들이 울음소리도 있지만

뛸 때도 각각 소리가 있어서 넣어야 하는데

빼먹었다고 해 보자


다시 추상 클래스로 들어가서

running 메소드 추가해주고


상속받는 클래스들로 돌아와서

다시 running 추가해주고..


근데 동물 중에 뱀을 추가했다면

울음소리는 있는데 다리가 없으니 뛰는 건 상속받아야 되는데

뱀이 뛰냐? 아..


이건 뭐 설계를 좀만 잘못해도

맨 위로 올라가면서 다 고쳐야 한다


근데 완벽하게 설계를 하기가 어디 쉬운가

뭐 중간에 추가하려면 처음부터 끝까지 다 고쳐야 하는게 단점이다


이제 마지막으로


추상(Abstract) 클래스와 구상(Concrete) 클래스를 비교해 보자


일단 추상이나 구상이나 딱 보면 무슨 뜻인지 모르겠다

번역을 누가 처음에 이렇게 했는지 한방에 안들어오는 만큼

한글 뜻은 갖다 버리고 무조건 영어로만 외우자


콘크리트 하면 뭐가 생각나나



뭔가 꽉 차 있는게 떠오르지 않나


즉 Abstract class는 껍데기만 있는거

Concrete class는 껍데기부터 안에 { body } 까지 모두 작성해 놓은 것!!!


진짜 마지막으로

면접용 Abstract class 요약정리 들어간다


1. Abstract method는 body { 이것이 body }  부분이 없다!!

2. Abstract method의 맨 마지막에 ;를 붙여줘야 한다!!

3. Abstract class를 상속받으면 그 클래스 안에 있는 Abstract method를 반드시 사용해야 한다!!!

4. Abstract method는 Abstract class 안에서만 사용 가능하다!!

5. 잘 설계하면 코드를 줄일 수 있으나 잘못 설계하면 몽땅 고치는 대참사가 일어난다!! 

반응형

댓글