자바의 핵심 - 추상클래스 Abstract, 추상 메서드, 템플릿 메서드, 다형성

Yeppi's 개발 일기·2022년 5월 23일
0

JAVA

목록 보기
18/27

1. 추상화

1) 추상 메서드

  • 메서드 시그니처만 있고 구체적인 로직은 없음
  • abstract 키워드
abstract void person();


2) 추상 클래스

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

🍑 메서드 선언 VS 정의 🍑

  • 메서드 선언(declaration)
    → 반환타입, 메서드 이름, 매개변수로 구성
  • 메서드 정의(definition)
    → 메서드 구현(implementation)과 동일한 의미 구현부(body) 를 가짐 ({ })

📌 예시 📌

  • 추상 클래스 안에 여러 추상 메서드가 올 수 있음
  • int add(int x, int y); // 추상 메서드 선언
  • int add(int x, int y){ } // 추상 클래스 선언 // 구현부가 있음, 추상 메서드 아님

  • 추상메소드가 없는데, 추상클래스로 선언한 경우?
    인스턴스화해서 쓰는 게 아니라, 상속만을 하기위해
public abstract class Desktop extends Computer { // Computer.java로 부터 상속받아서, Desktop에서 구현

	@Override
	public void display() {
		System.out.println("Desktop display");
	}

	@Override
	public void typing() {
		System.out.println("Desktop typing");
	}

	
	// 상위클래스에서 구현된 것을 다시 여기서 재정의 해도됨
	@Override
	public void turnOff() {
		System.out.println("Desktop typing");
	}
		

}


3) 다형성(Polymorphism)

  • 객체지향의 상속, 메서드 오버라이딩, 타입 변환을 사용하여 다형성 적용

🧐 다형성이 필요한 이유 🧐

유지보수를 위해!
객체지향의 핵심이자 Java 를 쓰는 이유이다..!


📌 예시 📌

  • 추상 클래스, 최상위 클래스
public abstract class TV { 
	TV() {
		System.out.println("TV");
	}

	abstract void powerOn();
	abstract void powerOff();
	abstract void volumeUp();
	abstract void volumeDown();
}
  • 상속 받는 LG TV, Samsung TV 클래스
public class LgTV extends TV{ 

	LgTV() {  	
		System.out.println("LgTV");
	}

	void powerOn() { 
		System.out.println("LgTV powerOn");
	}
    
	void powerOff() {
		System.out.println("LgTV powerOff");
	}
	 
	void volumeUp() { 
		System.out.println("LgTV volumeUp");
	}
    
	void volumeDown() { 
		System.out.println("LgTV volumeDown");
	}
}
public class SamsungTV extends TV{ 

	LgTV() {  	
		System.out.println("SamsungTV");
	}

	void powerOn() { 
		System.out.println("SamsungTV powerOn");
	}
    
	void powerOff() {
		System.out.println("SamsungTV powerOff");
	}
	 
	void volumeUp() { 
		System.out.println("SamsungTV volumeUp");
	}
    
	void volumeDown() { 
		System.out.println("SamsungTV volumeDown");
	}
}
  • 클라이언트가 사용할 클래스(TV 리모컨)
ublic class TVFactory {
	TV makeTV(String tvId) {
		if(tvId.equals("lg")) {
			return new LgTV();
		} else (tvId.equals("samsung")) {
			return new SamsungTV();
		} 
		return null;
	}
}
  • 실행 클래스(main)
public class TVClient {
	public static void main(String[] args) {
		TVFactory factory = new TVFactory();
		
		TV tv = (TV) factory.makeTV(args[0]); 
		tv.powerOn();
		tv.volumeUp();
		tv.volumeDown();
		tv.powerOff();
	
	}
}
  • Run Configurations에 lg 입력

출력결과

LgTV
LgTV powerOn
LgTV powerOff
LgTV volumeUp
LgTV volumeDown 


2. 템플릿 메서드

1) 개념

  • 추상 메서드나 구현 된 메서드를 활용하여 코드의 흐름(시나리오)를 정의하는 메서드
  • 프레임워크에서 많이 사용되는 설계 패턴
  • 메서드에 final 이 쓰이면?
    final 로 선언하여 하위 클래스에서 재정의 할 수 없게 함

  • 클래스에 final 을 적용하면?
    상속받을 수 없게 함

  • 변수에 final 선언하면 ?
    상수

  • 추상 클래스로 선언된 상위 클래스에서 템플릿 메서드를 활용
    ⇒ 전체적인 흐름을 정의 하고
  • 하위 클래스에서 다르게 구현되어야 하는 부분
    ⇒ 추상 메서드로 선언하여 하위 클래스에서 구현 하도록 함


📌 예제 📌

 // hook 훅 메서드 
 // 구현된 메서드인데, 구현 내용이 없는 것 => 자식 클래스에서 재정의(오버라이딩) 할때 사용
public void washCar() {}
	

// 우리가 변경할 수 없는 시나리오
// 주행을 하기 위해 필요한 메소드를 넣는다 -> 구현 메소드, 추상 메소드 상관없음

// 안에 추상 메서드 순서대로 동작해야함 -> 변하면(재정의하면) 안되기 때문에 final
final public void run() { 
	
  		starCar(); // 구현된 메소드
		drive(); // 추상 메소드
		wiper(); // 추상 메소드
		stop(); // 추상 메소드
		turnOff(); // 구현된 메소드
		washCar(); // 구현된 빈 메소드를 오버라이딩

}

  • 공통메서드는 구현메서드로, 아닌건 추상메서드
  • 공통메서드도 하위클래스에서 재정의가능
  • 재정의하면 안되는 것들은 final 로 선언해두기
profile
imaginative and free developer. 백엔드 / UX / DATA / 기획에 관심있지만 고양이는 없는 예비 개발자👋

0개의 댓글