<정리>
1. 추상 클래스
1. 추상 클래스란?
추상 클래스란 하나 이상의 추상 메서드를 포함하는 클래스를 말한다.
추상 메서드는 구현부가 없고 abstract를 이용하여 선언만 하는 메서드다.
// 구현체가 없는 추상 메서드
abstract int add(int x, int y);
// 추상 메서드 아님!
int add(int x, int y) {}
(주의) { }를 사용한 것만으로도 메서드를 구현한 것이므로 중괄호 {} 안에 구현 코드가 없다고 하더라도 구현부는 존재하므로 추상 메서드가 아니다!
<메서드 선언의 의미>
함수의 선언부(반환 값, 함수 이름, 매개변수)를 정의한다는 것은 함수의 역할이 무엇인지, 어떻게 구현해야하는지를 정의한다는 뜻이다. 따라서 함수 몸체를 구현하는 것보다 중요한 것은 함수 선언부를 작성하는 것이다.
2. 추상 클래스 구현하기
추상 클래스를 상속받은 하위 클래스는 구현되지 않은 추상 메서드를 모두 구현해야 구체적인 클래스가 된다. 예를 들어, NoteBook 클래스는 추상 메서드 2개 중 display()하나만 구현했고 typing()은 구현하지 않았다. 따라서 추상 메서드를 포함하는 것이므로 추상 클래스가 된다.
Q. 모든 추상 메서드를 구현한 클래스에 abstract 예약어를 사용하면?
문법상으로 모든 메서드를 구현했어도 abstract 예약어를 사용하면 추상 클래스다.
이 클래스는 생성해서 사용할 목적이 아닌 상속만을 위해 만든 추상 클래스로 new 예약어로 인스턴스를 생성할 수 없다.
3. 추상 클래스를 만드는 이유
추상 클래스는 모든 메서드가 구현되지 않았으므로 인스턴스로 생성할 수 없다!
(추상 클래스에서도 형 변환을 사용할 수는 있다.)
추상 클래스는 상속을 하기 위해 만든 클래스다.
구현된 메서드 | 하위 클래스에서 공통으로 사용할 구현 코드(하위 클래스에서 쨎정의 할 수도 있음) |
추상 메서드 | 하위 클래스가 어떤 클래스냐에 따라 구현 코드가 달라짐 |
2. 템플릿 메서드
1. 추상 클래스와 템플릿 메서드
템플릿 메서드는 추상 클래스를 사용하여 구현할 수 있다.
2. 템플릿 메서드의 역할
템플릿 메서드의 역할은 메서드 실행 순서와 시나리오를 정의하는 것이다.
템플릿 메서드는 메서드 앞에 final을 사용하여 상속받은 하위 클래스가 메서드를 재정의할 수 없도록 한다.
템플릿 메서드는 로직 흐름을 정의하는 역할을 하고 이 흐름은 모든 하위 클래스가 공통으로 사용하고 코드를 변경하면 안되기 때문에 final로 선언하는 것이다.
3. 템플릿 메서드 응용하기
1. 클래스 기능과 관계
주어진 문제를 어떻게 해결할 것인지를 생각해보고 클래스 다이어그램을 간략히 그려 보는 것이 객체 지향 방식으로 문제를 해결하는 좋은 습관이다.
2. 클래스 설계하기
1) 각 플레이어가 가질 수 있는 레벨을 클래스로 분리한다.
2) 각 레벨마다 공통 기능, 개별 기능이 있으므로 레벨 클래스를 상속 관계로 표현한다.
3) Player 클래스와 PlayerLevel 클래스는 포함(HAS-A) 관계로 Player 클래스에서 PlayerLevel 클래스를 멤버 변수로 갖는다.
4) 레벨에 따라 기능이 달라지므로 PlayerLevel 클래스를 추상 클래스로 만들어 공통 기능을 구현하고 각 레벨마다 달라지는 기능은 추상 메서드로 선언한다.
5) PlayerLevel을 상속받은 하위 클래스에서 추상 메서드로 선언한 부분을 구현한다.
3. 추상 클래스와 다형성
상위 클래스인 추상 클래스는 하위에 구현된 여러 클래스를 하나의 자료형(상위 클래스 자료형)으로 선언하거나 대입할 수 있다. 추상 클래스에 선언된 메서드를 호출하면 가상 메서드에 의해 각 클래스에 구현된 기능이 호출된다. 즉, 하나의 코드가 다양한 자료형을 대상으로 동작하는 다형성을 활용할 수 있다.
4. final 예약어
final 변수 | 상수 |
final 메서드 | 하위 클래스에서 재정의 X |
final 클래스 | 상속 X |
1. 상수를 의미하는 final 변수
<여러 자바 파일에서 공유하는 상수 값 정의하기>
여러 파일에서 공유해야하는 상수 값은 한 파일에 모아 public static final로 선언하여 사용한다.
public 으로 선언했기 때문에 외부에서도 사용할 수 있고 static으로 선언했기 때문에 인스턴스를 생성하는 것과 관계없이 클래스 이름으로 참조할 수 있다.
2. 상속할 수 없는 final 클래스
클래스를 final로 선언하면 상속할 수 없다. 상속을 하게 되면 변수나 메서드를 재정의 할 수 있기 때문에 이를 막기 위해 final로 선언한다.
3. 프로그램을 잘 구현하는 또 다른 방법
<테스트 주도 개발(TDD>
테스트 주도 개발은 실제로 테스트 코드를 먼저 개발하는 방법이다.
'Java > Do It! 자바 프로그래밍' 카테고리의 다른 글
[JAVA] 11-1. 기본 클래스_Object 클래스 (0) | 2022.05.07 |
---|---|
[JAVA] 10. 인터페이스 (0) | 2022.05.07 |
[JAVA] 08. 상속과 다형성 (0) | 2022.05.04 |
[DoItJava] 07. 배열과 ArrayList (0) | 2022.05.04 |
[DoItJava] 06. 클래스와 객체2 (0) | 2022.05.03 |