개발새발

[Java] 인터페이스 Interface 본문

Java/개념을 Java

[Java] 인터페이스 Interface

칸쵸. 2023. 10. 11. 02:03
728x90

인터페이스라는 말은 정말로 많이 들어봤다

특히 어떤 화면 상에서 "인터페이스가 왜 이래? 너무 구린데?" 라고 말도 여러번 해봤고

진짜 내가 아는 인터페이스는 그거 하나 뿐인데...

근데 또 그럼 누군가가  '너가 말하는 인터페이스가 뭔데?' 물어보면 대답은 못하겠다. 분명 느낌은 아는데...

그런데 Java에서 나오는 인터페이스가 또 있단다.

진짜 난생 처음보는 개념같은데, 근데 또 이게 알고보면 내가 알던 그 인터페이스랑 상통한다고?

.

.

.

라는 깨달음을 겨우 얻고 작성해보는 글~


1. 인터페이스(Interface)

클래스와 클래스 간의 계약을 정의하는 추상 데이터 유형
클래스의 행동을 정의하고, 클래스가 특정 메서드를 반드시 구현해야 함을 강제한다

그러니까 정말 간단하게 생긴것만 두고보면 인터페이스는 그저 추상메서드의 집합일 뿐이다.

추상메서드란 매개변수만 존재하고 그 내용은 전혀 구현되지 않은 메서드이니..

즉, 인터페이스란 구현 된 것이 전혀 없는 그냥 일종의 미완성 설계도인 셈이다.

 

이것을 왜 쓰는건지 이유는 나중에 알아보고, 일단 이녀석의 특징을 말하자면 다음과 같다.

 

  1.  추상메서드로만 구성되어있고, 인스턴스 변수 및 생성자가 존재하지 않는다.
  2.  외부에 노출되어있어야 하기 때문에 모든 멤버(메서드)는 public이다

그리고 이 인터페이스를 구현하는 코드는 다음과 같다.

interface 인터페이스이름 {
    public abstract 메서드명 (매개변수 목록); //추상메서드
}

20231011

...까지 써놓고 거의 3주만에 돌아와서 쓰는 글인듯요... 게으름 ㄹㅈㄷ

암튼 돌아왔다는 사실에 의의를 두고 이어서 써보겠어요 ㅎㅎ


 

2. 인터페이스의 상속과 구현

보아하니 추상메서드로만 이루어진만큼, 인터페이스는 그 자체로는 실행될 수 없기에 누군가 상속을 받아서 온전하게 구현을 해야된다. 그리고 인터페이스의 상속에서는 특이점이 몇 가지가 있는데..

 

1) 인터페이스의 조상은 인터페이스만 가능하다

 - 일단 클래스가 아니기 때문에 모든 클래스의 지대존엄짱 Object도 예외가 아니다.

 

2) 다중상속이 가능하다

 - 마찬가지로 보통의 클래스와는 다르게 인터페이스 내부는 모두 추상메서드로만 이루어져있기 때문에

   다중상속을 받아도 메서드 간 충돌의 위험이 없다. 

 

따라서 아래와 같은 코드를 작성해도 아무런 문제가 없다

interface A extends B,C {} //한 개의 인터페이스 A가 2개의 인터페이스 B와 C를 상속받음 (다중상속)

interface B {
	void b(int x, int y);
}
interface C {
	void c(int c);
}

 

그리고 추상클래스의 구현과 같이, 인터페이스 또한 상속받은 추상메서드를 그대로 방치하면 아무 일도 일어나지 않기 때문에 추가적인 구현을 해야한다. 즉, 추상 메서드의 완성 과정이 필요한 것.

그리고 주의할 점! 인터페이스를 상속받을 때는 클래스를 상속받을 때와 달리 extends가 아닌, implements를 사용한다. 

class 클래스명 implements 인터페이스명 {
	//인터페이스에 정의된 추상메서드를 모두 구현
}

이때 인터페이스를 상속받는 클래스는 반드시 인터페이스에 정의된 추상메서드를 빠짐없이 구현해야한다.

만약 추상메서드의 일부만 구현하게 되면.. 이 클래스는 여전히 추상메서드를 안고가게 되므로, 그냥 추상클래스가 되어버리기 때문;; (앞 부분에 abstract를 추가해야되는 것은 덤)

 

아무튼 위와같은 과정을 거치면 인터페이스는 비로소 온전히 구현되는 것이다 ~


 

3. 인터페이스를 이용한 다형성

다형성 : 하나의 객체가 여러가지 타입을 가질 수 있는 것

그리고 자바에서는 이 다형성을 부모클래스 타입의 참조변수로, 자식 클래스 타입의 객체(인스턴스)를 가리킬 수 있도록하여 구현한다! 

부모클래스명 객체명 = new 자식클래스명();

예를 들어 자바에서는 다형성 덕분에 위와같은 형식의 코드를 얼마든지 작성 가능하다.

다들 알고있겠지만 중요한거니까 괜히 한 번 더 써보기 히히

 

인터페이스 이야기 하다가 갑자기 이게 무슨 소리인가? 할 수 있지만..

사실 인터페이스는 엄밀히 말하자면 클래스는 아니지만 다형성을 구현할 수 있다;;

 

왜 그러냐고? 몰라!!! 이런건 보통 '자바가 그렇다니까 그냥 그러려니...' 하는게 정신 건강에 좋습니다

정 궁금하면 자바 만든 사람 붙잡고 물어봐요

 

아무튼 인터페이스도 구현 클래스의 부모인 셈 칠 수 있는 것..

아래 코드로 예시를 들어보자

class A extends B implements C {
    B b = new A(); //부모클래스 형식으로 자식객체를 가리키는 중
    C c = new A();
}

interface C {
    void gongbu ();
    void hagisilta(C c);
}

//class B 내용은 생략...

위 코드를 보면 일단 클래스 A가 클래스 B와 인터페이스 C를 상속 받았으며, 인터페이스 C는 추상메서드 두 개를 포함하고있는 모양새다. 그리고 2행 B b = new A(); 과 같은 코드는 사실 낯설지 않은 모습일 것이다.

하지만 3행은 어떤가? 저런 식으로 인터페이스 타입의 객체를 만들 수 있다고? 소리가 또 절로 나오게 되는데...

.

.

.

진짜 대체 왜 이놈의 블로그는 새벽만 되면 삘 받아서 쓰고 갑자기 졸리고 혼자 북치고 장구치고 하게 되는걸까..

2주만에 돌아온 사람 치고는 열기가 너무 빨리 식어서 민망할 정도.. 진짜 내일은 지구가 멸망하는 일이 있어도 이 글이랑 ORACLE SQL Developer 설치글이라쓰고 설치실패연대기라고읽는다 쓰고 잠들어야지

이거 참 사람이 이렇게나 게을러서야 원! 

 

그리고 지구는 멸망했다

안녕히계세요