Java

[JAVA] 인터페이스의 기본부터 응용까지 (2) - 인터페이스 사용법 익히기

손가든 2023. 5. 24. 15:43

 

실패는 나를 절대 실패시키지 못한다.
실패라 믿고 포기하는 순간 나는 실패한다.

 

오늘은 전 축구선수 이영표님께서 하신 말씀에 되게 감명받아 문구로 시작해봅니다.

(실패했다고 착각하지 맙시다 모두 !)

 

 

이전 포스팅에서 인터페이스가 무엇인지, 왜 사용하는지 알아봤으니

이제 사용해볼 차례입니다.

 

 

 


 

인터페이스 선언하기

 

public interface ridable{
	static void ride(){
    	System.out.println("i can ride");
	}
    
	static void stop(){
    	System.out.println("stop!");
	}
}

 

간단하게 달리는 것들을 위한 인터페이스를 생성해보았는데요!

 

공부하면서 자연스레 알게된 코드 컨벤션으로 인터페이스는 기능이 정의할 메소드들의 집합이기 때문에

-able으로 네이밍을 해준다고 하더라구요.

(멋있지)

 

근데,, 뭔가 이상하다,, 인터페이스는 기능을 직접 구현하지 않는데,,

라고 생각했다면 당신은 예리해 !

 

사실은 인터페이스도 구현할 수 있도록 하는 구현 방법이 있답니다.

 

많은 궁금증을 가진채로 시작부터 꼼꼼히 공부해 보죠.

 


 

인터페이스 구성요소

 

클래스의 구성요소는 필드 , 생성자 , 메소드가 있습니다.

 

그렇다면 인터페이스의 구성요소와의 차이점은?

 

그것은 바로 인터페이스에서는 생성자가 존재하지 않다는 것.!

 

(제가 너무 기초지식들을 엄청난 것처럼 얘기하는 것

저는 초보 개발자니까요.)

 

그래서 인터페이스는 상수의 필드,

(static final로 선언해요. 만약 이렇게 선언하지 않았더라도 컴파일러가 알아서 상수로 인식해요.)

 

그리고 인터페이스 기능을 선언할 메소드만 존재합니다.

 

 

여기서 메소드는 다양한 형태가 있는데요,

 

추상 메소드, default 메소드, static 메소드, private 메소드 이렇게 4가지에요.

 

 

먼저 추상 메소드부터 알아봅시다.

 

추상 메소드

 

abstract 키워드로 선언하고 실행블록 없이 ;로 마침

선언된 메소드는 인터페이스로 구현된 class에서 구현

abstract를 생략해도 컴파일러가 알아서 추상 메소드로 해석

 

 

인터페이스로 제일 많이 사용하는 메소드가 바로 추상메소드에요.

 

메소드를 선언해두고 그안의 기능을 넣을 중괄호도 없이 사용할 클래스에게 그 구현을 미루는 것이죠.

 

 

전등 인터페이스로 예시 코드를 볼게요.

public interface Light{
	public static final String TYPE = "LED";
	public String UNIT = "W"; //static final 생략가능
	
	public abstract void switchOn();
	public void switchOff(); //astract 생략가능

이런식으로 중괄호가 없는 메소드를 선언한 것을 볼수 있죠? 이게 바로 추상 클래스 입니다.

 

스위치를 켜고 끄는 기능은 여러 개체에게 적용될 수 있기 때문에

그때 그때 다른 코드를 작성해 주어 다형성을 커버합니다.

 

 

구현 클래스에선 어떻게 선언할까요?

이것도 코드를 통해서 알아볼게요.

public class LivingRoom implements Light,Door{
	//오버라이드된 메소드 구현..
    @Overide
    public void SwitchOn(){
    System.out.println("Light On");
    }
    
    @Overide
    public void SwitchOff(){};
    
    @Overide
    public void Open(){};
}

코드를 살펴보시면 implements를 사용하여 인터페이스를 상속받았어요.

 

그리고 다중상속의 개념, 오버라이드 어노테이션을 보실 수 있어요.

 

 

인터페이스는 다중 상속이 가능하다는 장점이 있었죠.

 

이렇게 인터페이스를 구현하는 클래스는 여러개의 인터페이스를 동시에 상속받을 수 있어요.

 

 

@Overide 어노테이션은 IDE를 사용하는 개발 준비생분들이라면 자동 생성되면서 보셨을텐데요.

 

이는 상속을 받은 인터페이스의 메소드를 구현했다는 것을 나타내는 표시라고 생각하시면 되요.

 

컴파일러는 Overide 어노테이션을 인식해서 코드를 해석하도록 설계되어 있어서 Overide를 사용하는것이 좋을 것 같아요.

 

문서화코드 가독성 면에서도 이점이 있답니다.

 

 

구현된 클래스는 인스턴스로 선언한 후 사용하기만 하면 되요!

 

인터페이스 구현한 클래스 선언법

구현클래스는 인스턴스로 선언할 때, 이런식으로 인터페이스명으로 선언할 수 있어요

(물론 다중상속 시에는 특정 선언한 인터페이스만 사용할 수 있어요. 이럴 때는 그냥 클래스로 선언하는게 좋을 것 같네요.)

 

 

문득 포스팅을 하다보니 제가 인터페이스로 구현된 클래스를 인스턴스로 선언할때는

딱히 인터페이스명으로 타입화하지 않았던 것 같거든요?

 

근데 다중 상속된 경우도 있을텐데 인터페이스명으로 타입화하면 이점이 무엇일지 궁금하더라구요?

 

그럴땐 내 절친 ChatGPT가 있죠?

 

바아로 물어봤습니다.

 

우리의 영웅 GPT군

인터페이스로 구현된 클래스를 인스턴스화 할때 타입을 인터페이스로 선언하는 것을

"인터페이스 기반 프로그래밍"이라고 한대요.

 

코드간의 결합 의존력을 떨어뜨리는 노력 중 하나가 인터페이스 기반 프로그래밍이라고 생각되네요.

 

코드는 가능한 클래스 단위로 의존성을 떨어뜨리도록 설계해야 버그픽스와 유지보수에 용이하기 때문에

의존성을 낮추려는 개발자들의 노력이 프로그래밍의 코드 작성 방식에 드러나고 있네요.

 


 

자 오늘은 인터페이스의 구성요소 및 구현, 메소드 형식 네가지 중 가장 대표되는 추상 메소드, 마지막으로 실제 사용법까지

살펴보았습니다.

 

 

감사합니다:)