-
[포스코x코딩온] Java(인터페이스, 다형성)[포스코x코딩온] 웹개발자 풀스택 부트캠프8기 2023. 10. 25. 15:05728x90
인터페이스
- 추상 메소드의 모음
- 여러 구현체에서 공통적인 부분을 추상화 하는 역할
- 서브 클래스가 같은 동작을 한다는 것을 보장하기 위해서 사용한다.
- 추상 클래스와의 다른점
- 추상 클래스는 추상메소드가 없어도 상관이 없다. 하지만, 인터페이스에는 무조건 있어야 한다.
- 메소드를 구현하지 못한다. 추상 메소드만 존재한다.
인터페이스 문법
- 필드(변수) 선언 불가
- 단, public 상수는 선언이 가능하다. final 키워드 사용
- final 키워드
- 클래스에서 사용: 상속될 수 없다. final class MyClass{}
- 메소드에서 사용: 오버라이드될 수 없다.
- 변수에서 사용: 상수가 된다. 값 변경이 불가능하다.
- 매개변수에서 사용: 매개변수 값 변경 불가능. void Func(final int x){}
- 인터페이스를 상속 받는 클래스는 인터페이스의 모든 추상 메소드를 반드시 구현해야 한다.
- 인터페이스 선언 시에 class 키워드 대신 interface 키워드를 사용한다.
- 상속 시에 extends 키워드 대신 implements 키워드를 사용한다.
인터페이스 특징
- 추상화: 메소드를 선언하여 상속 받은 클래스에서 사용하게 한다.
- 다중 상속: 하나의 클래스는 여러 인터페이스를 구현할 수 있다.
- 하나의 인터페이스를 통해 여러 클래스에서 공통의 동작을 정의할 수 있고, 각 클래스는 그 동작을 자신의 방식대로 재구현할 수 있다.
추상클래스와 인터페이스의 차이점
- 상속
- 추상 클래스: 한 클래스는 하나의 추상 클래스만 상속
- 인터페이스: 한 클래스는 여러 인터페이스를 구현 가능
- 멤버 변수
- 추상 클래스: 멤버변수를 가질 수 있다.
- 인터페이스: 상수만 포함 가능
- 구성요소
- 추상 클래스: 추상 메소드, 생성자, 변수
- 인터페이스: 추상 메소드, 상수, 디폴트 메소드
- 사용
- 추상 클래스: 상속 관계에서 공통의 기능이나 상태를 유지할 때 사용
- 인터페이스: 여러 클래스에서 공통으로 필요한 기능을 정의할 때 사용
- 생성자
- 추상 클래스: 생성자와 초기화 가능
- 인터페이스: 생성자와 초기화 불가능
공통점
- 하위 클래스에서 특정한 행동을 강제하기 위새 사용한다.
예시 코드
package Java_Interface; interface Playable{ void play(); void pause(); void stop(); } class MP3Player implements Playable{ @Override public void play() { // TODO Auto-generated method stub System.out.println("MP3 재생"); } @Override public void pause() { // TODO Auto-generated method stub System.out.println("MP3 일시중지"); } @Override public void stop() { // TODO Auto-generated method stub System.out.println("MP3 정지"); } } class DVDPlayer implements Playable{ @Override public void play() { // TODO Auto-generated method stub System.out.println("DVD 재생"); } @Override public void pause() { // TODO Auto-generated method stub System.out.println("DVD 일시중지"); } @Override public void stop() { // TODO Auto-generated method stub System.out.println("DVD 정지"); } } public class Practice_ineterface { public static void main(String[] args) { // TODO Auto-generated method stub MP3Player mp3 = new MP3Player(); DVDPlayer dvd =new DVDPlayer(); mp3.pause(); mp3.play(); mp3.stop(); dvd.pause(); dvd.play(); dvd.stop(); } }
다형성
- 하나의 인터페이스나 클래스를 여러 가지 방식으로 동작하게 하는 것
- 상속과 인터페이스를 활용하여 구현
- 장점
- 재사용성: 기존 코드를 재사용하여 새로운 클래스 생성
- 확장성: 기존 코드를 수정하지 않고 기능 추가 및 확장
- 단점
- 복잡성 증가: 여러 객체가 동일한 인터페이스나 슈퍼클래스를 상속받을 때, 실제 어떤 객체의 메소드가 호출되는지 파악하기 어려울 수 있다.
- 디버깅 어려움: 여러 클래스가 동일한 메소드를 오버라이드 할 경우, 디버깅 시 실제로 어떤 클래스의 메소드가 실행되는 지 파악하기 어려울 수 있다.
- 유지보수의 어려움: 다형성을 과도하게 사용하게 되면 새로운 클래스나 메소드가 추가될 때 유지보구가 어려워질 수 있다.
package Java_Interface; //1. 일반 클래스를 사용한 다형성 class Animal{ public void sound() { System.out.println("동물은 소리를 냅니다."); } } class Dog extends Animal{ @Override public void sound() { System.out.println("멍멍"); } } class Cat extends Animal{ @Override public void sound() { System.out.println("야옹"); } } //2. 추상클래스를 사용한 다형성 abstract class Shape{ abstract double area(); } class Circle extends Shape { double radius; public Circle(double r) { this.radius = r; } @Override double area() { // TODO Auto-generated method stub return Math.PI * radius * radius; }} class Rectangle extends Shape { double width, height; public Rectangle(double w, double h) { this.height = h; this.width = w; } @Override double area() { // TODO Auto-generated method stub return width * height; } } //인터페이스를 사용한 다형성 interface Flyable{ void fly(); } class Bird implements Flyable{ @Override public void fly() { // TODO Auto-generated method stub System.out.println("새가 난다."); } } class Airplane implements Flyable{ @Override public void fly() { // TODO Auto-generated method stub System.out.println("비행기가 날아간다."); } } public class JavaExample { public static void main(String[] args) { // 다형성은 각 클래스나 인터페이스의 참조변수를 사용하여 다양한 구현을 가진 객체를 참조 // 다양한 형태의 객체 // dog와 cat은 Animal 타입의 참소 변수. dog와 cat은 Dog와 Cat의 객체를 참조. Animal dog = new Dog(); Animal cat = new Cat(); dog.sound(); cat.sound(); Shape s1 = new Circle(4.9); Shape s2 = new Rectangle(3, 6); System.out.println(s1.area()); System.out.println(s2.area()); Flyable f1 = new Bird(); Flyable f2 = new Airplane(); f1.fly(); f2.fly(); } }
728x90'[포스코x코딩온] 웹개발자 풀스택 부트캠프8기' 카테고리의 다른 글
[포스코x코딩온]SpringBoot의 시작(설치부터 Thymeleaf사용까지) (1) 2023.10.28 [포스코x코딩온] Java (Wrapper 클래스, 오토박싱과 오토언박싱, 제네릭, 와일드 카드, 컬렉션) (0) 2023.10.26 [포스코x코딩온] Java(클래스의 상속, 오버라이딩, 추상 메소드, 추상 클래스) (1) 2023.10.25 [포스코x코딩온] Java - 예외처리 (0) 2023.10.24 [포스코x코딩온] Java(객체지향, 클래스, 메소드, 접근 제어자,static, getter & setter) (0) 2023.10.23