자바의 핵심 - 인터페이스 interface 의 개념과 메서드, 상속, 다형성과의 관계

Yeppi's 개발 일기·2022년 5월 23일
0

JAVA

목록 보기
19/27

1. 인터페이스

1) 인터페이스란?

  • 구현코드가 하나도 없기때문에 멤버변수 가지지 않음

상수와 메서드

  • 모든 변수는 상수로 선언됨 public static final
    모든 메서드가 추상 메서드로 선언됨 public abstract
    ⇒ 자동, 따로 추가안해도 됨
  • 상수
    • 모두 대문자 작성
    • 단어끼리 _ 밑줄로 연결
    • final, static 이 자동으로 추가
  • 메서드
    • 추상 메서드만 가짐
    • abstract 생략해도 컴파일 시점에 자동으로 추가
interface 인터페이스이름 {
	// 상수
    public static final float pi = 3.14F; 
    static final int GAME_LEVEL = 10;
    
    // 추상 메서드
    public void makeSomething(); // public abstract
}


2) 인터페이스 상속

상수만 사용하므로, 다중 상속 가능

개념

  1. 인터페이스(Calc)는 Calculator 가 구현
  2. Calculator 안에 일부만 추상메소드, 일부는 구현 메소드 할 것
    이텔릭체
  3. 구현 행위를 표기하는 방법
    → 위로 점선 화살표
  4. CompleteCalc 는 인스턴스화 될 수 있는 클래스(기존에 쓰던 클래스)

  • public class CompleteCalc extends Calculator { . . . }
    Calculator 를 **상속받고, Calc 를 타입상속 받음
  • 구현 상속
    → 구현 코드를 상속 받은 것
  • 타입 상속
    → 상속 받은 클래스(CompleteCalc)는 해당 인터페이스(Calc)의 타입이다
  • 원래, 여러개의 클래스를 다중상속 불가능, 그 이유는?
    ⇒ 모호성이 생기기때문
  • 인터페이스는 구현코드가 없기때문에, 여러개가 생겨도 모호성이 생기지 않음 ❗
    ⇒ 클래스는 여러개의 인터페이스를 implements 할 수 있음


3) 인터페이스 다형성

개념

  • 상속 구조에서 최상위 부모

  • 하나의 인터페이스를 여러 객체가 구현하게 되면?

    클라이언트 프로그램은 인터페이스의 메서드를 활용하여
    여러 객체의 구현을 사용할 수 있음(바꿔가면서 사용가능)
    👉 다형성

  • 부모-자식 클래스간의 관계가 is a 관계가 성립되지 않는 경우
    👉 인터페이스로 만들기
    is a, has a 관계는 자바 시리즈 16번의 논리적 포함관계를 참고해주세요

하이라키 구조

  • 실무(시니어)에서 핵심
    → 해당 인터페이스를 어떻게 설계해야 clinet프로그램에서 유용하게 쓸 수 있는가?

  • 하이라키(Hierarchy) 구조를 잘 설계
    → 계층 구조를 뜻함 (아래 패키지들)



2. 인터페이스를 사용하는 이유

  1. 클래스나 프로그램이 제공하는 기능을 명시적으로 선언

  2. 일종의 클라이언트 코드와의 약속이며,
    클래스나 프로그램이 제공하는 명세(specification)

  3. 클라이언트 프로그램은 인터페이스에 선언된 메서드 명세만 보고
    이를 구현한 클래스를 사용할 수 있음

  4. 어떤 객체가 하나의 인터페이스 타입이라는 것은
    그 인터페이스가 제공하는 모든 메서드를 구현했다는 의미

  5. 인터페이스를 구현한 다양한 객체를 사용할 수 있음 → 다형성

  6. (ex) JDBC 인터페이스

    • interface 에는 구현코드가 없음
      → 구현은 ORACLE, MYSQL, MSSQL에서 구현해서 jar파일 라이브러리로 제공해줌
      → 개발자는 JDBC 명세만 보고 개발
  1. clinet interface server
    • clinet는 server가 정확히 어떻게 구현되어있는지 잘 모르더라도, interface만 보고 구현
    • interface 에는 server가 어떤 기능을 한다는 것에 대한 명세가 적혀있음


