-
KOSA - 5일차 - 1 Java 기초 | 다형성, 인터페이스KOSA 2024. 4. 2. 19:54728x90
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"); } }
추상 메서드를 하나라도 구현하지 않을 경우 추상 클래스로 선언 필요!!
'KOSA' 카테고리의 다른 글
KOSA - 6일차 Java 기초 | 생성자 (0) 2024.04.04 KOSA - 5일차 - 2 Java 기초 | 객체 지향을 적용한 디자인 패턴(전략 패턴) (0) 2024.04.02 KOSA - 4일차 - 2 Java 기초 | 상속 (0) 2024.03.29 KOSA - 4일차 - 1 Java 기초 | Array, Method, 메모리 구조, String메서드 (1) 2024.03.29 KOSA - 3일차 Java 기초 (0) 2024.03.28