본문 바로가기

Programming/자바

생활코딩 자바 - 다형성

: 하나의 메소드나 클래스가 다양한 방법으로 동작하는 것

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

 

=> 클래스의 특정 기능만 사용하고 싶다면 데이터타입으로 해당 인터페이스 지정일부 기능만 사용 가능

 

 

  • 필요한 인터페이스만 사용하여 효율적 기능 수행
interface father{}
interface mother{}
interface programmer{
public void coding();
}
interface believer{}
 
class Steve implements father, programmer, believer{
public void coding(){
System.out.println("fast");
}
}
class Rachel implements mother, programmer{
public void coding(){
System.out.println("elegance");
}
}
public class Workspace{
public static void main(String[] args){
programmer employee1 = new Steve();
programmer employee2 = new Rachel();
 
employee1.coding();
employee2.coding();
}
}

 

 

 

 

 

 

 

 

 

 

'Programming > 자바' 카테고리의 다른 글

생활코딩 자바 - Object 클래스  (0) 2022.04.18
생활코딩 자바 - 예외  (0) 2022.04.12
생활코딩 자바 - 인터페이스  (0) 2022.04.08
생활코딩 자바 - final  (0) 2022.04.08
생활코딩 자바 - abstract  (0) 2022.04.08