일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- SKT
- 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지
- 직장인인강
- 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online.
- 패캠챌린지
- albert
- 알버트
- 한번에끝내는Java/Spring웹개발마스터초격차패키지
- AI
- R
- 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online
- 패스트캠퍼스
- 직장인자기계발
- 패스트캠퍼스후기
- Today
- Total
제주 탈출 일지
패스트캠퍼스 챌린지 19일차 본문
19일차.. 오늘은 좀 지치다...
10. 추상 클래스의 응용 - 템플릿 메서드 패턴
프레임워크 -> 프로그래머에게 제어권이 없음. 흐름은 이미 정해져있다. 프로그래머가 할 수 있는것은 정해진 흐름속에서 세부적인 동작을 프로그래밍 한다.
프레임워크에서 아주 많이 쓰이는 패턴 중 하나가 템플릿 메서드 패턴
템플릿 메서드 패턴은 틀을 가진 메서드.
즉, 추상 메서드나 구현 된 메서드를 활용하여 코드의 흐름을 정의하는 메서드
final로 선언하여 하위 클래스에서 재정의 할 수 없게 함. (변수에 쓰이면 상수)
추상 클래스로 선언된 상위 클래스에서 템플릿 메서드를 활용하여 전체적인 흐름을 정의하고, 하위 클래스에서 다르게 구현되어야 하는 부분은 추상 메서드로 선언하여 하위 클래스에서 구현하도록 함.
추상 메소드는 아니지만, 구현부를 구현하지 않아( public void hi() { } ) 하위 클래스에서 필요하다면 재정의해서 사용하는 메소드를 훅 메소드라고 한다. 그것들을 재정의해서 사용할 수도 있다.
Car 클래스
package ch10;
public abstract class Car {
public abstract void drive();
public abstract void wiper();
public abstract void stop();
public void startCar() {
System.out.println("시동을 켭니다.");
}
public void turnOff() {
System.out.println("시동을 끕니다.");
}
public void washCar() {}
final public void run() {
startCar();
drive();
wiper();
stop();
turnOff();
washCar();
}
}
AICar 클래스
package ch10;
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 wiper() {
// TODO Auto-generated method stub
}
@Override
public void washCar() {
System.out.println("자동 세차를 합니다.");
}
}
ManualCar 클래스
package ch10;
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() {
// TODO Auto-generated method stub
}
}
CarTest 클래스
package ch10;
public class CarTest {
public static void main(String[] args) {
Car aiCar = new AICar();
aiCar.run();
System.out.println("===========================");
Car mCar = new ManualCar();
mCar.run();
}
}
run은 final 키워드로 하위 클래스에서 재정의 할 수있고, 하나의 흐름으로 동작하는 것을 볼 수 잇다. 하위 클래스에서 재정의 할 부분은 재정의 해서 결국 run으로 동작한다.

public static final -> 상수 값 정의
enumeration을 이용해서 상수 정의를 할 수 도 잇다.
11. 인터페이스(interface)
인터페이스는 추상 메서드로만 선언된다. 자바8으로 넘어가면서 구현부가 조금씩 들어온것도 있다. public abstract
인터페이스의 모든 변수는 상수로 선언된다. public static final
상속은 이미 구현된 내용을 가져오는 것이지만, 인터페이스는 구현 코드가 없기 때문에 클래스가 인터페이스를 "구현"한다고 한다. <--- 이렇게 점점점으로 클래스 다이어그램에서 화살표 표시가 되어 있는듯?
구현상속
타입상속 : 인터페이스를 통해 구현한 클래스를 인터페이스 형으로 형변환 할 수 있다.
클래스는 여러개의 클래스를 상속할 수 없다. (모호성 발생)
하지만 클래스는 여러개의 인터페이스는 구현할 수 있다.(인터페이스는 어떤 것도 구현되지 않았기 때문에 모호성이 발생하지 않는다.)
Calc interface
package ch11;
public interface Calc {
double PI = 3.14;
int ERROR = -999999999;
int add(int num1, int num2);
int substract(int num1, int num2);
int times(int num1, int num2);
int divide(int num1, int num2);
}
Calculator 클래스
package ch11;
public abstract class Calculator implements Calc {
@Override
public int add(int num1, int num2) {
// TODO Auto-generated method stub
return num1 + num2;
}
@Override
public int substract(int num1, int num2) {
// TODO Auto-generated method stub
return num1 - num2;
}
}
CompleteCalc 클래스
package ch11;
public class CompleteCalc extends Calculator {
@Override
public int times(int num1, int num2) {
return num1 * num2;
}
@Override
public int divide(int num1, int num2) {
if (num2 == 0) {
return ERROR;
}
return num1 / num2;
}
public void showInfo() {
System.out.println("모두 구현했습니다.");
}
}
CalculatorTest 클래스
package ch11;
public class CalculatorTest {
public static void main(String[] args) {
int num1 = 10;
int num2 = 2;
calc calc = new CompleteCalc();
System.out.println(calc.add(num1, num2));
System.out.println(calc.substract(num1, num2));
System.out.println(calc.times(num1, num2));
System.out.println(calc.divide(num1, num2));
//calc.showInfo();
}
}
CalculatorTest에서 calc변수는 calc 인터페이스 형으로 형변환된다. 이것을 타입상속을 받는다고 이야기함.
calc에 있는 메소드들을 모두 사용할 수 있다.
만약 calc를 CompleteCalc 클래스 형으로 선언했다면 주석처리한 calc.showInfo(); 메소드도 사용할 수 있을 것이다.
12. 인터페이스는 왜 쓰는가?
클래스나 프로그램이 제공하는 기능을 명시적으로 선언
클라이언트는 인터페이스를 보고 이러이러한 메소드들이 구현되었구나 하고, 그 인터페이스만 보고 사용하게 된다.
일종의 명세.
어떤 객체가 하나의 인터페이스 타입이라는 것은 그 인터페이스가 제공하는 모든 메서드를 구현했다는 의미.
실무에서 호출을 하는 쪽은 그 내부적으로 어떻게 돌아가던간에 쓰는 방식은 동일하게 인터페이스에 대한 명시되어 있는 대로 사용하게 된다.
이번 강의는 코딩은 안함.,
내일 객체 지향 핵심 파트 마치는걸로... 오늘은 졸려서 이만.
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
'패스트캠퍼스 챌린지!' 카테고리의 다른 글
패스트캠퍼스 챌린지 21일차 (0) | 2021.09.26 |
---|---|
패스트캠퍼스 챌린지 20일차 (0) | 2021.09.25 |
패스트캠퍼스 챌린지 18일차 (0) | 2021.09.23 |
패스트캠퍼스 챌린지 17일차 (0) | 2021.09.22 |
패스트캠퍼스 챌린지 16일차 (0) | 2021.09.21 |