여러 클래스에 공통적으로 사용될 수 있는 추상클래스를 바로 작성하거나 기존클래스의 공통 부분을 뽑아서 추상클래스를 만든다.
- 각 유닛의 위치와 이동,정지 기능이 공통된다.
- 그래서 공통된 기능을 하나의 Unit이라는 클래스를 만들어 담았다.
- 보병과 탱크, 수송선은 Move라는 공통된 기능이 있지만, 각각 이동하는 방법(지상, 공중)이 다르기 때문에 선언부는 일치하지만, 몸통{}이 다르다.
- 아래와 같은 코드가 가능해진다.
Unit [] group = new Unit[3]; group[0] = new Marine(); group[1] = new Tank(); group[2] = new Dropship(); for(int i=0; i < group.length; i++) group[i].move(100,200);
- move를 호출하면 추상클래스의move가 아닌 각 객체의 move 메서드가 실행된다.
- 여러 종류의 객체를 하나의 배열에 담아서 설정 가능하다.
- Object도 다형성이 가능 (Object는 최고조상이기 때문)
- Object 클래스에 move 메서드가 없기 때문에 에러가 발생한다.
추상클래스의 필요성
Ex) 50인치 Tv A, B, C가 존재
- 비슷한 설계도(공통된 기능 + 살짝 다른 기능)
- 그런데, 변경할 점이 생기면 각각 다 변경해야 하는 번거로움이 생김
- 그래서 미완성 설계도에 공통된 기능을 넣고 이를 바탕으로 각각의 설계도를 완성한다.
- 그렇게 되면, 미완성 설계도는 부모 / 완성된 설계도는 자손이 된다.
- 중복이 제거되고, 각각 필요한 자신들의 기능만 추가하면 완성이 된다.
- 처음보다 설계도 만들기가 쉬워지고, 새로운 모델이 만들어질 때에도 미완성 설계도를 상속받아서 자신이 필요한 기능만 추가하여 완성할 수 있게 된다.
- 공통된 기능 중 어떤 것을 변경하게 되었을 때, 원래대로라면 하나씩 다 바꿔야 하지만, 미완성 설계도에서 변경하면 자동으로 변경된다.
- 요약 : 추상클래스로 인해 쉽게 작성할 수 있으며, 중복도 가능하고, 코드의 관리(변경)가 용이해진다.
- 추상클래스를 하나하나 만드는 것이 아니라, 단계별로 만들어서 자손 -> 자손 -> 조상 순으로 만들고 이는 내려갈수록 점점 구체적이 된다.
- 이를 통해 공통된 기능 중 변경하고 싶은 것이 있는 중간 단계에서 변경할 수 있다.
추상화(불명확) <-> 구체화(명확, 구체적)
추상화된 코드는 구체화된 코드보다 유연하다. (=변경에 유리)GregorianCalendar cal = new GregorianCalendar(); // 구체적 (사용할 클래스 명시 & 참조 타입이 일치) Calendar cal = Calendar.getInstance(); // 추상적 (Calendar의 자손 객체를 반환 & 참조변수를 Calendar로 받는다. & getInstance가 무엇을 반환할지 모른다. public static Calendar getInstance(Locale aLocale) { return createCalendar (TimeZone.getDefault(), aLocale); }
- 객체 생성을 반환 그러나, Calendar 타입에 따라 다른 값들을 반환
- 위의 두번째 (추상적) 클래스로 사용할 시, 각각에 맞는 달력에 맞게 값을 반환해준다.