클래스를 정의할 때, 불필요한 부분들을 생략하고 객체의 속성 중 중요한 것에만 중점을 두어 개략화 하는 것.
추상화를 통해 코드를 잘 설계했다면 여러개의 클래스를 정의했을 때, 중복 코드가 현저히 줄어들 것.
- 코드가 간결해지기 때문에 생산성 증가, 유지 보수, 가독성 증가
- 잘 만들어진 슈퍼 클래스 덕분에 코드의 재사용성이 증가
abstract는 주로 클래스와 메서드를 형용하는 키워드로 사용되는데, 메서드 앞에 붙은 경우를 '추상 메서드(abstract method)', 클래스 앞에 붙은 경우를 '추상 클래스(abstract class)'라 부른다.
abstract class AbstractExample {
//추상 메서드가 최소 하나 이상 포함돼있는 추상 클래스
abstract void start(); // 메서드 바디가 없는 추상메서드
}
추상 메서드는 메서드의 바디가 없는 메서드를 의미하는데, abstract키워드를 메서드 이름 앞에 붙여주어 해당 메서드가 추상 메서드임을 명시한다.
AbstractExample abstractExample = new AbstractExample();
//오류 발생
추상 클래스는 미완성 설계도이기 때문에 메서드 바디가 완성이 되기전까지 객체 생성이 불가하다.
그럼에도 사용되는 이유는 상속 관계에 있어 새로운 클래스를 작성하는데 매우 유용하다. 메서드의 내용이 상속을 받는 클래스에 따라서 종종 달라지기 때문에 상위 클래스에서는 선언부만 작성하고, 구체적인 내용은 하위 클래스에서 구현하도록 비워두면 설계하는 상황이 변하더라도 유연하게 대응할 수 있다. 이때 사용되는게 '오버라이딩'이다.
final키워드는 변수, 메서드, 클래스에 사용될 수 있다. final 키워드가 어떤 곳에 사용되냐에 따라 다른 의미를 가진다.
| 위치 | 의미 |
|---|---|
| 클래스 | 변경 또는 확장 불가능한 클래스, 상속 불가 |
| 메서드 | 오버라이딩 불가 |
| 변수 | 값 변경이 불가한 상수 |
각각 조금의 차이는 있지만 결국 공통적으로 변경이 불가능하고 확장할 수 없다는 점이 유사하다.
final class FinalEx { // 변경/확장 불가능한 클래스
final int x = 1; //값이 변경되지 않는 상수
final void getNum() { //오버라이딩이 불가한 메서드
final int localVar = x; //상수
return x;
}
}