다형성

다람·2023년 2월 23일
0

JAVA

목록 보기
13/27
post-thumbnail

다형성

  • 하나의 객체나 메서드가 여러 가지 형태를 가질 수 있는 것을 의미
  • 오버라이딩, 오버로딩, 업캐스팅, 다운캐스팅, 인터페이스, 추상메서드, 추상클래스 등 다양한 방법이 있다.
  • 프로그래밍에서 다형성이란 하나의 부모 타입 참조변수가 여러 자식 타입의 인스턴스를 가질 수 있는 것을 말한다.

다형성의 특징

  1. 하나의 부모 타입이 여러 자식 타입을 가질 수 있다.
  2. 유연하고 변경에 용이하다.
  3. 확장성이 뛰어나다.

참조변수의 다형성

class Parent{
	...
  }
 class Child extends Parent{
 	...
  }
  
 Parent pa = new Parent();
 Child ch = new Child();
 Parent pc = new Child();
 Child cp = new Parent(); // 오류
  • 자식 클래스 타입의 참조 변수는 부모 클래스 타입의 인스턴스를 참조할 수 없다.

참조 변수의 타입 변환

  1. 서로 상속 관계에 있는 클래스 사이에만 타입 변환을 할 수 있다.
  2. 자식 클래스 타입에서 부모 클래스 타입으로의 타입 변환은 생략할 수 있다.
  3. 부모 클래스 타입에서 자식 클래스 타입으로의 타입 변환은 반드시 명시해야 한다.

참조 변수의 타입 변환
(변환할타입의클래스이름) 변환할참조변수

class Parent { ... }
class Child extends Parent { ... }
class Brother extends Parent { ... }

Parent pa01 = null;
Child ch = new Child();
Parent pa02 = new Parent();
Brother br = null;

pa01 = ch;    // pa01 = (Parent)ch; 와 같으며, 타입 변환을 생략할 수 있음.
br = (Brother)pa02; // 타입 변환을 생략할 수 없음.
br = (Brother)ch;   // 직접적인 상속 관계가 아니므로, 오류 발생.

instanceof 연산자

  • 참조변수가 참조하고 있는 인스턴스의 실제 타입을 확인할 수 있도록 해준다.
  • 참조변수 instanceof 클래스이름
public class Polymorphism{
	 public static void main(String[] args) {
     	Parent p = new Parent();
        System.out.println(p instanceof Object); // true
        System.out.println(p instanceof Parent); // true
        System.out.println(p instanceof Child);  // false
     }
}

추상클래스

  • 하나 이상의 추상 메서드를 포함하는 클래스

추상 메서드(abstract method)

  • 자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메서드
  • 추상 메서드를 선언하여 사용하는 목적 ?
    --> 추상 메서드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상 메서드를 구현하도록 하기 위함
abstract class 클래스이름{
	...
    abstract 반환타입 메서드이름();
    ...
}
  • 추상 클래스에 추상 메서드를 선언하면 이 클래스를 상속받는 모든 클래스에서는 이 추상 메서드를 반드시 재정의해야한다.
  • 추상 클래스는 먼저 상속을 통해 자식 클래스를 만들고 만든 자식 클래스에서 추상 클래스의 모든 추상 메서드를 오버라이딩하고 나서야 자식 클래스의 인스턴스를 생성할 수 있다.
abstract class Animal { abstract void cry(); }
class Cat extends Animal { void cry() { System.out.println("냐옹냐옹!"); } }
class Dog extends Animal { void cry() { System.out.println("멍멍!"); } }

public class Polymorphism02 {
    public static void main(String[] args) {
        // Animal a = new Animal(); 
        // 추상 클래스는 인스턴스를 생성할 수 없음.

        Cat c = new Cat();
        Dog d = new Dog();

        c.cry();
        d.cry();
    }
}

// 결과
냐옹냐옹!
멍멍!

인터페이스(interface)

  • 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스
접근제어자 interface 인터페이스이름 {
    ...
}

인터페이스 장점

  1. 대규모 프로젝트 개발 시 일관되고 정형화된 개발을 위한 표준화가 가능
  2. 클래스의 작성과 인터페이스의 구현을 동시에 진행할 수 있어 개발 시간을 단축할 수 있다.
  3. 클래스와 클래스 간의 관계를 인터페이스로 연결하면 클래스마다 독립적인 프로그래밍이 가능하다.

인터페이스 구현

class 클래스이름 implements 인터페이스이름{
	...
}
interface Animal { public abstract void cry(); }

class Cat implements Animal {
    public void cry() {
        System.out.println("냐옹냐옹!");
    }
}

class Dog implements Animal {
    public void cry() {
        System.out.println("멍멍!");
    }
}

public class Polymorphism03 {
    public static void main(String[] args) {
        Cat c = new Cat();
        Dog d = new Dog();
        
        c.cry();
        d.cry();
    }
}

// 결과
냐옹냐옹!
멍멍!

다형성 예시

  • 역할과 구현으로 구분
  • 역할은 인터페이스, 구현은 클래스
  • 역할은 택시, 구현은 볼보, bmw, 소나타
  • taxiDriver는 taxi의 차 종류에 상관없이 업무를 진행할 수 있다.
  • taxiDriver는 구현 대상의 내부 구조를 알 필요가 없으며 내부 구조가 변경되어도 영향을 받지 않는다.
  • taxiDriver는 구현 대상 자체를 변경해도 영향을 받지 않는다.

Taxi 인터페이스

TaxiDriver 클래스

volvo 클래스

bmw 클래스

sonata 클래스

work 클래스

profile
안녕

0개의 댓글