인터페이스 (23.05.09)

·2023년 5월 9일
0

Java

목록 보기
25/35
post-thumbnail

📝 인터페이스


💡 상속

(자식 클래스의) 공통된 부분을 추출하여 부모 클래스를 만드는 것
-> 공통된 필드, 메소드를 가진 클래스를 만들고 작성된 코드를 자식들이 물려받아 사용
(코드 길이 감소, 코드 중복 제거, 재사용 증가, 자식에 대한 일관된 규칙 제공)

✏️ [일반 클래스] 상속

부모 클래스도 객체로 만들 수 있어야 되는 경우

ex) (부) 갤럭시 22 (자) 갤럭시 22 울트라

✏️ [추상 클래스] 상속

연관된 클래스의 공통점을 묶어두되 부모 클래스는 객체로 만들 수 없는 경우
+ 일부 미완성 클래스 (abstract 메소드 0개 이상 포함)

  • abstract 메소드가 없어도 클래스를 객체로 못 만들게 하고 싶은 경우가 있음
    (1) 기본 기능을 가지고 있지만 이것만 가지고는 쓸 데가 없음
    -> abstract로 만들어서 객체 생성을 막아둠
    ex) 계산기(+, -, *, /)
    (2) 의미적으로 객체가 되면 안 되는 경우
    ex) Biology - 생물 객체는 어떤 생물인가?

ex) Animal 클래스
- 동물 객체는 어떤 동물인가? eat(), breath()는 어떻게 수행되는가?
-> 알 수 없음. 하지만 동물의 공통된 기능명은 알고 있음.

💡 [인터페이스] 상속

interface : 접점

연관성이 낮거나 없는 클래스들에게 공통된 기능을 제공할 때 사용

ex) 키보드, 마우스, 스캐너, 압력 센서, 기울기 센서
-> 입력 장치 (각각의 용도는 다르지만 "입력"이라는 공통된 "기능명"이 있을 뿐)

  • 모든 필드가 묵시적(암묵적) public static final
    ex) public static final double PI = 3.141592;
    int MAX_NUM = 10000;

  • 모든 메소드가 묵시적으로 public abstract (추상 메소드)
    ex) /public abstract/ void input();
    // "input"이라는 이름을 자식에게 제공할 뿐 상세한 기능은 자식이 알아서 오버라이딩 해라
    // 그런데 추상 메소드니까 무조건 오버라이딩 해야 함 (강제화)

✏️ 인터페이스 활용 용도

default 메소드 : 상속받은 클래스에 공통 기능 제공
-> 자바의 함수 지향 언어 사용을 위한 메소드로 사용

  • 람다, 스트림에 사용
  • Spring AOP Proxy 사용

✏️ [예제] 계산기 만들기

  • Calculator 클래스
package edu.kh.poly.ex2.model.service;

// 계산기 인터페이스
// -> 모든 계산기에 대한 공통 필드, 기능명을 제공하는 접점(interface) 용도
public interface Calculator {
	
	// 인터페이스 : 추상 클래스의 변형체 (추상 클래스보다 추상도 높음)
	//			- 추상 클래스 : 일부만 추상 메소드(0개 이상)
	//			- 인터페이스 : 모두 추상 메소드
	
	// 필드(묵시적으로 public static final)
	// -> 어떻게 작성하든 모두 public static final
	public static final double PI = 3.14;
	static final int MAX_NUM = 100000;
	public int MIN_NUM = -100000;
	int ZERO = 0;
	
	
	
	// 메소드(묵시적으로 public abstract)
	public abstract int plus(int num1, int num2);
	public abstract int minus(int num1, int num2);
	public abstract int multiple(int num1, int num2);
	public abstract int divide(int num1, int num2);
	
}
  • ASHCalculator 클래스
package edu.kh.poly.ex2.model.service;

import edu.kh.poly.ex2.model.vo.Animal;

public class ASHCalculator extends Animal implements Calculator {
					// 클래스, 인터페이스는 동시 상속 가능
					// 인터페이스는 다중 상속 가능
                    
	// extends : 확장하다 / implement : 구현하다
	
	// (부)클래스 - (자)클래스 상속 시에는 extends (추상 클래스도 포함)
	
	// (부)인터페이스 - (자)클래스 상속 시에는 implements 
	
	
	@Override
	public int plus(int num1, int num2) {
		return num1 + num2;
	}
	
	@Override
	public int minus(int num1, int num2) {
		return num1 - num2;
	}
	
	@Override
	public int multiple(int num1, int num2) {
		return num1 * num2;
	}
	
	@Override
	public int divide(int num1, int num2) {
		return num1 / num2;
	}
	
}
  • AbstractRun 클래스
package edu.kh.poly.ex2.run;

import edu.kh.poly.ex2.model.service.ASHCalculator;
import edu.kh.poly.ex2.model.service.AbstractService;
import edu.kh.poly.ex2.model.service.Calculator;

public class AbstractRun {

	public static void main(String[] args) {

		// Calculator 임폴트
		// import edu.kh.poly.ex2.model.service.Calculator;
		      
		// 각자 만든 xxxCalculator 임폴트
		// import edu.kh.poly.ex2.model.service.ASHCalculator;
//		ASHCalculator cal = new ASHCalculator();
		Calculator cal = new ASHCalculator();
		
		// 인터페이스 == 미완성 설계도 == 객체 생성 불가능
		// -> 추상클래스처럼 참조 변수로는 사용 가능
		
		// 코드의 큰 수정 없이
		// 객체 생성 코드만 바꾸면 새로운 클래스 코드를 수행할 수 있다.
		      
		System.out.println("합 : " + cal.plus(20, 15));
		System.out.println("차 : " + cal.minus(20, 15));
		System.out.println("곱 : " + cal.multiple(20, 15));
		System.out.println("몫 : " + cal.divide(20, 15));
	}

}

✏️ 인터페이스의 특징

  1. 인터페이스를 부모 참조 변수로 사용하면 다형성 업캐스팅이 적용돼서 상속받은 모든 클래스를 자식 객체로 참조할 수 있다.
    -> 이를 이용하여 중요한 메인 코드의 수정을 최소화할 수 있다.
    ex) Run에 작성된 합, 차, 곱, 몫을 출력하는 코드의 수정 없이 객체 생성 코드 한 줄만 수정하여 다르게 작성된 기능을 수행할 수 있다.

  2. 자식 클래스에 공통된 메소드 구현을 강제하기 때문에 모든 자식 클래스가 동일한 형태를 띄게 된다.
    -> 이를 이용하여 공동 작업(팀 프로젝트)에 필요한 개발 환경을 구성할 수 있다.

💡 추상 클래스와 인터페이스

구분추상 클래스인터페이스
상속단일 상속다중 상속
구현extends 사용implements 사용
추상 메소드abstract 메소드 0개 이상모든 메소드는 abstract
abstract명시적 사용묵시적으로 abstract
객체객체 생성 불가객체 생성 불가
용도참조 타입참조 타입
profile
풀스택 개발자 기록집 📁

0개의 댓글