Beny's Study

13_2. [강의] 다형성1 예제 본문

[JAVA]/09. 다형성

13_2. [강의] 다형성1 예제

76beny 2022. 5. 29. 00:28
 

 

supper class _ Car

package com.kh.ex02.poly_example;

public class Car {
	//속성부(필드)
	protected int cc = 0; //cc는  배기량

	//생성자(인자있는 생성자)
	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();
	}
}

Override

오버라이드: 메서드의 이름이 같고, 매개변수가 같고, 반환형이 같은 경우에 상속받은 메서드를 덮어쓴다'

 

StringBuffer

문자열을 추가하거나 변경할때 사용하는 자료형

 

this.getClass().getSimpleName());

getClass에서getSimpleName을 가져온다, 

getSimpleName으로 찍으면 class이름이 찍힌다 라는 특별한 메소드

 

childclass _ 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("소나 타는 차"); // 실제 이름의 유례, 고 정주영 회장님의...
	}

}

 

childclass _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("각그랜저");
	}
}

 

childclass _Avante

package com.kh.ex02.poly_example;

public class Avante extends Car {
	//부모클래스Car을 상속받는다, 
	//아반테에 빨간줄 뜬다 why? 부모클래스에 생성자가 없어서 빨간줄뜬다! 
	//--> 여기에서 인자있는 생성자로 선언해 줘야 한다.

	//인자있는 생성자
	public Avante() {
		super(1600); // 아반떼는 1600cc 이다.
	}

	//오버라이드 생성.
	@Override
	public void oilling() {
		System.out.println("휘발유를 주유중입니다.");
	}
	
	//추가로 avanteNickName라는  메소드 하나 더 생성함.
	public void avanteNickName() {
		System.out.println("아방이");
	}

}

 

 

childclass _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("나는 독일에서 온 자동차야.");
	}
}

 

 

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("--------------------------------------");
	}//위에 닉네임이 넘 많고 다 개별로 지정해주고 해야되는데 이걸 좀더 그룹화해서 간단하게 하기위해서?! ex03으로
}

 

 


"본 인터넷 사이트 내의 모든 이미지, 문구, 콘텐츠, 내용 등에 대한 저작권은 76beny에게 있습니다.

이를 무단으로 도용, 복사, 전재, 재배포, 2차 변형 등을 할 경우

민, 형사상 법적 조치 등 저작권법에 의거하여 처벌 받을 수 있습니다."