Polymorphism[Java]

SnowCat·2023년 6월 2일
0

Java - Language

목록 보기
9/17
post-thumbnail

다형성이란?

  • 다형성이란 하나의 객체가 여러가지 타입을 가질 수 있는 것을 의미함
  • 자바에서는 다형성을 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있게 함으로써 구현하고 있음
  • 이 때 참조 변수가 사용할 수 있는 멤버 개수는 실제 인스턴스 개수보다 같거나 적어야함
class Parent { ... }
class Child extends Parent { ... }
...

Parent pa = new Parent(); // OK
Child ch = new Child();   // OK
Parent pc = new Child();  // OK
Child cp = new Parent();  // Error
  • 참조 변수는 아래의 조건에 해당되는 경우 타입 변환이 가능함
    • 서로 상속 관계에 있는 클래스 사이일 것
    • 부모 클래스에서 자식 클래스로의 타입 변환일 경우 타입 변환을 명시할 것 (반대는 생략 가능)
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

  • 참조 변수가 특정 인스턴스를 참조하는지 확인해주는 연산자
  • 참조 변수가 대상 클래스를 참조하면 true를 반환하고, 아니거나 null을 반환하면 false를 반환함
class Parent { ... }
class Child extends Parent { ... }
class Brother extends Parent { ... }

public class Polymorphism01 {

    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
        System.out.println();

        Parent c = new Child();
        System.out.println(c instanceof Object); // true
        System.out.println(c instanceof Parent); // true
        System.out.println(c instanceof Child);  // true
    }
}

추상 메서드, 추상클래스

  • 자식 클래스에서 반드시 오버라이딩해서 사용해야하는 메서드를 추상 메서드라고 의미함
  • 모듈과 같이 중복되는 부분이나 공통적인 부분들만 미리 만들어두고, 사용하는 쪽에서는 자신에게 필요한 부분만 다시 작성하도록 하여 생산성을 향상시키는데 목적을 두고 있음
    굳이 구현이 필요없는 경우는 추상 메서드로 선언할 필요가 없음
  • 추상 메서드는 선언부만이 존재하며 구현부는 자식 클래스에서 오버라이딩해서 사용해야 함
  • 추상 메서드를 하나 이상 가지는 클래스를 추상 클래스라고 하며, 반드시 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(); // error
        Cat c = new Cat();
        Dog d = new Dog();

        c.cry(); //냐아아아아아아아아앙
        d.cry(); //머어어어어어어어어엉
    }
}

인터페이스

  • 자바에서는 다중상속이 불가능함
  • 다중 상속이 필요한 경우에는 인터페이스를 활용해야 함
  • 인터페이스에는 추상 메서드와 상수만을 선언할 수 있음
    추상 메서드는 전부 public abstract, 모든 필드는 public static final로 처리됨 (제어자는 생략 가능)
interface Animal { public abstract void cry(); }
interface Pet { public abstract void play(); }

class Cat implements Animal, Pet {
    public void cry() {
        System.out.println("냐아아아아아아아아앙");
    }

    public void play() {
        System.out.println("고양아 놀자~!");
    }
}

class Dog implements Animal, Pet {
    public void cry() {
        System.out.println("머어어어어어어어어엉");
    }

    public void play() {
        System.out.println("멍멍아 놀자~!");
    }
}

public class Polymorphism04 {
    public static void main(String[] args) {
        Cat c = new Cat();
        Dog d = new Dog();

        c.cry(); // 냐아아아아아아아아앙
        c.play(); // 고양아 놀자~!
        d.cry(); // 머어어어어어어어어엉
        d.play(); // 멍멍아 놀자~!
    }
}

내부 클래스

  • 클래스 내부에 추가로 클래스를 선언한 것을 내부 클래스라고 함
  • 내부 클래스를 사용하면 내부 클래스에서 외부 클래스 멤버에 손쉽게 접근 가능하며, 관련 있는 클래스를 묶어 캡슐화 가능하며, 코드의 복잡도를 줄일 수 있다는 장점이 있음
  • 클래스를 선언한 위치에 따라 정적 클래스, 인스턴스 클래스, 지역 클래스, 이름을 가지지 않는 익명 클래스로 구분할 수 있음

출처:
http://www.tcpschool.com/java/java_polymorphism_concept

profile
냐아아아아아아아아앙

0개의 댓글