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");
}
}
추상 메서드를 하나라도 구현하지 않을 경우 추상 클래스로 선언 필요!!