ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • KOSA - 5일차 - 1 Java 기초 | 다형성, 인터페이스
    KOSA 2024. 4. 2. 19:54
    728x90

    1. 다형성(polymorphism)이란?

     - 상위 타입(클래스 혹은 인터페이스)의 참조 변수로 하위 타입의 모든 객체를 참조할 수 있는 것을 뜻한다.

     - 다형성은 객체 지향 프로그래밍에 핵심 요소 중 하나이기에 개념을 정확하게 알아두자.

     

    자바에서 다형성을 나타내는 것으로는, 오버라이딩오버로딩 그리고 상속받은 객체의 참조변수 형변환 등이 있다.

    2. 오버라이딩과 오버로딩

      1) 오버라이딩(overriding)

    • 같은 이름의 메소드를 매개변수의 타입이나 개수에 따라서 중복 정의함으로써, 매개변수에 따라 특정 메서드가 호출되도록 하는 것
    • 마치 형제 관계

      2) 오버로딩(overloading)

    • 부모클래스에 있는 메소드를 자식클래스에서 재정의하여 사용하는 것
    • 접근지정자의 경우 자식클래스의 메서드 범위가 부모클래스의 메서드 범위보다 넓거나 같아야 한다.
    • 마치 부모와 자식 관계

    예제

    1) Book 객체 정의(부모클래스)

    public class Book {
        int price = 1000;
        public void showPrice() {
            System.out.println("가격 : " + price);
        }
    }

    2) EnglishBook 객체 정의(자식 클래스)

    public class EnglishBook extends Book {
        public void showBook() { // overriding
            System.out.println("영어책 가격 : " + price);
        }
        public void showPrice(int count) { // overloading
            System.out.println("영어책 " + count + "권 가격 : " + price);
        }
    }

    3)객체 생성 및 실행

    public class BookMain {
        public static void main(String[] args) {
            EnglishBook eb = new EnglishBook();
            eb.showBook();
            eb.showPrice(5);
        }
    }

    이런 식으로 사용이 가능하다.

    3. 형변환(Casting) 및 사용예제

    상속받은 객체에 대해서 형변환이 의미하는 것은, 객체에 속한 멤버들에 대한 사용범위가 달라진다는 것을 의미한다.

    • 업캐스팅 : (자식클래스의 인스턴스에 대한) 자식클래스의 타입의 레퍼런스 변수를 부모클래스 타입으로 형변환 하는 것(생략가능하고, 자동 형변환 된다.)
    • 다운캐스팅 : (자식클래스의 인스턴스에 대한) 부모클래스 타입의 레퍼런스 변수를 자식클래스 타입으로 형변환 하는 것(생략 불가능하고, 형변환 타입을 명시해야 함)

    4. 인터페이스

     - 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스이다.

    1) 인터페이스 선언

    public interface 인터페이스명 {
        // 상수
        타입 상수명 = 값;
        
        // 추상 메소드
        타입 메소드명(매개변수, ...);
        
        // 디폴트 메소드
        default 타입 메소드명(매개변수, ...) {
            ...
        }
        
        // 정적 메소드
        static 타입 메소드명(매개변수, ...) {
            ...
        }
    }
    • 인터페이스는 상수메서드만을 구성 멤버로 가진다.
    • 인터페이스는 객체로 생성할 수 없기 때문에 생성자를 가질 수 없다.
    • 자바 8부터는 defalut 메서드와 static 메서드도 선언 가능.

    2) 인터페이스 구성요소

       1)) 상수 필드(constant Field)

    [public static final] 타입 상수명 = 값;
    • 인터페이스 런타임 시 데이터를 저장할 수 있는 필드(인스턴스, 정적필드)를 선언할 수 없다.
    • 상수를 선언할 때는 반드시 초기값을 대입해야 한다.
    • 인터페이스 상수 필드는 static {} 블록으로 초기화할 수 없기 때문에 반드시 선언과 동시에 초기값을 지정해야 한다.
    • public static final을 생략하더라도 자동적으로 컴파일 과정에서 붙게 된다.

       2)) 추상 메서드(abstract method)

    [public abstract] 리턴타입 메서드명(매개변수, ...);
    • 추상 메서드는 리턴타입, 메서드명, 매개변수만 기술되고 중괄호 {}를 붙이지 않는 메서드이다.
    • 구현 클래스에서 구현해야 하는 메서드이다.
    • public abstract 선언 생략하더라도 자동적으로 컴파일 과정에서 붙게 된다.

       3)) 디폴트 메서드(default method)

    [pulbic] default 리턴타입 메서드명(매개변수, ...) {
    	// ... (실행 내용)
    }
    • 자바 8에서 추가된 인터페이스의 새로운 멤버
    • dafault 키워드가 리턴 타입 앞에 붙는다.
    • default 메서드는 인스턴스 메서드이므로 구현 객체가 있어야 사용할 수 있다.
    • dafault 메서드는 인터페이스의 모든 구현 객체가 가지고 있는 기본 메서드
    • 구현 클래스 작성 시 dafault 메서드를 오버라이딩해서 해당 구현 클래스에 맞게 수정할 수 있다.
    • dafault 메서드는 pubilc 특성을 갖기 때문에 public을 생략하더라도 자동적으로 컴파일 과정에서 붙게 된다.

       4)) 정적 메서드(static method)

    [public] static 리턴타입 메서드명(매개변수, ...) {
    	// ... 실행 내용
    }
    • 자바 8에서 추가된 인터페이스의 새로운 멤버
    • static 키워드가 리턴 타입 앞에 붙는다.
    • 객체가 없어도 인터페이스만으로 호출이 가능하다.
    • 정적 메서드는 public 특성을 갖기 때문에 public을 생략하더라도 자동적으로 컴파일 과정에서 붙게 된다.

    3) 인터페이스 구현(implement)

    public class 구현클래스명 implements 인터페이스명 {
    	// 인터페이스에 선언된 추상 메서드의 실체 메소드 선언
    }
    • implements 키워드
    • 인터페이스에 선언된 추상 메서드의 실체 메서드 선언

    4) 예시

    public interface OnEvent {
        void on();
    }
    public interface OffEvent {
        void off();
    }
    public class MacBook implements OnEvent, OffEvent {
        @Override
        public void on() {
            System.out.println("Mac Book On");
        }
    
        @Override
        public void off() {
            System.out.println("Mac Book Off");
        }
    }
    public abstract class MacBook implements OnEvent, OffEvent {
        @Override
        public void on() {
            System.out.println("Mac Book On");
        }
    }

    추상 메서드를 하나라도 구현하지 않을 경우 추상 클래스로 선언 필요!!

Designed by Tistory.