다형성

Updated:

강의 사이트

http://tcpschool.com/

다형성의 개념

1. 다형성이란?

  • 다형성이란 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미
  • 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 하여 구현

2. 참조 변수의 다형성

  • 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있다.
  • 참조 변수가 사용할 수 있는 멤버의 개수가 실제 인스턴스의 멤버 개수보다 같거나 적어야 참조할 수 있다.
class Parent { ... }

class Child extends Parent { ... }

Parent pa = new Parent(); // 허용
Child ch = new Child();   // 허용
Parent pc = new Child();  // 허용
Child cp = new Parent();  // 오류 발생.
  • 특정 타입의 참조 변수로는 당연히 같은 타입의 인스턴스를 참조할 수 있다.
  • 참조 변수가 사용할 수 있는 맴버의 개수가 실제 인스턴스의 맴버 개수와 같기 때문이다.
  • 부모 클래스 타입의 참조 변수로도 자식 클래스 타입의 인스턴스를 참조할 수 있다.
  • 참조 변수가 사용할 수 있는 멤버의 개수가 실제 인스턴스의 멤버 개수보다 적기 때문이다.
  • 반대의 경우인 자식 클래스 타입의 참조 변수로는 부모 클래스 타입의 인스턴스를 참조할 수 없다.
  • 참조 변수가 사용할 수 있는 멤버의 개수가 실제 인스턴스의 멤버 개수보다 많기 때문이다.

추상 클래스

1. 추상 메서드

  • 추상 메서드란 자식 클래스에서 반드시 오버라이딩해야한 사용할 수 있는 메서드를 의미
  • 자바에서 추상 메소드를 선언하여 사용하는 목적은 추상 메소드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상 메소드를 구현하도록 하기 위함
  • 예를 들면 모듈처럼 중복되는 부분이나 공통적인 부분은 미리 다 만들어진 것을 사용하고, 이를 받아 사용하는 쪽에서는 자신에게 필요한 부분만을 재정의하여 사용함으로써 생산성이 향상되고 배포 등이 쉬워지기 때문이다.

2. 추상 클래스

  • 하나 이상의 추상 메서드를 포함하는 클래스 가리켜 추상 클래스라고 한다.
  • 추상 클래스는 다형성을 가지는 메서드의 집합을 정의할 수 있게 해준다.
  • 생성자, 필드, 일반 메서드도 포함 가능하다.

인터페이스

1. 인터페이스

  • 기본적으로 자바는 다중 상속을 지원하지 않음
  • 다중 상속을 지원하면 메서드 호출의 모호성이 발생할 수 있다.
  • 그러나 다중 상속을 기능을 위해 인터페이스라는 것을 통해 다중 상속을 지원
  • 인터페이스란 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이에 중간 매개 역할까지 중간 매개 역할까지 담당하는 일종의 추상 클래스를 의미
  • 추상클래스와 다르게 오로지 추상 메서드만 포함할 수 있다.

2. 인터페이스의 선언

  • 다른 클래스와 달리 모든 필드는 public static final이어야 한다.
  • 모든 메서드는 public abstract이어야 한다.
  • 생략될수 있다. 컴파일 시 컴파일러가 자동으로 추가해준다.

3. 인터페이스의 구현

  • 인터페이스는 인터페이스로부터만 상속을 받을 수 있으며, 여러 인터페이스를 상속받을 수 있다.

내부 클래스

1. 내부 클래스

  • 내부 클래스란 하나의 클래스 내부에 선언된 또 다른 클래스를 의미
  • 외부 클래스에 대해 두 개의 클래스가 서로 긴밀한 관계를 맺고 있을 때 선언 가능
class Outer {     // 외부 클래스

    ...

    class Inner { // 내부 클래스

        ...

    }

    ...

}

2. 장점

  1. 내부 클래스에서 외부 클래스의 맴버에 손쉽게 접근할 수 있다.
  2. 서로 관련 있는 클래스를 논리적으로 묶어서 표현함으로써, 코드의 캡슐화를 증가시킨다.
  3. 외부에서는 내부 클래스에 접근할 수 없으므로, 코드의 복잡성을 줄일 수 있다.

3. 내부 클래스의 종류

  1. 정적 클래스
    • 외부 클래스 영역에 선언된 클래스 중 static 키워드를 가지는 클래스는 정적 클래스라고 한다.
  2. 인스턴스 클래스
    • static 선언이 안된 클래스
    • 외부 클래스의 인스턴스 변수나 인스턴스 메서드에 사용될 목적으로 선언
  3. 지역 클래스
    • 외부 클래스의 메서드나 초기화 블록에 선언된 클래스를 의미
  4. 익명 클래스

4. 익명 클래스

  • 다른 내부 클래스와 달리 이름을 가지지 않는 클래스를 의미
  • 클래스 선언과 동시에 객체를 생성 단 하나의 객체만을 생성하는 일회용 클래스
  • 따라서 생성자를 선언할 수도 없으며, 오로지 단 하나의 클래스나 단 하나의 인터페이스를 상속받거나 구현할 수 있을 뿐이다.
  • 이러한 익명 클래스는 매우 제한적인 용도에 사용되며, 구현해야하는 메서드가 매우 적은 클래스를 구현할 때 사용.
// 익명 클래스는 선언과 동시에 생성하여 참조변수에 대입함.
클래스이름 참조변수이름 = new 클래스이름(){
    // 메소드의 선언
};

Tags:

Categories:

Updated: