쌍용교육(JAVA)/JAVA
쌍용교육 -JAVA 수업 10일차 Polymorphism다형성
구 승
2024. 4. 11. 17:24
package kr.s18.object.poly;
//부모클래스
class Parent{
int a = 100;
}
//자식클래스
class Child extends Parent{
int b = 200;
}
public class PolyMain01 {
public static void main(String[] args) {
Child ch =new Child();
System.out.println(ch.a);
System.out.println(ch.b);
Parent p = ch; //자식클래스 타입에서 부모클래스(Parent)로 바꿈,
//업캐스팅, 자동적으로 형변환됨
System.out.println(p.a);
//호출범위를 벗어나서 호출 불가.
//System.out.println(p.b);//b는 호출이안됨.
//Child ch2 = p; //에러남.
Child ch2 = (Child)p; //부모클래스타입 -> 자식클래스 타입으로 형변환
//다운캐스팅,명시적으로 형변환
System.out.println(ch2.a);
System.out.println(ch2.b);
}
}
100
200
100
100
200
package kr.s18.object.poly;
//부모클래스
class A {
public void make() {
System.out.println("make 메서드");
}
}
class B extends A {
public void play(){
System.out.println("play 메서드");
}
}
public class PolyMain02 {
public static void main(String[] args) {
B Bp = new B();
Bp.make();
Bp.play();
A ap = Bp; //자식 클래스 타입에서 부모 클래스 타입으로 형변환(업 캐스팅)
ap.make();
//호출 범위를 벗어나서 호출 불가능
//ap.play()
B bp2 = (B)ap;//부모클래스 타입 -> 자식 클래스 타입
//다운캐스팅, 명시적으로 형변환
Bp.make();
Bp.play();
}
}
make 메서드
play 메서드
make 메서드
make 메서드
play 메서드
package kr.s18.object.poly;
//부모클래스
class Parent2{
public void make() {
System.out.println("부모클래스의 make");
}
}
//자식클래스
class Child2 extends Parent2 {
@Override
public void make() {
System.out.println("자식클래스의 make");
}
}
public class PolyMain03 {
/*
* 다형성(Polymorphism)
* 객체지향개념에서 다형성이란 '여러 가지 형태를 가질 수 있는 능력'을 의미하며,
* 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써
* 다형성을 프로그램적으로 구현.
* 부모클래스타입의 참조변수로 자식클래스의 인스턴스를 참조할 수 있도록 하였음.
*/
public static void main(String[] args) {
Child2 ch = new Child2();
ch.make();
Parent2 p = ch; //자식 클래스 타입 -> 부모클래스타입 형변환
//업캐스팅, 자동적으로 형변환
//재정의된 메서드가 호출됨. 오버라이딩이라서 이름이 같은 것이라 자식 클래스로 나옴. 만약 오버라이딩이 아니면(이름이 다르면) 오류남
p.make();
}
}
자식클래스의 make
자식클래스의 make
package kr.s18.object.poly;
//부모클래스
class Product{
int price; //제품 가격
int bonusPoint; //제품 구매시 제공하는 보너스 점수
//생성자
public Product(int price) {
this.price = price;
bonusPoint = price/10;
}
public String getName() {
return "상품";
}
}
class Tv extends Product{
//생성자
public Tv() {
super(100);
}
@Override
public String getName() {
return "TV";
}
}
class Computer extends Product{
//생성자
public Computer() {
super(200);
}
@Override
public String getName() {
return "컴퓨터";
}
}
class Audio extends Product {
public Audio() {
super(300);
}
@Override
public String getName() {
return "오디오";
}
}
//구매자
class Buyer {
private int money =1000; //구매자 보유금액
private int bonusPoint = 0;//제품구매시 누적 보너스 점수
//구매 하기
public void buy(Product p) {
if(money < p.price) {
System.out.println("잔액이 부족하여 물건을 구매할 수 없습니다.");
return;
}
money -= p.price;
bonusPoint += p.bonusPoint;
System.out.println(p.getName()+"을/를 구입했습니다.");
System.out.println("현재 남은 돈은"+ money +"만원입니다.");
System.out.println("현재 보너스 점수는" + bonusPoint +"점입니다.");
}
}
public class PolyMain04 {
public static void main(String[] args) {
//구매자 생성
Buyer b = new Buyer();
//제품생성
Tv tv = new Tv();
Computer com = new Computer();
Audio au = new Audio();
//제품 구매
b.buy(tv); //Tv ->Product 업캐스팅 자동적으로 형변환
b.buy(com); //Computer ->Product 업캐스팅 자동적으로 형변환
b.buy(au);
}
}
TV을/를 구입했습니다.
현재 남은 돈은900만원입니다.
현재 보너스 점수는10점입니다.
컴퓨터을/를 구입했습니다.
현재 남은 돈은700만원입니다.
현재 보너스 점수는30점입니다.
오디오을/를 구입했습니다.
현재 남은 돈은400만원입니다.
현재 보너스 점수는60점입니다.
package kr.s18.object.poly;
//부모클래스
class Parent3 {
//object의 toString을 재정의
@Override
public String toString() {
return "Parent 클래스";
}
}
//자식클래스
class Child3 extends Parent3{
@Override
public String toString() {
return "Child3 클래스";
}
}
public class PolyMain05 {
public static void main(String[] args) {
Parent3 p = new Parent3();
//컴파일시 오류는 없지만 실행시 오류가 발생. 자식클래스의 객체를 생성하지않는 실수를 함.
//Child3 ch = (Child3)p;
//instanceof 연산자는 상속관계일 때 사용(우리가 상속관계인걸 알고있는 상태에서만 사용해야됨. 상속관계인지 몰라서 알아내기 위해 사용하는 것은 아님)
//좌측에 지정한 객체가 우측에 지정한 타입을 사용할 수 있는지 검증하는 연산자. 사용 가능하면 true,불가능하면 false
//객체(p) 타입(Child3)
if(p instanceof Child3) {
Child3 ch2 = (Child3)p;
System.out.println(ch2);
System.out.println("-----------------------------");
}else {
System.out.println(p);
System.out.println("+++++++++++++++++++++++++++++");
}
}
}
Parent 클래스
+++++++++++++++++++++++++++++
package kr.s18.object.poly;
//부모 클래스
class Car{
String color;
int door;
public void drive() {
System.out.println("운전하다~~");
}
public void stop() {
System.out.println("정지하다");
}
}
class FireEngine extends Car{
public void water() {
System.out.println("물을 뿌리다~~");
}
}
public class PolyMain06 {
public static void main(String[] args) {
FireEngine fe = new FireEngine();
if (fe instanceof FireEngine) {
System.out.println("FireEngine 객체입니다");
}
if (fe instanceof Car) {
System.out.println("Car 객체입니다");
}
if (fe instanceof Object) {
System.out.println("Object 객체입니다.");
}
}
}
FireEngine 객체입니다
Car 객체입니다
Object 객체입니다.