KOSA

KOSA - 5일차 - 1 Java 기초 | 다형성, 인터페이스

jonghyeon6084 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");
    }
}

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