-
[JAVA abstract]추상화 클래스 , 메서드 알아보기프로그래밍/Java 2022. 3. 20. 11:15반응형
추상화 클래스
- 구현 코드 없이 메서드의 선언만 있는 추상메서드를 포함한 클래스
- 메서드 선언 반환타입, 메서드 이름, 매개변수로 구성
- 메서드 정의 네서드구현과 동일 한 의미 구현부를 가짐
- 추상 클래스는 new할 수 없음(인스턴스 생성 x)
추상클래스 사용 방법
- 클래스 앞에 abstract를 붙인다
- 추상 메소드가 있어야 한다.
- 하위 클래스에서 추상화가 적용된 부분을 모두 재구성하여 사용한다면 abstract를 사용하지 않아도 된다.
- 하위 클래스에서 추상화가 적용된 부분을 모두 재구성하지 않는다면 abstract를 클래스와 함수에 붙여두어야한다. 안그럼 오류 발생
//추상 클래스 public abstract class Computer { public abstract void display(); public abstract void typing(); public void turnOn() { System.out.println("전원을 켭니다."); } public void turnOff() { System.out.println("전원을 끕니다."); } } //하위 클래스 public class Desktop extends Computer{ //상위에 abstract method를 모두 재정의 해주었기 때문에 abstract를 사용하지 않아도 된다. //abstract를 클래스 앞에 붙이지 않았기 때문에 다른 곳에서 new ~~라는 인스턴스 생성이 가능하다. @Override public void display() { System.out.println("Desktop display"); } @Override public void typing() { System.out.println("Desktop typing"); } }
추상클래스는 어제 사용할까?
- 추상클래스란 추상적으로 구현이 되어야하는 부분을 메소드나 클래스 형식으로 내버려두고
- 상속받는 사람들이 알아서 재정의 및 재구현하게 의도하는 것을 의미한다.
- 밑에 메소드 public abstract 를 앞에 붙인 메소드가 있다.
- 이 부분은 Computer라는 클래스 안에서 구현하지 않을 것이다.
- 그러나 abstract로 설정해 놓으면 이런 부분을 정의해서 사용해야 한다고
- 하위 클래스에 알려주는 용도로 사용한다. 하위 클래스는 이것을 보고
- 이 부분을 재정의 해서 사용해도 되고 안해도 된다.
- 즉 framework처럼 방향성이나 템플릿을 주어 길을 제공해 주는 역할을 할 때 사용한다.
- 예로 템플릿 클래스,메서드가 있다.
public abstract class Car { //추상메소드 하위 클래스에서 꼭 재정의를 한다. public abstract void drive(); public abstract void stop(); public void startCar() { System.out.println("시동을 켭니다."); } public void turnOff() { System.out.println("시동을 끕니다."); } //final 을 접근제어자 앞에 붙이면 재정의가 되지 않는다. //꼭 이런 형태로 구동이 되게끔 정의를 해야한다고 만드는 로직 //이것이 템플릿 메서드이다. final public void run() { startCar(); drive(); stop(); turnOff(); } }
Car라는 추상화 클래스가 있다고 가정해보자. 하위 클래스에서 final public void run() { startCar(); drive(); stop(); turnOff(); } run이라는 메서드를 실행 시키게 만들기 위해서 run안에 있는 메서드의 내용을 재정의 하여 사용하도록 유도하고 싶다. 그리고 템플릿 메서드는 final을 사용하여 밑에서 재정의 및 재구성을 할 수 없도록 템플릿 형태로 제공한다. 이렇게 한 프로세스를 정의 해 두고 나머지는 재정의 해서 사용하게 유도하는 것이 바로 템플릿 클래스 , 메서드 이다.
//하위 클래스 1 //AICar.java public class AICar extends Car{ @Override public void drive() { System.out.println("자율 주행을 합니다."); } @Override public void stop() { System.out.println("자율 주행을 정지합니다."); } } //하위 클래스 2 //ManualCar.java public class ManualCar extends Car{ @Override public void drive() { System.out.println("수동 주행을 합니다."); } @Override public void stop() { System.out.println("수동 주행을 정지합니다."); } }
- 하위클래스를 이렇게 정의해 두고 구동을 시켜보면 아래와 같이 작동한다.
public class CarTest { public static void main(String[] args) { Car car1 = new AICar(); Car car2 = new ManualCar(); car1.run(); //출력 //시동을 켭니다. //자율 주행을 합니다. //자율 주행을 정지합니다. //시동을 끕니다. car2.run(); //시동을 켭니다. //수동 주행을 합니다. //수동 주행을 정지합니다. //시동을 끕니다. } }
주의 사항은 인터페이스도 같은 역할을 하지만, 추상화 클래스는 정의를 해도되고 안해도 된다는 점이다. 인터페이스는 구현부가 없어야하고, 추상화 클래스는 있어도 되고 없어도된다는 것이 차이점이라는 점을 알아두자
반응형'프로그래밍 > Java' 카테고리의 다른 글
[JAVA]객체 지향 디자인 패턴 - Singleton Pattern (0) 2022.03.22 [Java Interface] 인터페이스를 사용하는 이유 (0) 2022.03.20 [Java Overriding] 오버라이딩과 다형성 (0) 2022.03.20 [Java ] 클래스 상속 및 상속을 사용하는 이유 (0) 2022.03.20 [Java 객체지향 입문 ] 객체간의 협력 (0) 2022.03.17