ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA]java 추상 클래스/템플렛 매서드
    Languages/Java 2021. 3. 1. 10:46
    반응형

     

     

     

    추상클래스

     

     

    추상 메서드를 포함한 클래스
    추상 메서드는 구현코드 없이 메서드와 선언만 있다
    avstract 예약어 사용
    추상 클래스는 new(인스턴스화) 할수 없다

     

     

    ex)컴퓨터를 구현해본다고 하자

    (+덧붙이는 설명 추상메서드를 구현할 시에는 클래스도 abstract를 선언해 주어야 한다.

       선언이 아니고 구현이 일 시에는 ;이 아닌 {}인 body를 구현해 주어야 한다.

       추상 메서드는 인스턴스 화 할수 없다(ComputerTest에서 확인 가능))

     

     

    컴퓨터

     

    package abstractEx;
    
    public abstract class Computer {
    	
    	public abstract void display();//메서드를 구현하는게 아니라 선언만 하겠다
    	public abstract void typing();
    	
    	public void turnOn() {
    		System.out.println("전원을 켭니다");
    	}
    	public void turnOff() {
    		System.out.println("전원을 끕니다");
    	}
    
    }
    

     

    데스크탑

     

    package abstractEx;
    
    public class DeskTop extends Computer {
    
    	@Override
    	public void display() {
    		System.out.println("deskTop display();");		
    	}
    
    	@Override
    	public void typing() {
    		System.out.println("deskTop typing();");
    	}
    	
    	public void turnOn() {
    		System.out.println("deskTop turnOn();");
    	}
    }
    

     

    노트북

     

     

    package abstractEx;
    
    public abstract class NoteBook extends Computer {
    
    	@Override
    	public void display() {
    		System.out.println("NoteBook display();");
    	}
    }
    

     

    나의 노트북

     

    package abstractEx;
    
    public class MyNoteBook extends NoteBook {
    
    	@Override
    	public void typing() {
    		System.out.println("MyNoteBook typing();");
    	}	
    }
    

     

    ComputerTest

     

     

    package abstractEx;
    
    public class ComputerTest {
    	
    	public static void main(String[] args) {
    		
    		//Computer c1 = new Computer();
    		Computer c2 = new DeskTop();
    		//Computer c3 = new NoteBook();
    		
    		Computer c4 = new MyNoteBook();
    		c2.display();
    		c4.display();	
    	}
    }
    

     

     

    실행결과

     

     

     

     

    탬플렛 메서드

     

     

    추상메서드나 구현된 메서드를 활용하여
    전체 기능의 흐름을 정의하는 메서드
    final로 선언하면 하위 클래스에서 재정의 할 수 없다

    프레임 워크에서 많이 사용되는 설계 패턴
    추상 클래스로 선언된 상위 클래스에 템플릿 메서드를 활용하여
    전체적인 흐름을 정의 하고 하위 클래스에서 다르게 구현되어야
    하는 부분은 추상 메서드로 선언해서 하위 클래스가 구현하도로 한다

     

     

    final 예약어

     



    final 변수는 값이 변경될 수 없는 상수이다

    final변수는 오직 한번만 값을 할당할수 있다

    final매서드는 하위클래스에서 재정의(오버라이딩) 할수 없다

    final 클래스는 더이상 상속되지 않는다
    java의 String클래스

     

     

    ex)차를 구현해보자

     

     

    Car

     

    package template;
    
    public abstract class Car {
    	
    	public abstract	void drive();
    	public abstract void stop();
    	
    	public abstract void wiper();
    	public void washCar() {}
    	
    	public void startCar() {
    			System.out.println("시동을 켭니다");
    		}
    		public void turnOff() {
    			System.out.println("시동을 끕니다");
    		}
    		public final void run() {
    				startCar();
    				drive();
    				wiper();
    				stop();
    				washCar();
    				turnOff();    //이부분이 템플렛 메서드를 활용한 부분!!!!
    			}
    }
    

     

    ManualCar

     

    package template;
    
    public class ManualCar extends Car {
    
    	@Override
    	public void drive() {
    		System.out.println("사람이 운전합니다");
    		System.out.println("사람이 핸들을 조작합니다");
    	}
    
    	@Override
    	public void stop() {
    		System.out.println("사람이 브레이크로 정지합니다");
    	}
    
    	@Override
    	public void wiper() {
    		System.out.println("사람이 수동으로 조작합니다");
    	}
    	
    }
    

     

    AICar

     

    package template;
    
    public class AICar extends Car {
    
    	@Override
    	public void drive() {
    		System.out.println("차를 주행합니다");
    		System.out.println("자동차가 스스로 방향을 전환합니다");
    	}
    
    	@Override
    	public void stop() {
    		System.out.println("스스로 멈춥니다");
    	}
    	
    	public void wiper() {
    		System.out.println("비나 눈의 양의 따라 자동으로 조정됩니다");
    	}
    
    	@Override
    	public void washCar() {
    		System.out.println("자동으로 세차가 됩니다");
    	}
    }
    

     

    CarTest

     

    package template;
    
    public class CarTest {
    
    	public static void main(String[] args) {
    		
    		Car myCar = new ManualCar();
    		myCar.run();
    		
    		System.out.println("==========");
    		Car yourCar = new AICar();
    		yourCar.run();
    	}
    
    }
    

     

     

    실행결과

     

     

     

     

     

    반응형

    댓글

Designed by Tistory.