일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- html
- 데이터베이스
- springframework
- String
- 파일 입출력
- array
- jQuery
- css
- Event
- kotlin #return #jump
- 상속
- spring
- File 클래스
- GUI
- javaservlet
- 다형성
- property
- 설치
- jsp
- 연락처 프로그램
- Method
- list
- 연산자
- 오라클
- Java
- 자바
- 윈도우 #단축키
- function
- 코틀린#클래스#상속
- JavaScript
- Today
- Total
Binary World
JAVA CLASS : 상속(다형성) 본문
<다형성>
- 인스턴스를 여러가지 타입으로 부를 수 있는것
- 생성된 인스턴스를 가리키는(참조하는) 참조 변수를 선언할 때,
- 생성된 인스턴스의 클래스 타입으로 변수를 선언할 수도 있고
- 그 부모타입으로 변수를 선언할 수도 있는 것
<다형성의 장점>
1. 배열을 사용할 때 부모 타입으로만 선언해도, 그 배열에는 부모/자식 타입 모두 저장 가능
2. 메소드를 정의할 때, 메소드의 매개변수나 리턴 타입으로 부모 클래스 타입만 사용해도 부모/자식 타입 모두 매개변수나 리턴값으로 사용할 수 있다.
<프로그램 코드>
1. 다형성을 이용해서 배열을 생성하고 출력
* Car.java(자동차 클래스, 부모 클래스)
package edu.java.inherit06; public class Car { // 멤버 변수 private int fuel; // 연료
// 생성자 public Car() {} public Car(int fuel){ this.fuel = fuel; }
// 메소드 public int getFuel(){ return fuel; }
public void setFuel(int fuel){ this.fuel = fuel; }
public void display() { System.out.println("자동차 연료: " + fuel); } } // end class Car |
* HybridCar.java (하이브리드 클래스, 자식 클래스)
package edu.java.inherit06; public class HybridCar extends Car{ private int battery;
// 생성자 public HybridCar() {}
public HybridCar(int fuel, int battery) { super(fuel); this.battery = battery; }
public int getBattery() { return battery; }
public void setBattery(int battery){ this.battery = battery; }
@Override public void display() { System.out.println("하이브리드 자동차 연료: " + getFuel()); System.out.println("하이브리드 자동차 배터리: " + battery); } } // end class HybridCar |
* CarUtil.java (drive 메소드 선언)
package edu.java.inherit06; public class CarUtil { public static void drive(Car car) { System.out.println("현재 연료: " + car.getFuel());
System.out.println("부릉부릉~"); } } |
* InheritMain06.java (메인 클래스)
package edu.java.inherit06; public class InheritMain06 { public static void main(String[] args) { // Car 클래스의 인스턴스 생성 Car car1 = new Car(); // HybridCar 클래스의 인스턴스 생성 HybridCar car2 = new HybridCar(); // 다형성(polymorphism) Car car3 = new HybridCar(); // hybridCar car4 = new Car(); // 불가능함 // Child 변수이름 = new Child(); // 가능 // Parent 변수이름 = new Child(); // 가능 // Child 변수이름 = new Parent(); // 불가능
// Car 타입 배열선언 Car[] cars = new Car[3]; cars[0] = car1; cars[1] = car2; cars[2] = car3;
for(Car x : cars) { x.display(); System.out.println("---------------"); } // end for(x)
System.out.println(); for(Car x : cars){ CarUtil.drive(x); System.out.println("---------------"); }
} // end main() } // end class InheritMain06 |
2. 클래스 강제 형변환
* InheritMain07 (부모 클래스와 자식 클래스를 포함하는 메인 클래스)
package edu.java.inherit07; class ParentClass { private int x; public ParentClass(int x) { this.x = x; } public int getX() { return x; } } // end ParentClass class ChildClass extends ParentClass { private int y; public ChildClass(int x, int y) { super(x); // 부모클래스의 생성자를 명시적으로 부름 this.y = y; } public int getY() { return y; } } // end ChildClass public class InheritMain07 { public static void main(String[] args) { // 다형성 사용과 instanceof 연산자 ParentClass test1 = new ParentClass(100); ParentClass test2 = new ChildClass(100, 200); System.out.println(test2.getX()); // test2는 ParentClass 타입으로 선언했기 때문에 // ChildClass에서 정의한 getY() 메소드를 사용할 수 없음. // 강제 형변환(casting)을 하면, ChildClass가 가지고 있는 메소드 사용 가능 System.out.println(((ChildClass) test2).getY()); System.out.println();
// 참조변수 instanceof 클래스이름: // 클래스 타입의 인스턴스이면 true, 아니면 false를 리턴 // 강제 형변환 했을 때 클래스를 확인하기 위해 사용 if (test2 instanceof ChildClass) { System.out.println("x = " + test2.getX()); System.out.println("y = " + ((ChildClass) test2).getY()); } else { System.out.println("x = " + test2.getX()); } System.out.println(); if (test1 instanceof ChildClass) { System.out.println("x = " + test1.getX()); System.out.println("y = " + ((ChildClass) test1).getY()); } else { System.out.println("x = " + test1.getX()); }
// instanceof 를 사용할 때에는 일반적인(부모클래스 등)을 가장 마지막(else)에 사용해서 전체를 검색할 수 있도록 // 한다 System.out.println(); if (test2 instanceof ParentClass){ System.out.println(1); } else if (test2 instanceof ChildClass){ System.out.println(2); } else { System.out.println(3); } } // end |
'개발자의 길 > JAVA' 카테고리의 다른 글
JAVA CLASS : 인터페이스(Interface) (0) | 2017.01.04 |
---|---|
JAVA CLASS : 상속(final, abstract) (0) | 2017.01.03 |
JAVA CLASS : 상속(Inheritance) (0) | 2017.01.02 |
JAVA CLASS : 자바 연락처(contact) 프로그램 ver 0.1 (0) | 2016.12.30 |
JAVA CLASS : 접근 제한자(final 변수, static 변수) (0) | 2016.12.30 |