ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [포스코x코딩온] Java(인터페이스, 다형성)
    [포스코x코딩온] 웹개발자 풀스택 부트캠프8기 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
Designed by Tistory.