[JAVA]/09. 다형성
08. 다형성코드예제 1_하드코딩ver.
76beny
2022. 4. 15. 20:56
■ 부모클래스(최상위)
package com.kh.ex02.poly_example;
public class Car { // 부모 클래스 생성
//속성부(필드)
protected int cc = 0; //cc는 배기량//
//생성자(인자있는 생성자)
public Car(int cc) {//1. car의 생성자 생성하고 cc를 집어넣음
this.cc = cc;
}
public void oilling() {
System.out.println("주유중 입니다.");
}
public void move() {
System.out.println("부릉부릉");
}
//오버라이딩: 메서드의 이름이 같고, 매개변수가 같고, 반환형이 같은 경우에 상속받은 메서드를 덮어쓴다'
@Override //★★★★★toString을 오버라이드 하는 이유??
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("Name : " + this.getClass().getSimpleName());
//getClass에서getSimpleName을 가져온다,
//getSimpleName으로 찍으면 class이름이 찍힌다 라는 특별한 메소드(자바 리플렉션? 나중에 )
sb.append(", cc : " + cc);
return sb.toString();
}
}
■ 자손클래스
-부모클래스를 상속받기 위해 class명에 extends 키워드 넣음.
- 상속키워드 입력하면 자손클래스명에 에러가 발생함 why? 부모클래스에 생성자가 없기 때문
- => 따라서, 상속 후에 생성자를 선언해줘야한다.
-super() : 부모 클래스의 생성자를 호출하는 메서드.
상속받은 자식 클래스가 부모 클래스의 멤버를 사용할 경우가 있을 수도 있으므로
부모 클래스를 우선적으로 초기화해주는역할
모든클래스의 생성자의 첫줄에 들어가야 함(object제외)
//<Avante>
package com.kh.ex02.poly_example;
public class Avante extends Car {
//부모클래스Car을 상속받는다,
//아반테에 빨간줄 뜬다 why? 부모클래스에 생성자가 없어서 빨간줄뜬다!
//--> 여기에서 인자있는 생성자로 선언해 줘야 한다.
//인자있는 생성자
public Avante() {
super(1600); // 아반떼는 1600cc 이다.
}
//super()는 ?
//부모 클래스의 생성자를 호출하는 메서드.
//상속받은 자식 클래스가 부모 클래스의 멤버를 사용할 경우가 있을 수도 있으므로 부모 클래스를 우선적으로 초기화해주는역할
//모든클래스의 생성자의 첫줄에 들어가야 함(object제외)
//오버라이드 생성.
@Override
public void oilling() {
System.out.println("휘발유를 주유중입니다.");
}
//추가로 avanteNickName라는 메소드 하나 더 생성함.
public void avanteNickName() {
System.out.println("아방이");
}
}
//<BMWM5>
package com.kh.ex02.poly_example;
public class BMWM5 extends Car {
// 부모클래스Car을 상속받는다,
// BMWM5에 빨간줄 뜬다 why? 부모클래스에 생성자가 없어서 빨간줄뜬다!
// --> 여기에서 인자있는 생성자로 선언해 줘야 한다.
public BMWM5() {
super(4395); // cc가 커지면 배기량 올라감 = 힘, 토크, 마력
}
@Override // 생성
public void oilling() {
System.out.println("고급 휘발유를 주유중입니다.");
System.out.println("기름을 땅바닥에 뿌립니다.");
}
@Override // 생성
public void move() {
System.out.println("부와와와와와왕아아아앙앙(시끄럽게)");
}
//새로운 doc3sa라는 메서드 생성
void doc3sa() { // 독삼사 = BMW, 벤츠, 아우디
System.out.println("나는 독일에서 온 자동차야.");
}
}
//<Grandure>
package com.kh.ex02.poly_example;
public class Grandure extends Car {
// 부모클래스Car을 상속받는다,
// 그랜저에 빨간줄 뜬다 why? 부모클래스에 생성자가 없어서 빨간줄뜬다!
// --> 여기에서 인자있는 생성자로 선언해 줘야 한다.
public Grandure() {
super(3000); // 3000cc
}
@Override//생성
public void oilling() {
System.out.println("휘발유를 주유중입니다.");
}
@Override//생성
public void move() {
System.out.println("(조용한)부르르르르릉");
}
//추가로 grandureNickName라는 메소드 하나 더 생성함.
public void grandureNickName() {
System.out.println("각그랜저");
}
}
//<Sonata>
package com.kh.ex02.poly_example;
public class Sonata extends Car{
//부모클래스Car을 상속받는다.
//소나타에 빨간줄 뜬다 why? 부모클래스에 생성자가 없어서 빨간줄뜬다!
//--> 여기에서 인자있는 생성자로 선언해 줘야 한다.
//인자있는 생성자 생성
public Sonata() {
super(2000); // 2000 CC
}
@Override//생성
public void oilling() {
System.out.println("휘발유를 주유중입니다.");
}
@Override//생성
public void move() {
System.out.println("부르르르르릉");
}
//추가로 sonataNickName라는 메소드 하나 더 생성함.
public void sonataNickName() {
System.out.println("소나 타는 차"); // 실제 이름의 유례, 고 정주영 회장님의...
}
}
■ Run클래스
package com.kh.ex02.poly_example;
import java.util.Arrays;
//tip: 클래스 이름 생성할때 맨앞에 언더바 붙이면 패키지 내에 1번으로 뜸( 자주쓰는 방법은 아님)
public class _Run {
public static void main(String[] args) {// 메인메소드
Car[] carArray = new Car[5]; // carArray의 Car객체배열의 길이는 5이다
System.out.println(Arrays.toString(carArray));// [null, null, null, null, null]값 출력됨( 빈공간, 초기화이니까)
// 객체배열의 칸에다가 값을 넣음-> 클래스이름넣은것?
// 사용자한테 5개의 차종을(메소드) 입력받음
carArray[0] = new Car(1000); // 사제 자동차
carArray[1] = new Avante();
carArray[2] = new Sonata();
carArray[3] = new Grandure();
carArray[4] = new BMWM5();
for (int i = 0; i < carArray.length; i++) {
printCar(carArray[i]);// 위에서 받은 메소드를 printCar라는 메소드로 넘겨서 출력하는 법
}
}
// 위에서 만든 printCar메소드
private static void printCar(Car car) { // 인자가 다형성 속성을 사용중
System.out.println(car.toString());
car.move(); // 동적 바인딩 : 실행 전에 호출될 메소드를 정하지 않고,
// 실행 후 실시간(동적)으로 메소드를 호출하는 방법
// 즉 위에서 받은5개의 객체배열을 주석처리 한 후 돌렸을때 , car.move()는 5개중 누구의 값이 올지 예측이 불가능하다
car.oilling();
if (car instanceof Avante) {// 만약, 아반떼를 car인스턴스하면
((Avante) car).avanteNickName(); // 아반떼를 car에 캐스팅 하고 . 아반떼 닉네임 가져온다(class간 type casting하는 방법)
}
if (car instanceof Sonata) {
((Sonata) car).sonataNickName();
}
if (car instanceof Grandure) {
((Grandure) car).grandureNickName();
}
if (car instanceof BMWM5) {
((BMWM5) car).doc3sa();
}
System.out.println("--------------------------------------");
}//위에 닉네임이 넘 많고 다 개별로 지정해주고 해야되는데
//이걸 좀더 그룹화해서 간단하게 하기위해서?! ver2에서 해보자!
}
*ver2 에서 좀더 간단하게 하는 방법 설명!*