Java Day 13 다형성,추상클래스,인터페이스
17 Dec 2020 | JavaJava Day 13 다형성,추상클래스,인터페이스
-
다형성
- 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 하는 것
- 부모 클래스 타입의 참조변수로 자식 클래스의 인스턴스를 참조
- 이때 부모 클래스의 멤버와 메소드만 사용 할 수 있는데 자식클래스의 메소드가 오버라이딩 된 메소드라면 사용이 가능하다
class Animal{ public String scream(){ return "동물 울음소리"; } public String eat(){ return "먹이를 먹습니다"; } } class Dog extends Animal{ @Override public String scream(){ return "왈왈"; } public String bite(){ return "사람을 뭅니다"; } } public class Polymorphism{ public static void main(String[] args){ Animal dog = new Dog(); //타입 변환된 객체 생성 System.out.println(dog.scream()); //"왈왈" 출력 //System.out.println(dog.bite()); 컴파일에러, 오버라이딩된 메소드만 사용이 가능 System.out.println(dog.eat()); //"먹이를 먹습니다" 출력, 부모의 메소드는 사용 가능 } }
- 다형성으로 만들어진 인스턴스가 자식 클래스의 메소드를 사용하고 싶으면 어떡할까?
- 이때 메소드는 오버라이딩된 메소드가 아니라 자식만 가지고 있는 메소드이다
- 다운 캐스팅은 다시 원래의 타입으로 형 변환하는 것을 말한다
- 위의 코드에서 bite 메소드를 사용하기 위해선 Dog d = (Dog) dog 처럼 다운 캐스팅을 활용하여 형 변환을 해야한다. 이때 자식 클래스의 타입을 (Dog) 처럼 명시적으로 넣어야한다
-
추상 클래스
- 추상화 작업이란 대상을 보고 공통적인 부분을 추려내어 추상적인 개념을 만드는 것이다
- 추상 메소드를 하나라도 가지고 있는 클래스는 추상 클래스가 된다
- 추상 메소드는 수행문이 없는 즉, body가 없는 메소드로 abstract 예약어로 명시한다
- ex) abstract void example(); –> 중괄호가 없고 바로 세미콜론으로 끝난다
- 추상 클래스는 객체를 생성 할 수 없다. 이때, 다형성을 이용해서 사용하며 메소드는 무조건 오버라이딩 해야한다.
abstract class Diagram{ //추상 클래스 abstract void draw(); //추상 메소드 } class Triangle extends Diagram{ @Override //메소드 재정의 void draw(){ System.out.println("삼각형을 그린다"); } } class Circle extends Diagram{ @Override //메소드 재정의 void draw(){ System.out.println("원을 그린다"); } } public class UseDraw{ public static void main(String[] args){ Diagram[] ref = new Diagram[2]; ref[0] = new Triangle(); ref[1] = new Circle(); for(int i=0; i<ref.length; i++) ref[i].draw(); //삼각형을 그린다, 원을 그린다 출력 } }
-
인터페이스
- 인터페이스는 말그대로 객체의 사용 방법을 정의한 타입이다
- 물리적 구조는 class와 같지만 class 대신 interface로 선언한다
- 일반적으로 상수와 추상메소드만 갖는다 (자바8부터 디폴트,정적 메소드도 가질 수 있음)
- 일반 클래스에서 implements 예약어로 인터페이스를 사용한다
- 인터페이스 간에는 다중 상속이 허용된다
- 인터페이스를 구현한 일반 클래스에서 추상메소드를 모두 오버라이딩 해야한다
public interface HumanDo { //편의상 한 화면에 나타내었지만 interface는 별개의 파일에 존재 //상수 static final int MAX_HOURS = 10; static final int MIN_HOURS = 1; //추상 메소드 abstract는 자동으로 써준다 void studying(); void playing(); } class Student implements HumanDo{ @Override //추상메소드 재정의 public void studying() { System.out.println(HumanDo.MAX_HOURS+" 시간 공부!"); } @Override //추상메소드 재정의 public void playing() { System.out.println(HumanDo.MIN_HOURS+" 시간 휴식.."); } } public class StudentTest { public static void main(String[] args){ Student student = new Student(); student.studying(); //10시간 공부! 출력 student.playing(); //1시간 휴식.. 출력 } }
참고 자료
KG아이티뱅크 자바 강의자료