[TIL] java 추상 클래스

빼곰·2022년 12월 9일
0

문제

  • 추상 클래스와 추상 메서드란 무엇인지 설명하고 관련된 예제 코드를 구현해보시오
  • 추상 클래스, 추상 메서드의 개념과 역할에 대해 알고 있는지 확인하다.
  1. 추상 클래스란 무엇인가?
  2. 추상 클래스와 일반 클래스의 차이점은 무엇인가?
  3. 추상 클래스는 객체 생성이 가능한가?
  4. 추상 클래스는 어떻게 사용하는가?
  5. 추상 클래스의 역할은 무엇이고 왜 필요한 것인가?
  6. 추상 클래스는 상속이 가능한가?
  7. 추상 클래스의 추상 메서드는 꼭 오버라이딩하여 사용해야만 하는가?
  8. 추상 메서드를 포함하고 있다면 추상 클래스여야 하는가?
  9. 추상 클래스를 만들려면 abstract를 꼭 써야 하는가?

위 질문에 답을 못한다면 추상 클래스를 모른것!
지금부터 차근차근 개념을 살펴보자.

abstract class

"추상적인"이란 애매모호한 표현이라고 말하듯이 구체적인지 않는 것을 말한다.
즉, 추상클래스는 구체적인 내용은 작성하지 않고 공통적인 특징을 추상적으로 선언만 해놓고 리턴값 조차도 없이 메서드명만 선언한다.

  • 추상클래스 : 추상(부모)클래스는 다른(자식) 클래스들의 공통적인 특징을 변수나 메서드로 정의만 해놓는 것을 말한다. --> 추상 메서드
    ex)
abstract class Animal{ // 기존 클래스와 메서드에 abstract를 붙여 만듬
abstract void cry(); // 내용 없이 메서드 생성
}
  1. abstract를 앞에 붙이고 클래스 안에 추상 메서드를 포함하고 있다는 것을 제외하면 사실 일반 클래스와 별반 차이가 없다. Field, Constructor, Method(추상 메서드 말고 일반 메서드)도 포함할 수 있다.

    -추상 메서드를 하나라도 가지고 있는 클래스는 반드시 클래스는 추상 클래스로 선언이 되어 있어야 한다.
  1. 추상클래스는 구체적인 내용이 없기 때문에 객체를 생성 할 수 없다.
    --> 메서드 선언만 있고 구체적인 내용은 없으므로
Animal dog = new Animal(); //Err 발생!!

그러면 추상 클래스는 어떤 상황에 써야 되는가?🤔

  1. 상속을 받아서 사용해야 한다.
    : 즉, 추상 클래스를 상속받은 자식클래스에서 해당 메서드를 오버라이딩하여 재정의한 후 사용한다.

    4-1. 자식 클래스 만들기

  2. 결국 추상 클래스의 역할을 부모 클래스가 되는 것!

추상클래스를 사용하는 목적에 강제성이 있다!😮

  • 따라서, 부모 클래스로서의 역할은 하지만, 구체적인 사용은 상속받은 자식 클래스에서 재정의(오버라이딩)하여 사용해야한다. --> 강제성

자식 클래스에게 공통적인 메서드에 대해서 재정의하여 사용하도록 강요하고 있다. 앞으로 만들어 있는 지는 자식 클래스들은 추상클래스가 가지고 있는 공통적인 특징을 모두 가지고 있기 때문이다.
(ex.동물 클래스 -> 사자, 호랑이는 모두 우는 동물. So, cry메서드를 무조건 각 동물에 맞게 재사용)

부모 클래스를 상속받기만 하고 추상 메서드를 사용 하지 않는다면?

cry() 메서드 지우면...

에러 발생!!

the type Cat must implement the inherited abstract method Animal.cry()

'무조건' 상속받은 자식 클래스 입장에서는 추상 메서드를 재정의해서 구현 해야함!

  • 결국, 추상클래스의 목적은?
    부모(추상)클래스가 선언해놓은 메서드를 상속받은 자식 클래스들이 이름 그대로 재정의해서 구현하라고 강제하는 것이다.
    상속받은 자식클래스 입장에서는 자칫 상속만 받고 재정의해서 사용을 안할 수도 있기 때문이다.
    (일반 메서드로 구현하면 누군가는 해당 메서드를 구현 안 할 수도 있으므로)

꼭 재정의 (override) 해야 하는가?🙄

일단은 그렇다...?!
자식 클래스는 일단은 무조건 부모(추상) 클래스로부터 상속받은 추상 메서드는 오버라이딩해서 재정의 해야한다.

  • 민약, 재정의 하고 싶지 않다면?
    자식 클래스에서 상속받은 추상 메서드를 구현하지 않는다면 자식 클래스도 abstract를 붙여서 추상으로 만들어준다.

결론

부모(추상)클래스에서 구현을 하지 않는 이유는 해당 메서드의 구현이 상속받는 클래스에 따라서 달라질 수 있기 때문에 선언만 해둔 것이다.

마치 돈 많은 부모가 엄청난 대지만 상속해주고 용돈는 자식이 알아서 사용해라 이런느낌?

장점

  • 여러명의 개발자가 작업할 때 코드의 확장과 분업을 효율적으로 처리할 수 있게 해준다.
  • 분업화된 시스템에서 공통의 프로젝트를 진행할 때 많이 사용되어지는 중요한 문법이다.

회고

첫 질문에 답을 할 수 있는지 점검해보았다. 바로바로 답이 안나오면 계속계속 봐야 하지 않을까?
아직 익숙하지는 않지만 글을 쓰면서 정리하니까 여러번 읽게 되고 이해가 차츰차츰되어지는 거 같다.
더 깊이 공부 하고 싶으면 생활코딩을 참고하여 한번 더 읽으려고 한다. 객체지향파트 포기 하지 않고 열심히 공부해야 겠다!!

profile
개발 블로그

0개의 댓글