[포스코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 키워드를 사용한다.

인터페이스 특징

  1. 추상화: 메소드를 선언하여 상속 받은 클래스에서 사용하게 한다.
  2. 다중 상속: 하나의 클래스는 여러 인터페이스를 구현할 수 있다.
  3. 하나의 인터페이스를 통해 여러 클래스에서 공통의 동작을 정의할 수 있고, 각 클래스는 그 동작을 자신의 방식대로 재구현할 수 있다.

추상클래스와 인터페이스의 차이점

  • 상속
    • 추상 클래스: 한 클래스는 하나의 추상 클래스만 상속
    • 인터페이스: 한 클래스는 여러 인터페이스를 구현 가능
  • 멤버 변수
    • 추상 클래스: 멤버변수를 가질 수 있다.
    • 인터페이스: 상수만 포함 가능
  • 구성요소
    • 추상 클래스: 추상 메소드, 생성자, 변수
    • 인터페이스: 추상 메소드, 상수, 디폴트 메소드
  • 사용
    • 추상 클래스: 상속 관계에서 공통의 기능이나 상태를 유지할 때 사용
    • 인터페이스: 여러 클래스에서 공통으로 필요한 기능을 정의할 때 사용
  • 생성자
    • 추상 클래스: 생성자와 초기화 가능
    • 인터페이스: 생성자와 초기화 불가능

공통점

  • 하위 클래스에서 특정한 행동을 강제하기 위새 사용한다.

예시 코드

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();
		
		

	}

}

https://github.com/DongHo-Kang/KDT-8-web/tree/481d19c3c3d2b32150503a04a7a0b05b0889889a/KDT/src/Java_Interface

 

728x90