🍑 추상 클래스 VS 인터페이스 🍑

공통점

  • 인터페이스는 추상 클래스와 기능적 동일
    • 변수가 올 수 없고, 상수만 올 수 있음
    • 상수는 전부 대문자 및 단어사이 _
    • 초깃값을 할당하기
    • 추상 메소드만 올 수 있음

차이점

  • 자바는 다중 상속을 지원하지 않음 ❗ 단일 상속 ❗
  • 인터페이스만 ❗ 다중 상속 ❗
    • 인터페이스는 변수를 가지지 못하기 때문에, 여러 개의 부모를 가질 수 있음
  • 추상 클래스와 다른점
    • 상수만 가진다
    • 추상메소드만 가진다
    • 추상성이 좀 더 극대화 된 것이 인터페이스


3. 인터페이스 구성 요소

1) 상수

  • 모든 변수는 상수로 변환 됨
  • public static final
double PI = 3.14;
int ERROR = -999999999;


2) 추상 메서드

  • 모든 선언된 메서드는 추상 메서드
  • public abstract


3) default 메서드 (자바 8이후)

  • 구현을 가지는 메서드, 인터페이스를 구현하는 클래스들에서 공통으로 사용할 수 있는 기본 메서드
  • default 키워드 사용
// Calc.java 최상위 인터페이스
default void description() {
	System.out.println("정수 계산기를 구현합니다.");
	myMethod();
}
  • 구현 하는 클래스에서 재정의 할 수 있음
// CompleteCalc.java
@Override
public void description() {
	System.out.println("CompleteCalc overriding");
	//super.description();
}

CompleteCalc calc2 = new CompleteCalc();

// CompleteCalc의 description()이 Calc의 description()을 오버라이딩 해서 출력
// 출력 결과 CompleteCalc overriding
calc2.description();


4) static 메서드 (자바 8이후)

  • 인스턴스 생성과 상관 없이, 인터페이스 타입으로 바로 사용
    VS
    디폴트 메서드는 인터페이스를 implement 하는 클래스가 인스터스화(new)되었을 때, 호출해서 사용
**static** int total(int[] arr) { // **static** 있어서, 인터페이스타입으로 바로 사용가능
	int total = 0;
		
	for(int i: arr) {
		total += i;
	}
	mystaticMethod();
	return total;
}
// 출력 15
// 정적메소드 total 호출  => static 메소드 이기때문에 인터페이스 이름으로 바로 호출 가능
		int[] arr = {1,2,3,4,5};
		System.out.println(Calc.total(arr));


5) private 메서드 (자바 9이후)

  • 인터페이스를 구현한 클래스 안에서 사용하거나 재정의 할 수
  • 인터페이스 내부에서만 사용하기 위해 구현하는 메서드
  • default 메서드나 static 메서드에서 사용함
// Calc.java
default void description() {
	System.out.println("정수의 사칙연산을 제공합니다.");
	myMethod(); // private 메소드 => default 메소드에서 사용 가능
}

// 정적메서드
static int total(int[] arr) {
	int total = 0;
	for(int num : arr) {
		total += num;
	}
	myStaticMethod(); // private 메소드 => static 메소드에서 사용 가능
	return total;
}

// private 메소드  => 인터페이스 내부에서만 사용, 구현 메소드에서는 재정의 및 사용 불가
**private** void myMethod() {
	System.out.println("myMethod");
}
	
**private static** void mystaticMethod() {
	System.out.println("myStaticMethod");
}

출력결과

정수의 사칙연산을 제공합니다.
myMethod
myStaticMethod
15
profile
imaginative and free developer. 백엔드 / UX / DATA / 기획에 관심있지만 고양이는 없는 예비 개발자👋

0개의 댓글