티스토리 뷰

 

 

 

추상 클래스와 항상 따라다니는 인터페이스!!

이어서 인터페이스에 대해서 살펴보도록 하겠습니다~!

 

 

 

1. 자바에서 인터페이스가 생겨난 배경


인터페이스도 추상클래스처럼 다른 클래스를 작성하는데 도움을 주는 목적으로 작성하는데

클래스와 다르게 여러개의 인터페이스로부터 다중상속(구현)이 가능하다.

 

 

 

 

💡 다중상속이 먼가요?

 

다중 상속을 지원하게 되면 하나의 클래스가 여러 부모 클래스로부터 상속 받을 수 있다.

BUT ! 자바는 IS-A 관계(상속관계)로 하나만 상속이 가능하다.

 

 

자식 클래스가 여러 부모 클래스를 상속받는다면 다양한 부모 클래스의 메서드를 가져올 수 있어서 좋지 않을까? 싶지만

 

부모의 메서드 중 동일한 메서드가 있다면 자손에서 충돌나는 문제를 방지하기 위해서 자바에서는 다중 상속을 지원하지 않는다.

이를 '다이아몬드 문제'라고 한다.

class GrandMother {
    void myMethod(){
        System.out.println("GrandFather");
    }
}

class MotherA extends GrandFather {
    @Override
    void myMethod(){
        System.out.println("FatherA");
    }
}

class MotherB extends GrandFather {
    @Override
    void myMethod(){
        System.out.println("FatherB");
    }
}

class Son extends MotherA, MotherB{
    @Override
    void myMethod() {
        super.myMethod(); //MotherA를 출력해야 할까? MotherB를 출력해야 할까?
    }
}

➕ C++, 파이썬 등 다중상속을 지원하는 다른 언어들은 이렇게 동일한 메소드를 상속받는 경우 우선순위등을 적용하여 해결한다.

이는 객체지향 프로그래밍에서 큰 제약이기 때문에 자바에서는 인터페이스를 사용해서 다중 상속을 가능하게 한다.

 

 

 

 

 

2. 그래서 인터페이스란?


인터페이스(interface)란 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 "일종의 추상 클래스"라고 할 수 있다.

 

 

 

 

 

3. 인터페이스 사용방법


인터페이스는 class대신 interface 키워드를 통해 선언한다.

 

 일반 클래스에서는 implements 키워드를 통해 인터페이스를 구현할 수 있다.

(이 구현을 통해서 미완성된 설계도인 인터페이스를 완성시키는 느낌이다.)

 

 

 

 

 

4. 인터페이스의 구성멤버


public interface 인터페이스명 {
	//상수
	(public) (static) (final) 상수명 = 값;

	//추상 메소드
	(public) (abstract) 메소드명(매개변수, ... );

	//디폴트 메소드 
	default 타입 메소드명(매개변수, ... ){//구현 내용 필요함}

	//정적 메소드
	static 타입 메소드명(매개변수) {//구현 내용 필요함}

}

인터페이스가 다른 클래스들에게 이렇게 말합니다 😉

  1. 상수 : 인터페이스에서 값을 정해줄테니 함부로 바꾸지 말고 제공해주는 값만 참조해라.   (절대적)
  2. 추상메소드 : 가이드만 줄테니 추상메소드를 오버라이딩해서 재구현해라.   (강제적)
  3. 디폴트메소드 : 인터페이스에서 기본적으로 제공해주지만, 맘에 안들면 각자 구현해서 써라.   (선택적)
  4. 정적메소드 : 인터페이스에서 제공해주는 것으로 무조건 사용해.   (절대적)

 

 

💡 인터페이스는 모든 메서드가 추상 메서드이고 상수만을 포함할 수 있다.

      자바 8 부터 인터페이스에서도 default 키워드를 통해 일반 메서드도 구현이 가능해졌다.

 

1. 상수

인터페이스는 데이터를 저장할 수 없기 때문에 데이터를 저장할 인스턴스 또는 static 필드를 선언할 수 없다.

선언과 동시에 초기값을 지정해주어야 한다.

(public static final) 타입 상수명 = 값;

변수는 public static final 예약어를 쓰지 않아도 컴파일 과정에서 자동으로 값이 변하지 않는 상수로 변환된다.

 

2. 추상메서드

인터페이스의 메서드는 어차피 구현객체에서 실행되니까 추상 메서드로 선언한다.

 

 

 

 

 

5. 인터페이스의 특징


  1. 인터페이스는 추상 클래스보다 한 단계 더 추상화된 클래스라고 볼 수 있다.
  2. 인터페이스에 적는 모든 메서드들은 추상 메서드로 간주되기 때문에 abstract을 적지 않는다.
  3. 인터페이스는 static final 필드만 가질 수 있다.

 

💡 public static final을 사용하는 이유?

클래스 멤버 변수를 final로 지정한다!

클래스에서 사용할 해당 멤버 변수의 데이터와 그 의미, 용도를 고정시키겠다는 것이다.

해당 클래스를 쓸 때 변하지 않고 계속 일관된 값으로 쓸 것을 멤버 상수로 지정하는 의미이다.

 

 

 

 

 

 

 

 

📢 그래서 [ 추상메서드-인터페이스 ] 둘의 차이점은 무엇인가요?


추상클래스는 일부 메소드를 추상화하여서 만든 클래스이고

인터페이스는 모든 메소드를 추상화하여서 만든 클래스라고 할 수 있다.

그냥 추상클래스로 다 표현하면 되는데 인터페이스를 왜 굳이 구분지어 놓았을까?

 

 

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

1. 상속 형태가 다르다

    추상 클래스 ( 단일상속 ) / 인터페이스 ( 다중상속 )

 

2. 목적이 다르다

    추상 클래스의 목적은 상속을 받아서 기능을 확장시키는 것

    인터페이스는 모든 메소드를 다 구현해야한다.

    ➡ "구현을 강제했다"는 것이다.

    따라서 인터페이스는 함수의 구현을 강제함으로써 ⇒ 구현 객체와 같은 동작을 보장하기 위해 사용한다.

 

💡 공통점

1. 스스로 객체를 생성할 수 없다.

2. 상속 관계에서만 존재한다. 따라서 구현을 목적으로 한다.

 

 

 

 

 

 

 

 

 

반응형

'language > java' 카테고리의 다른 글

Java 8 Stream : map 함수  (0) 2023.04.18
정적 팩토리 메서드 (Static Factory Method) 사용하기  (2) 2023.04.05
추상 클래스란?  (0) 2021.07.22
이차원 배열 dimensional array  (0) 2021.02.03
배열 array _1  (0) 2021.02.03
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함