추상메서드란
"추상" 사전적 의미로 "여러가지 사물이나 개념에 공통되는 특성이나 속성따위를 추출하여 파악하는 작용"이라는 의미이다.
추상화 : 클래스간의 공통점을 찾아내서 공통의 부모를 설계하는 작업
구체화 : 상속을 통해 클래스를 설계, 확장하는 작업
여러 객체에 공통되는 사항을 추출하여 부모 클래스에 선언 및 구현을 하고 자식 클래스에는 특징을 구현하여 기능을 확장한다. 이 내용만 보면 상속의 개념과 동일하게 보일 것이다. 추상 클래스는 단순 기능 확장에 개발의 표준화 정도를 올려준다. 아래 내용에서 그 이유를 살펴 보겠다.
추상 메서드를 선언하는 이유
설계자가 특정 메서드를 각 클래스 별로 재 구현을 원하지만 부모 클래스에서 일반 메서드로 구현하면 자식 클래스에서 구현을 하지 않는 경우가 발생할 수 있다. 이런 메서드를 추상 메서드로 선언하면 자식 클래스는 재 구현을 강요받는다.
추상 클래스의 장점
1. 부모클래스에서 공통 부분을 구현과 설계가 완료되면 자식 클래스에서 상속받아 기능을 확장 시 이롭다.
2. 자식 클래스에서 추상메서드를 반드시 구현하도록 강요한다. 이는 프로그램의 표준화 정도를 높인다.
3. 공통 사항이 한곳에서 관리되어 개발 및 유지보수에 용이하다.
추상 메서드 선언 방법
추상 클래스 및 추상 메서드를 선언하는 방법은 class, return type 앞에 abstract를 선언해 주면 된다. 그리고 추상 메서드에서 주석을 사용해서 메서드의 기능을 설명을 기입니다.
abstract class 클래스명{ |
비고) 추상 메서드를 포함하지 않아도 abstract class로 선언하면 이는 추상 클래스로 인지된다. 즉, 상속을 통해 인스턴스를 생성해야 한다.
추상 클래스 생성 방법
추상 클래스는 아직 구현되지 않는 기능을 포함한 클래스이다. 미 구현된 클래스는 인스턴스화 시킬수 없다. 다른 클래스에서 추상 클래스를 상속하여 미 구현된 메서드를 오버라이딩하여 재구현하고 자식 클래스를 인스턴스화 하여 사용해야 한다.
부모클래스 c = new 자식클래스(); |
추상 클래스 설계 및 구현
택시와 버스는 사람을 목적지까지 운송해주는 운송수단이다. 즉, 운송수단 객체를 추상 클래스로 선언하고 이를 택시 객체와 버스 객체에서 상속받아 필요에 맞게 기능을 재구현 하도록 하겠다.
운송수단(부모 클래스)
탑승하다 : 선언 및 기능 구현 |
택시(자식 클래스)
이동하다 : 재 구현(목적지에 도착하다) |
버스(자식 클래스)
이동하다 : 재 구현(목적지 근처에 정류장에 도착하다) |
설계자는 자식 클래스에서 이동하는 방법과 교통비 지불 방법을 클래스 별 특성에 맞게 재 구현을 원할 경우 두 기능을 추상 메서드로 선언하고 자식 클래스에서 재 구현하도록 설계하면 된다.
예제
부모 클래스
abstract class Vehicle { |
자식 클래스 1
public class Taxi extends Vehicle { @Override @Override |
자식 클래스2
public class Bus extends Vehicle { @Override @Override |
실행 클래스
public class AbstractTest { |
결과화면
탑승하다 |
위 설계를 바탕으로 개발을 하였다. board()는 모든 운송수단의 공통 기능으로 정의하고 이동 방법과 요금 납부를 자식 클래스에게 구현을 위임하였다. 결과 화면을 보면 "탑승하다"의 기능은 Vehicle 클래스의 메서드를 사용했으며, "이동하다", "지불하다"의 기능은 자식 클래스의 기능이 사용됨을 확인할 수 있다.
감사합니다.
'Programming > Java' 카테고리의 다른 글
[Java]File Write/쓰기 (OutputStream/BufferedOutputStream) (0) | 2024.06.08 |
---|---|
[Java]File 읽기/Read (FileInputStream, BufferedInputStream) (0) | 2024.06.08 |
[Java]File 읽기(read)/쓰기(write) (0) | 2024.06.08 |
Causes of getting a java.lang.VerifyError (0) | 2024.05.28 |
[Java-자바]인터페이스(interface) (0) | 2017.02.05 |