: 하나의 메소드나 클래스가 다양한 방법으로 동작하는 것
ex. 키보드 키 : 누르는 조작방법은 일치하지만 esc, enter 의 동작방법은 다름
메소드와 다형성
- 오버로딩 예시
class O{
public void a(int param) {
System.out.println("숫자출력");
System.out.println(param);
}
public void a(String param) {
System.out.println("문자출력");
System.out.println(param);
}
}
public class PolymorphismOverloading {
public static void main(String[] args) {
O o = new O();
o.a(1);
o.a("one");
}
클래스와 다형성
class A{}
class B extends A{}
public class PolymorphismDemo1 {
public static void main(String[] args) {
A obj = new B(); //클래스 B를 인스턴스화, 그 인스턴스를 obj 변수(클래스 A가 데이터타입)에 담음
}
}
class A{
public String x() {return "x";}
}
class B extends A{
public String y() {return "y";}
}
public class PolymorphismDemo1 {
public static void main(String[] args) {
A obj = new B();
obj.x(); obj.y(); //클래스 A에 y 정의 없음 => obj는 B를 담았지만 A의 행세를 하고 있기 때문에 오류
}
}
=> 인스턴스를 담는 변수의 데이터타입은 상위/하위 클래스 모두 가능
class A{
public String x() {return "A.x";}
}
class B extends A{
public String x() {return "B.x";} //오버라이딩
public String y() {return "y";}
}
public class PolymorphismDemo1 {
public static void main(String[] args) {
A obj = new B();
System.out.println(obj.x());
}
//
B.x
=> 상위클래스 A에 정의되지 않은 y는 출력 불가 / x 호출시 A가 아닌 오버라이딩한 하위클래스 B의 x는 출력됨
class A{
public String x() {return "A.x";}
}
class B extends A{
public String x() {return "B.x";}
public String y() {return "y";}
}
class B2 extends A {
public String x() {return "B2.x";}
}
public class PolymorphismDemo1 {
public static void main(String[] args) {
A obj = new B();
A obj2 = new B2();
System.out.println(obj.x());
System.out.println(obj2.x());
}
}
//
B.x
B2.x
=> obj, obj2에 실제로 담겨있는 클래스는 B지만 A가 부모클래스 행세를 하고 있기 때문에 부모클래스에서 정의한 메소드에 한해서만 호출 가능
=> obj, obj2 가 동일한 데이터타입 A를 가지면서 각 클래스(B, B2)의 메소드대로 동작(B.x, B2.x)
실전 예제
abstract class Calculator{
int left, right;
public void setOprands(int left, int right){
this.left = left;
this.right = right;
}
int _sum() {
return this.left + this.right;
}
public abstract void sum();
public abstract void avg();
public void run(){
sum();
avg();
}
}
class CalculatorDecoPlus extends Calculator {
public void sum(){
System.out.println("+ sum :"+_sum());
}
public void avg(){
System.out.println("+ avg :"+(this.left+this.right)/2);
}
}
class CalculatorDecoMinus extends Calculator {
public void sum(){
System.out.println("- sum :"+_sum());
}
public void avg(){
System.out.println("- avg :"+(this.left+this.right)/2);
}
}
public class Cal {
public static void execute (Calculator cal) {
System.out.println("실행결과");
cal.run();
}
public static void main(String[] args) {
Calculator c1 = new CalculatorDecoPlus();
c1.setOprands(10, 20);
c1.run();
Calculator c2 = new CalculatorDecoMinus();
c2.setOprands(10, 20);
c2.run();
execute(c1);
execute(c2);
}
}
//
+ sum :30
+ avg :15
- sum :30
- avg :15
실행결과
+ sum :30
+ avg :15
실행결과
- sum :30
- avg :15
=> c1, c2 같은 데이터 타입 가졌지만 동작방법은 다름
인터페이스와 다형성
interface I{}
class C implements I{}
public class PolymorphismDemo2 {
public static void main(String[] args) {
I obj = new C();
}
}
=> 클래스 C가 인스턴스화 됐을 때 obj 변수에 담기며 이 변수의 데이터타입은 I
interface I2{
public String A();
}
interface I3{
public String B();
}
class D implements I2, I3{
public String A() {
return "A"; }
public String B() {
return "B";
}
}
public class PolymorphismDemo3 {
public static void main(String[] args) {
D obj = new D();
I2 objI2 = new D();
I3 objI3 = new D();
obj.A();
obj.B();
objI2.A(); objI2.B(); objI3.A();
objI3.B();
}
}
=>obj : 데이터타입인 클래스 D에서 A, B 모두 정의하고 있어 오류 X
=> 클래스의 특정 기능만 사용하고 싶다면 데이터타입으로 해당 인터페이스 지정해 일부 기능만 사용 가능
- 필요한 인터페이스만 사용하여 효율적 기능 수행
'Programming > 자바' 카테고리의 다른 글
생활코딩 자바 - Object 클래스 (0) | 2022.04.18 |
---|---|
생활코딩 자바 - 예외 (0) | 2022.04.12 |
생활코딩 자바 - 인터페이스 (0) | 2022.04.08 |
생활코딩 자바 - final (0) | 2022.04.08 |
생활코딩 자바 - abstract (0) | 2022.04.08 |