Archive

Java Day 13 다형성,추상클래스,인터페이스

|

Java Day 13 다형성,추상클래스,인터페이스


  1. 다형성

    • 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 하는 것
    • 부모 클래스 타입의 참조변수로 자식 클래스의 인스턴스를 참조
    • 이때 부모 클래스의 멤버와 메소드만 사용 할 수 있는데 자식클래스의 메소드가 오버라이딩 된 메소드라면 사용이 가능하다
    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) 처럼 명시적으로 넣어야한다
  2. 추상 클래스

    • 추상화 작업이란 대상을 보고 공통적인 부분을 추려내어 추상적인 개념을 만드는 것이다
    • 추상 메소드를 하나라도 가지고 있는 클래스는 추상 클래스가 된다
    • 추상 메소드는 수행문이 없는 즉, 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();		//삼각형을 그린다, 원을 그린다 출력
        }
    }
    


  3. 인터페이스

    • 인터페이스는 말그대로 객체의 사용 방법을 정의한 타입이다
    • 물리적 구조는 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시간 휴식.. 출력
        }
    }
    




참고 자료


이것이자바다

자바프로그래밍100% 실전가이드

KG아이티뱅크 자바 강의자료