Beny's Study
13_3. [강의] 다형성2 예제(추상클래스 이용) 본문
super class _Car
package com.kh.ex03.poly_abstract;
public abstract class Car { // 부모 클래스,abstract 추상클래스로 만들어 버림
protected int cc = 0; // 배기량
public Car(int cc) {
this.cc = cc;
}
public void oilling() {
System.out.println("주유중 입니다.");
}
public void move() {
System.out.println("부릉부릉");
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("Name : " + this.getClass().getSimpleName());
sb.append(", cc : " + cc);
return sb.toString();
}
}
abstract class HyundaiCar extends Car
package com.kh.ex03.poly_abstract;
public abstract class HyundaiCar extends Car {//HyundaiCar(브랜드)를 추상클래스로 하나 만들기
public HyundaiCar(int cc) {
super(cc);
}
//현대종류 차들이 공통적으로 각자 가지고 있었던 nickName을 추상메소드로 만들어버림!!!
abstract public void nickName();//앞으로 nickName이렇게만 쓰라고 고정시키는것
//일반메소드 : 공통적인 기능을 가질때 사용.
//현대차는 블루핸즈에서 수리받을수 있다(가정)해서 service로 메소드 추가로 생성함.
public void service() {
System.out.println("블루핸드로 출발합니다.");
}
// public static void main(String[] args) { // 생성 불가능함. why?
// HyundaiCar Car = new HyundaiCar(13) {//추상클래스는 생성되지 않기 떄문이다!
// }
}
추상클래스 특징
1.생성되지 않는다.
2.abstract 메소드를 가질 수 있다.
3. 일반 메소드나 멤버변수 선언이 자유롭다.
사용방법: 상속이나 Type으로 활용된다.
abstract public void nickName();
추상메소드 : 몸통을 가지지 않는다! 그리고 상속받은 클래스에서 강제로 생성한다.
Sonata extends HyundaiCar
package com.kh.ex03.poly_abstract;
public class Sonata extends HyundaiCar{
//why? HyundaiCar.java에서 상속했기 때문에 바꾸기 (Car>HyundaiCar>Sonata)개념
public Sonata() {
super(2000); // 2000 CC
}
@Override
public void oilling() {
System.out.println("휘발유를 주유중입니다.");
}
@Override
public void move() {
System.out.println("부르르르르릉");
}
@Override
public void nickName() {
System.out.println("소나 타는 차");
}
}
SonatanickName을 nickName으로 변경한다(예제 1과 다른점)
why? Sonata보다 상위클래스인 HyundaiCar에서 각 차들의 각각 설정된 닉네임을
abstract public void nickName();로 추상메소드로 만들었기 때문에!
Grandure extends HyundaiCar
package com.kh.ex03.poly_abstract;
public class Grandure extends HyundaiCar {//클래스 이름을 Car->HyundaiCar로 변경한다
//why? HyundaiCar.java에서 상속했기 때문에 바꾸기 (Car>HyundaiCar>Grandure)개념
public Grandure() {
super(3000); // 3000cc 배기
}
@Override
public void oilling() {
System.out.println("휘발유를 주유중입니다.");
}
@Override
public void move() {
System.out.println("(조용한)부르르르르릉");
}
@Override
public void nickName() {
System.out.println("각그랜저");
}
}
GrandurenickName을 nickName으로 변경한다(예제 1과 다른점)
why? Grandure보다 상위클래스인 HyundaiCar에서 각 차들의 각각 설정된 닉네임을
abstract public void nickName();로 추상메소드로 만들었기 때문에!
Avante extends HyundaiCar
package com.kh.ex03.poly_abstract;
public class Avante extends HyundaiCar {//클래스 이름을 Car->HyundaiCar로 변경한다
//why? HyundaiCar.java에서 상속했기 때문에 바꾸기 (Car>HyundaiCar>Avante)개념
public Avante() {
super(1600); // 아반떼는 1600cc 이다.
}
@Override
public void oilling() {
System.out.println("휘발유를 주유중입니다.");
}
@Override
public void nickName() {//부모클래스의 메소드를 자식이 사용하기 위해 오버라이드!
System.out.println("아방이");
}
}
AvantenickName을 nickName으로 변경한다(예제 1과 다른점)
why? Avante보다 상위클래스인 HyundaiCar에서 각 차들의 각각 설정된 닉네임을
abstract public void nickName();로 추상메소드로 만들었기 때문에!
BMWM5 extends Car
package com.kh.ex03.poly_abstract;
public class BMWM5 extends Car{
public BMWM5() {
super(4395); // cc가 커지면 배기량 올라감 = 힘, 토크, 마력
}
@Override
public void oilling() {
System.out.println("고급 휘발유를 주유중입니다.");
System.out.println("기름을 땅바닥에 뿌립니다.");
}
@Override
public void move() {
System.out.println("부와와와와와왕아아아앙앙(시끄럽게)");
}
void doc3sa() { // 독삼사 = BMW, 벤츠, 아우디
System.out.println("나는 독일에서 온 자동차야.");
}
}
TeslaModel3 extends Car
package com.kh.ex03.poly_abstract;
public class TeslaModel3 extends Car {
//다른 규격의 자동차모델 자식클래스를 생성했을경우! => 어떻게하는지 ex04에서 보자!
// 전기차인데... CC?
public TeslaModel3() {// 해외 전기차이기때문에 현대차랑 규격(연비단위) 틀림(가정한다)
super(175); // kw/h 단위인데... cc?
}
@Override//생성
public void oilling() { // 호환 안되는듯?// 전기차는 오일링이 아닌데 그냥 연습하는거라 가정후 입력
System.out.println("충전중인데... 오일링?");
}
@Override//생성
public void move() {
System.out.println("(조용히) 위이이이이이잉");
}
}
Run
package com.kh.ex03.poly_abstract;
public class _Run {
public static void main(String[] args) {
Car[] carArray = new Car[4];// 4로 변경
//System.out.println(Arrays.toString(carArray));
//carArray[0] = new Car(1000); // 추상클래스는 생성되지 않음!
carArray[0] = new Avante();
carArray[1] = new Sonata();
carArray[2] = new Grandure();
carArray[3] = new BMWM5();
for (int i = 0; i < carArray.length; i++) {
//((Avante)carArray[i]).oilling(); // java.lang.ClassCastException(오류뜸)
// why? 캐스팅 잘못해서(형변환 잘못해서?) => 형변환 함부로 하면 안되고 instanceof로 타입 체크하면서 변환해야함!
//출력하면 인덱스 0은 같은 아반떼라 출력이 되는데 나머지는 아반떼랑 상속관계아니라서 출력안되고 오류
printCar(carArray[i]);
}
}
private static void printCar(Car car) { // 인자가 다형성 속성을 사용중
System.out.println(car.toString());
car.move();
car.oilling();
//ex02패키지의 Run 에서 instanceof뒤에 현대 차종류 별로 각각 되있던걸 새로 생성한 상위추상클래스인HyundaiCar 로 변경해줌.
if (car instanceof HyundaiCar) {
((HyundaiCar) car).nickName();
((HyundaiCar) car).service();
}
if (car instanceof BMWM5) {
((BMWM5) car).doc3sa();
}
System.out.println("--------------------------------------");
}
}
car.move(); & car.oilling();
동적 바인딩 : 실행 전에 호출될 메소드를 정하지 않고,실행 후 실시간(동적)으로 메소드를 호출하는 방법
(car instanceof HyundaiCar)
instanceof는 상속관계 확인해준다
((HyundaiCar) car).nickName();
추상클래스로 Type Casting이 가능하다!즉, HyundaiCar를 타입으로 씀!
((HyundaiCar) car).service();
현대차는 모두 블루핸즈로 출발합니다가 뜸(HyundaiCar추상클래스에 있던 메소드)
[출력부]
Name : Avante, cc : 1600
부릉부릉
휘발유를 주유중입니다.
아방이
블루핸드로 출발합니다.
--------------------------------------
Name : Sonata, cc : 2000
부르르르르릉
휘발유를 주유중입니다.
소나 타는 차
블루핸드로 출발합니다.
--------------------------------------
Name : Grandure, cc : 3000
(조용한)부르르르르릉
휘발유를 주유중입니다.
각그랜저
블루핸드로 출발합니다.
--------------------------------------
Name : BMWM5, cc : 4395
부와와와와와왕아아아앙앙(시끄럽게)
고급 휘발유를 주유중입니다.
기름을 땅바닥에 뿌립니다.
나는 독일에서 온 자동차야.
--------------------------------------
"본 인터넷 사이트 내의 모든 이미지, 문구, 콘텐츠, 내용 등에 대한 저작권은 76beny에게 있습니다.
이를 무단으로 도용, 복사, 전재, 재배포, 2차 변형 등을 할 경우
민, 형사상 법적 조치 등 저작권법에 의거하여 처벌 받을 수 있습니다."
'[JAVA] > 09. 다형성' 카테고리의 다른 글
13_2. [강의] 다형성1 예제 (0) | 2022.05.29 |
---|---|
13_1. [강의] 다형성 기본문법 (0) | 2022.05.29 |
12. 내부클래스(클래스안의 클래스) (0) | 2022.04.27 |
11. deafult메서드&static메서드 (0) | 2022.04.27 |
10. 다형성코드예제 ver.3( 인터페이스 추가해보기) (0) | 2022.04.15 |