백엔드/자바
추상클래스, 인터페이스와 다형성
ksge7
2020. 8. 7. 04:27
다형성이란?
일반 클래스의 상속 관계처럼 다형성이란 '다형성이란 여러 형태를 가질 수 있는 성질'을 말한다.
일반 클래스들의 상속 과정의 다형성의 포인트는 다음과 같았다.
◎ "상속 관계에서 부모 클래스가 자식 클래스들을 대표 한다"
부모 클래스를 자료 타입으로 하는 참조 변수가 자손 클래스의 인스턴스를 가질 수 있다는 것이다.
추상 클래스, 인터페이스와 다형성
일반 클래스 상속과 다형성의 관계와 같이 추상클래스, 인터페이스도 그와 동일한 구조를 갖는다.
즉 추상클래스, 인터페이스를 상속한 자손 클래스의 인스턴스의 주소값을 추상클래스, 인터페이스를 자료형으로 하는 참조 변수가 참조할 수 있다는 것이다.
interface Human{ // 인터페이스 'Human' 선언
String me(); // 반환값이 String인 추상 메서드 'me'선언.
}
////////////////////////////////////////////////////////////
class David implements Human{ //인터페이스 'Human'을 구현한 David 클래스
public String me() { // 추상 메서드 'me' 오버라이딩
return "나는 데이빗입니다.";
}
}
class Winson implements Human{ //인터페이스 'Human'을 구현한 Wilson 클래스
public String me() { // 추상 메서드 'me' 오버라이딩
return "나는 윌슨입니다.";
}
}
class Sarah implements Human{ //인터페이스 'Human'을 구현한 Sarah 클래스
public String me() { // 추상 메서드 'me' 오버라이딩
return "나는 사라입니다.";
}
}
/////////////////////////////////////////////////////////////
class Main {
public static void main(String[] args) {
Human David = new David();
// 부모격인 Human 인터페이스를 참조변수로 David 클래스 인스턴스를 저장
System.out.println(David.me());
Human Wilson = new Wilson();
// 부모격인 Human 인터페이스를 참조변수로 Wilson 클래스 인스턴스를 저장
System.out.println(Wilson.me());
Human Sarah = new Sarah();
// 부모격인 Human 인터페이스를 참조변수로 Sarah 클래스 인스턴스를 저장
System.out.println(Sarah.me());
}
}
코드를 보면서 이해하자.
- 'Human' 인터페이스를 선언하고 David, Wilson, Sarah 클래스가 이를 구현하고 있다.
- main 함수를 보면 'Human'을 자료형으로 하는 참조 변수가 생성된 인스턴스 객체 주소값을 저장하고 있다.
- 일반 클래스 간의 상속 관계처럼 이러한 방식을 이용해서 인터페이스를 다형성을 구현할 수 있다.
abstract class Human{ // abstract 추상 클래스 'Human' 선언
abstract String me(); // abstract 추상 메서드 'me' 선언
}
//////////////////////////////////////////////////
class David extends Human{ // 추상 클래스 'Human'을 상속받은 'David' 일반 클래스
public String me() {
return "나는 데이빗입니다.";
}
}
class Wilson extends Human{ // 추상 클래스 'Human'을 상속받은 'Wilson' 일반 클래스
public String me() {
return "나는 윌슨입니다.";
}
}
class Sarah extends Human{ // 추상 클래스 'Human'을 상속받은 'Sarah' 일반 클래스
public String me() {
return "나는 사라입니다.";
}
}
//////////////////////////////////////////////////////
class Main {
public static void main(String[] args) {
Human David = new David();
// 'Human'을 자료형으로 갖는 참조 변수에 'David' 클래스 객체 생성 주소값을 저장
System.out.println(David.me());
Human Wilson = new Wilson();
System.out.println(Wilson.me());
Human Sarah = new Sarah();
System.out.println(Sarah.me());
}
}
이는 추상 클래스도 똑같다.
- 'Human' 추상 메서드를 선언하고 David, Wilson, Sarah 클래스가 이를 상속하고 있다.
- main 함수를 보면 'Human'을 자료형으로 하는 참조 변수가 생성된 인스턴스 객체 주소값을 저장하고 있다.
- 일반 클래스 간의 상속 관계처럼 이러한 방식을 이용해서 추상클래스로 다형성을 구현할 수 있다.