티스토리 뷰
📌 230801 TIL : 업캐스팅 이유, 템플릿 메소드, 프레임워크와 라이브러리의 차이
1. 업캐스팅 하는 이유
Animal -> Human 을 상속받는다 할 때,
1️⃣ Animal human = new human();
2️⃣ Human human = new human();
2️⃣가 기능적인 면에서는 Human 클래스의 모든 메소드에 접근이 가능하다는 점에서 밑이 더 나은데
왜 위의 업캐스팅된 버전을 쓰는지 궁금했다.
//1번 그냥 선언(?)
Human[] humans = new Human[2];
humans[0] = new Human();
humans[1] = new Human();
Tigar[] tigars = new Tigar[2];
tigars[0] = new Tigar();
tigars[1] = new Tigar();
Eagle[] eagles = new Eagle[2];
eagles[0] = new Eagle();
eagles[1] = new Eagle();
//2번 상위클래스로 형변환 하여 선언.
Animal[] animals = new Animal[6];
animals[0] = new Human();
animals[1] = new Human();
animals[2] = new Tigar();
animals[3] = new Tigar();
animals[4] = new Eagle();
animals[5] = new Eagle();
2번처럼 업캐스팅 하여 하나의 자료형으로 관리하면 훨씬 코드량도 줄어들고, 가독성이 증가하며, 유지보수도 용이해진다.
하위 클래스의 고유한 메소드를 실행시키려면 다운 캐스팅 방법을 이용하면 된다.
2. 템플릿 메소드
- 프레임워크에서 많이 쓰이는 메소드 패턴
- 추상메소드나 구현된 메소드를 활용하여 코드의 흐름(시나리오)를 작성하는 메소드
- 앞에 final을 붙여, 하위클래스에서 재정의하지 못하도록 한다.
- 추상클래스로 선언된 상위 클래스에서 템플릿 메서드를 활용하여 전체적인 흐름을 정의하고, 하위 클래스에서 다르게 구현되어야 하는 부분은 추상 메소드로 선언하여 하위 클래스에서 구현하도록 함.
💡 라이브러리와 프레임워크의 차이
라이브러리는 JDK 같은 자주 사용하는 로직의 모음을 의미하고, 프레임워크는 프로그램의 뼈대를 정의해놓은 것을 의미한다. 대표적인 예시로는 스프링프레임워크, 안드로이드가 있다. 라이브러리는 개발자가 전체적인 흐름을 만들며 코드를 넣는 것에 반해, 프레임워크는 개발자가 정해진 흐름 위에서 코드를 넣는 것에 대한 차이가 있다. 즉 개발자가 코드를 작성하면, 프레임워크가 정의한 흐름대로 프로그램이 실행된다.
📝 코드 예시
추상클래스 Car -> AICar, ManualCar 상속
public abstract class Car {
public abstract void drive(); //구현 필수
public abstract void stop(); //구현 필수
public void starCar() {
System.out.println("시동을 켭니다.");
}
public void turnOff() {
System.out.println("시동을 끕니다.");
}
public void washCar() {
//필요한 경우의 재정의할것.
}
//템플릿 메소드
public final void run() { //하위 클래스에서 재정의 못하도록 함.
starCar();
//추상메소드이므로 반드시 하위 클래스에서 정의를 해줘야한다.
drive();
stop();
washCar(); //필요한 경우의 재정의하면 된다.
turnOff();
}
}
public class AICar extends Car {
@Override
public void drive() {
System.out.println("자율 주행을 합니다.");
System.out.println("자동차가 스스로 방향을 바꿉니다.");
}
@Override
public void stop() {
System.out.println("장애물 앞에서 스스로 멈춥니다.");
}
@Override
public void washCar() {
System.out.println("자동 세차를 시작합니다.");
}
}
public class ManualCar extends Car {
@Override
public void drive() {
System.out.println("사람이 운전을 합니다.");
System.out.println("사람이 핸들을 조작합니다.");
}
@Override
public void stop() {
System.out.println("장애물을 만나 브레이크를 밟아 정지합니다.");
}
}
public class CarTest {
public static void main(String[] args) {
Car aiCar = new AICar();
Car manualCar = new ManualCar();
aiCar.run();
System.out.println();
manualCar.run();
}
}
📝 실행 결과
템플릿 메소드인 run() 에 정의한 코드의 흐름대로 코드가 진행되는 것을 확인할 수 있다.
'백엔드 공부하기 > TIL' 카테고리의 다른 글
230803 TIL : 상속 및 인터페이스와 추상클래스의 차이 (0) | 2023.08.03 |
---|---|
230802 TIL : 자바 인터페이스 정리 (0) | 2023.08.03 |
230731 TIL : JAVA에서의 상속, 다형성 정리 (0) | 2023.07.31 |
230728 TIL : JAVA 코드의 메모리 영역 (메소드 / 스택 / 힙) (0) | 2023.07.29 |
230727 TIL : 싱글톤 패턴 (0) | 2023.07.27 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 스터디후기
- 국비지원캠프
- 과정중간회고
- 백엔드
- 카카오API
- 백준
- 백엔드부트캠프
- 프로젝트후기
- 국비지원
- boj
- springboot
- 패스트캠퍼스강의
- 채팅기능개발
- 그룹스터디워크샵
- 커리어멘토링
- 야놀자
- 패스트캠퍼스
- qjzl
- 국비지원취업
- 데이터베이스
- 야놀자X패스트캠퍼스부트캠프
- be
- 백엔드개발자
- 그룹스터디
- TiL
- 자료구조 #스택 #큐 #덱 #선형자료구조
- 부트캠프
- #국비지원취업
- Java
- 자료구조
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함