Polymorphism
하나의 객체가 여러 가지 형태를 가질 수 있는 성질
자바에서의 다형성
class Subject { public void info() { System.out.println("이번 시간은"); } } class Music extends Subject { public void info() { System.out.println("음악입니다"); } } class Art extends Subject { public void info() { System.out.println("미술입니다"); } } public class Test { public static void main(String[] args) { Subject subject = new Subject(); // 객체 타입과 참조변수 타입의 일치 Music music = new Music(); // 객체 타입과 참소변수 타입 일치 Subject art = new Art(); // 객체 타입과 참조변수 타입의 불일치 subject.info(); // 이번 시간은 music.info(); // 음악입니다 art.info(); // 미술입니다 } }
art의 참조변수 타입을 Subject(상위 클래스)로 지정.
art 참조변수가 사용할 수 있는 멤버의 수는 상위클래스의 멤버의 수가 됨.
// Art sub1 = new Subject(); 객체 타입과 참조변수 타입의 불일치
하위 클래스 타입으로 상위 클래스 객체 참조 불가
참조변수 instanceof 타입
public class InstanceOfExample { public static void main(String[] args) { Book book = new Book(); System.out.println(book instanceof Object); //true System.out.println(book instanceof Book); //true System.out.println(book instanceof Novel); //false System.out.println(book instanceof Essay); //false Book novel = new Novel(); // 객체타입 Novel, 참조타입 Book System.out.println(novel instanceof Object); //true System.out.println(novel instanceof Book); //true System.out.println(novel instanceof Novel); //true System.out.println(novel instanceof Essay); //false } } class Book {}; class Novel extends Book{}; class Essay extends Book{};
Abstraction
기존 클래스들의 공통적인 요소들을 추출하여 상위클래스를 만드는 것
상속계층도의 상층부의 위치할 수록 추상화의 정도가 높고, 내려갈수록 구체화.
abstract class AbExample { // 추상 메서드가 최소 하나 이상 포함돼있는 추상 클래스 abstract void start(); // 메서드 바디가 없는 추상메서드 }
abstract
키워드를 붙여서 표시.abstract
키워드를 붙여서 표시.AbExample ab = new AbExample(); // 추상 클래스로 객체 생성 불가능
추상 클래스보다 높은 추상성을 가지는 '밑그림'
기본적으로 추상 메서드와 상수만을 멤버로 가질 수 있다.
인터페이스의 기본 구조
class
대신 interface
키워드를 사용함.public static final
로 선언함.static
과 default
메서드 이외의 모든 메서드는 public abstract
.public interface InterfaceEx { public static final int breakfast = 8; // 인터페이스 인스턴스 변수 정의 final int lunch = 12; // public static 생략 static int dinner = 19; // public & final 생략 void eat(); //public abstract 생략 }
인터페이스의 구현
implements
키워드를 사용함.class 클래스명 implements 인터페이스명 { ... // 인터페이스에 정의된 모든 추상메서드 구현 }
인터페이스의 다중 구현
class Exclass implements Inter1, Inter2, Inter3 { ...... } // 다중 구현 문법
interface Book { // 인터페이스 선언. public abstract 생략 가능. public abstract void read(); } interface BookStore { void buy(); } class Novel implements Book, BookStore { // 인터페이스 다중 구현 public void read(){ // 메서드 오버라이딩 System.out.println("소설 읽기"); } public void buy(){ // 메서드 오버라이딩 System.out.println("소설 구입하기"); } } class Cartoon implements Book, BookStore { // 인터페이스 다중 구현 public void read(){ System.out.println("만화 읽기"); } public void buy(){ System.out.println("만화 구입하기"); } } public class MultiInheritance { public static void main(String[] args) { Novel novel = new Novel(); Cartoon cartoon = new Cartoon(); novel.read(); // 소설 읽기 novel.buy(); // 소설 구입하기 cartoon.read(); // 만화 읽기 cartoon.buy(); // 만화 구입하기 } }
abstract class Book { // 추상 클래스 public abstract void read(); } interface Bookstore { // 인터페이스 public abstract void buy(); } class Novel extends Book implements Bookstore { // Book클래스 상속 & Bookstore 인터페이스 구현 public void read(){ System.out.println("소설을 읽음"); } public void buy(){ System.out.println("소설을 구입함"); } } class Essay extends Book implements Bookstore { // Book클래스 상속 & Bookstore 인터페이스 구현 public void read(){ System.out.println("에세이를 읽음"); } public void buy(){ System.out.println("에세이를 구입함"); } } public class MultiInheritance { public static void main(String[] args) { Novel nov = new Novel(); Essay ess = new Essay(); nov.read(); // 소설을 읽음 nov.buy(); // 소설을 구입함 ess.read(); // 에세이를 읽음 ess.buy(); // 에세이를 구입함 } }
인터페이스의 장점