ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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();
    		//시동을 켭니다.
    		//수동 주행을 합니다.
    		//수동 주행을 정지합니다.
    		//시동을 끕니다.
    	}
    }

    주의 사항은 인터페이스도 같은 역할을 하지만, 추상화 클래스는 정의를 해도되고 안해도 된다는 점이다. 인터페이스는 구현부가 없어야하고, 추상화 클래스는 있어도 되고 없어도된다는 것이 차이점이라는 점을 알아두자

    반응형

    댓글

Designed by Tistory.