[포스코x코딩온] 웹개발자 풀스택 부트캠프8기
[포스코x코딩온] Java(인터페이스, 다형성)
항상 발전하는 개발자
2023. 10. 25. 15:05
728x90
인터페이스
- 추상 메소드의 모음
- 여러 구현체에서 공통적인 부분을 추상화 하는 역할
- 서브 클래스가 같은 동작을 한다는 것을 보장하기 위해서 사용한다.
- 추상 클래스와의 다른점
- 추상 클래스는 추상메소드가 없어도 상관이 없다. 하지만, 인터페이스에는 무조건 있어야 한다.
- 메소드를 구현하지 못한다. 추상 메소드만 존재한다.
인터페이스 문법
- 필드(변수) 선언 불가
- 단, 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