[JAVA]객체지향(7): 추상 클래스

ho's·2022년 5월 11일
0

추상 클래스

  • 추상 클래스는 인스턴스가 될 수 없다.
  • 추상 클래스를 상속받는 자손이 인스턴스가 된다.
  • abstract키워드를 사용하여 클래스를 정의한다.
  • 추상 클래스는 보통 1개 이상의 추상메소드를 갖는다.
  • public abstract class 클래스명 {....}

위와 같이 에러가 발생한다. 그 이유는 Car2는 추상클래스이기 때문에 인스턴스화 할 수 없다.


템플릿 메소드 패턴(Template Method Pattern)으로 배우는 추상 클래스

Controller를 만들어봐라!

라고 선배 개발자가 말했다고 상상해보자.

Controller는 다음과 같은 기능을 가진다.
1. 초기화 - 같은 코드
2. 실행 - 다른 코드
3. 마무리 - 같은 코드

Controller의 종류는 여러개이다.

먼저 Controller 클래스를 부모로 상속받게 하자

abstract를 이용해 Controller를 추상클래스로 만들었다.

execute()를 실행하게 되면 this(자신의)init 메소드를 실행하고, run(), close() 순서대로 메소드를 실행하게 된다.

위와 같이 내가 가지고 있는 메소드들을 호출하고, 어떠한 순서를 가지고 있을 때, 이러한 메소드를 템플릿 메소드라고 한다.

Controller를 상속받는 클래스를 만들어보자.

오류가 뜨는 이유는 추상클래스를 상속 받았는데 메소드를 구현하지 않았기 때문이다.
오류를 없애보자.

그리고 FirstController와 Controller를 동작 시키기 위해 ControllerMain이라는 메인 클래스를 만들어 보자.

Controller는 추상클래스이지만 그것을 구현하는 자손 클래스(FirstController)를 참조할 수 있다.

c1.execute(); 를 실행시키면 다음과 같은 결과가 나온다.

우리가 만든 코드의 목적성을 다시 떠올려보자.

우리는 Controller는 3단계를 처리했으면 좋겠다.

  1. 초기화 - init(); => 같은 코드(코드의 변화X)
  2. 실행 - run(); => 다른 코드(코드의 변화O)
  3. 마무리 -close(); => 같은 코드(코드의 변화X)

즉 사용자가 init(), close()를 직접호출하지 않고,
excute 메소드를 이용해 init, run, close가 호출되게 만들었다.

init, close 메소드는 내용이 변경되길 변하지 않으므로, 사용자가 직접 호출할 수 없도록 할 필요성이 있다.

위와 같이 public -> protected 로 바꾸어 주자.

위와 같이 init, close는 사용할 수 없게 변경이 된다.

여기서 만약 초보 개발자가, FirstController클래스에서 init메소드를 오버라이딩하면 어떻게 될까?



위와 같은 결과가 나온다. 그 이유는 메소드가 오버라이딩 되면 무조건 자식의 메소드가 실행되기 때문이다.
따라서 init과 close를 오버라이딩 할 수 없게만들어 줘야 한다.

위와 같이 final을 붙이면 해당 메소드는 오버라이딩 할 수 없게 된다.

부모가 될 수 없는 클래스

  • 상속을 금지 시키려면 클래스를 정의할 때 final키워드를 사용한다.
  • public final class 클래스명{....}

String은 final 클래스이기 때문에 상속 받을 수 없다.

왜 String클래스는 final일까?

profile
그래야만 한다

0개의 댓글