다형성
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. 장점
- 내부 클래스에서 외부 클래스의 맴버에 손쉽게 접근할 수 있다.
- 서로 관련 있는 클래스를 논리적으로 묶어서 표현함으로써, 코드의 캡슐화를 증가시킨다.
- 외부에서는 내부 클래스에 접근할 수 없으므로, 코드의 복잡성을 줄일 수 있다.
3. 내부 클래스의 종류
- 정적 클래스
- 외부 클래스 영역에 선언된 클래스 중 static 키워드를 가지는 클래스는 정적 클래스라고 한다.
- 인스턴스 클래스
- static 선언이 안된 클래스
- 외부 클래스의 인스턴스 변수나 인스턴스 메서드에 사용될 목적으로 선언
- 지역 클래스
- 외부 클래스의 메서드나 초기화 블록에 선언된 클래스를 의미
- 익명 클래스
4. 익명 클래스
- 다른 내부 클래스와 달리 이름을 가지지 않는 클래스를 의미
- 클래스 선언과 동시에 객체를 생성 단 하나의 객체만을 생성하는 일회용 클래스
- 따라서 생성자를 선언할 수도 없으며, 오로지 단 하나의 클래스나 단 하나의 인터페이스를 상속받거나 구현할 수 있을 뿐이다.
- 이러한 익명 클래스는 매우 제한적인 용도에 사용되며, 구현해야하는 메서드가 매우 적은 클래스를 구현할 때 사용.
// 익명 클래스는 선언과 동시에 생성하여 참조변수에 대입함.
클래스이름 참조변수이름 = new 클래스이름(){
// 메소드의 선언
};