코딩이란 무엇일까

Java/자바[17일차] 인터페이스(Interface) 본문

국비지원수업

Java/자바[17일차] 인터페이스(Interface)

둥구는 지굴다 2022. 11. 12. 22:04
 
혼자 공부하는 자바
혼자 해도 충분하다! 1:1 과외하듯 배우는 자바 프로그래밍 자습서 (JAVA 8 &11 지원) 이 책은 독학으로 자바를 배우는 입문자가 ‘꼭 필요한 내용을 제대로’ 학습할 수 있도록 구성했다. ‘무엇을’ ‘어떻게’ 학습해야 할지 조차 모르는 입문자의 막연한 마음을 살펴, 과외 선생님이 알려주듯 친절하게, 그러나 핵심적인 내용만 콕콕 집어준다. 책의 첫 페이지를 펼쳐서 마지막 페이지를 덮을 때까지, 혼자서도 충분히 자바를 배울 수 있다는 자신감과 확신이 계속될 것이다! 20명의 베타리더 검증으로, ‘함께 만든’ 입문자 맞춤형 도서 20명의 베타리더와 함께 구성하여 입문자에게 맞는 난이도, 분량, 학습 요소 등을 적극 반영했다. 어려운 용어와 개념은 한번 더 풀어 쓰고, 복잡한 설명은 눈에 잘 들어오는 그림으로 풀어 냈다. ‘혼자 공부해본’ 여러 입문자의 초심과 눈높이가 책 곳곳에 반영된 것이 이 책의 가장 큰 장점이다.
저자
신용권
출판
한빛미디어
출판일
2019.06.10
🌍글을 읽기 전 필자는 아직 코딩을 배우는 단계이므로 글의 내용이 부정확할 수 있습니다.

여러 가지 글과 책, 수업을 바탕으로 정리한 내용이니 알맞지 않은 내용이 있다면 댓글 남겨주시면 수정하겠습니다.
추가적으로 위의 책을 참고하여 글을 작성하였습니다.

인터페이스(Interface)란?


인터페이스는 개발 코드와 객체가 서로 통신하는 접점 역할을 말합니다.

객체들 사이에서 상호 작용할 수 있도록 하는 매개 역할입니다.

인터페이스는 하나의 규격이라 생각하면 좋습니다.


인터페이스의 특징

  1. 인터페이스는 객체를 직접 생성하지 않습니다.
  2. 필드는 상수만 갖고 있습니다.
  3. 추상 메서드를 갖고 있습니다.
  4. static 메서드와 인스턴스 메서드도 사용할 수 있습니다.
    1. ❗단, defualt 키워드를 반드시 명시해야 합니다.❗
  5. 인터페이스는 다중 구현(implements)이 가능합니다.

인터페이스 선언 방법

인터페이스의 선언은 class 키워드 대신 interface 키워드를 사용합니다.

public interface 인터페이스 이름 {
//필드;
//메서드;
}

인터페이스는 객체를 생성할 수 없기 때문에 생성자를 가질 수 없습니다.


인터페이스에 상수 필드 선언

인터페이스는 객체 사용 방법을 정의한 것입니다.

따라서 실행 시 데이터를 저장할 수 있는 인스턴스 또는 정적 필드를 선언할 수 없습니다.

하지만 상수 필드는 선언이 가능합니다.

상수는 고정된 값이므로 실행 시에 데이터를 바꿀 수 없습니다.

상수는 public static final로 선언이 가능합니다.

인터페이스의 필드는 모두 public static final의 특성을 갖기 때문에

상수를 선언할 때 public static final을 생략해도 컴파일 과정에서 자동으로 붙게 됩니다.

public static final 타입 상수이름 = 값;

인터페이스에 추상 메서드 선언

인터페이스를 통해 호출된 메서드는 최종적으로 객체에서 실행됩니다.

따라서 인터페이스의 메서드는 실행 블록이 없는 추상 메서드로 선언해야 합니다.

인터페이스의 메서드는 public abstract의 특성을 갖고 있습니다.

따라서 public abstract를 생략하더라도 컴파일 과정에서 자동으로 붙게 됩니다.

하지만 인스턴스 메서드를 생성하면 추상 메서드와 구분을 지기 위해서 

인스턴스 메서드는 반드시 default키워드를 붙여 주어야 합니다.

public abstract 리턴타입 메서드 (매개변수 ,...);

인터페이스 구현

개발 코드가 인터페이스 메서드를 호출하면 인터페이스는 객체의 메서드를 호출하게 됩니다.

객체는 인터페이스에서 정의된 추상 메서드와 동일한 메서드 이름,매개 타입, 리턴 타입을 가진

실체 메서드를 갖고 있어야합니다.

이러한 객체를 인터페이스의 구현 객체라고 합니다.

구현 객체를 생성하는 클래스를 구현 클래스라고 합니다.


구현 클래스

구현 클래스는 클래스를 선언할 때 구현하고자 하는 인터페이스의 타입으로 사용할 수 있음을 알려주기 위해서

클래스 선언부에 implements 키워드를 추가하고 인터페이스 이름을 명시해 주어야 합니다.

그리고 인터페이스의 추상 메서드를 모두 구현해야 합니다.

public class 구현클래스이름 implements 인터페이스이름{
//인터페이스에 선언된 추상 메서드의 실체 메서드 선언
}

인터페이스 사용해보기

ReomteControl 인터페이스

public interface RemoteControl {
	//상수
	public int MAX_VOLUME=10;
	public int MIN_VOLUME=0;
	
	//추상 메서드
	public void turnOn();
	public void turnOff();
	public void setVolume(int volume);
	
	
}

RemoteControl인터페이스를 구현한 Televison 클래스

public class Televison implements RemoteControl{
private int volume;

//turnOn( )실체 메서드 구현
public void turnOn() {
	System.out.println("TV를 켭니다.");
}
public int getVolume() {
	return this.volume;
}

//turnOff( )실체 메서드
public void turnOff() {
	System.out.println("TV를 끕니다.");
}

//setVolume( )실체 메서드
public void setVolume(int volume) {
	if(volume>RemoteControl.MAX_VOLUME) {
		this.volume=RemoteControl.MAX_VOLUME;
	}else if(volume<RemoteControl.MIN_VOLUME) {
		this.volume=RemoteControl.MIN_VOLUME;
	}else {
		this.volume=volume;
	}
	System.out.println("현재 TV볼륨"+this.volume);
}

RemoteControl 인터페이스를 구현한 Audio 클래스

public class Audio implements RemoteControl {

	private int volume;
	@Override
	public void turnOn() {
		System.out.println("Audio를 켭니다.");
	}

	@Override
	public void turnOff() {
		System.out.println("Audio를 끕니다.");
	}

	@Override
	public void setVolume(int volume) {
		if(volume>RemoteControl.MAX_VOLUME) {
			this.volume=RemoteControl.MAX_VOLUME;
		}else if(volume<RemoteControl.MIN_VOLUME) {
			this.volume=RemoteControl.MIN_VOLUME;
		}else {
			this.volume=volume;
		}
		System.out.println("현재 Audio볼륨"+this.volume);
	}

새로운 클래스 MyClass 생성 후 상황별로 구현 객체 사용해보기

1. 필드에 때

public class MyClass {
	//필드
	//rc필드가 Televison의 객체를 생성했다하더라도
	//MyClass의 객체를 생성할 때 new연산자로 생성되는 객체에 따라 
	//원하는 객체 생성가능
	RemoteControl rc= new Televison();

위의 코드는 인터페이스가 필드 타입으로 사용되는 경우입니다.

rc라는 변수는 RemoteControl 인터페이스의 타입이며

new 연산자로 Television 객체를 생성했습니다.

1-1. 필드로 선언된 rc 사용하기

public static void main(String[] args) {
			MyClass mc= new MyClass(new Audio());
			mc.rc.turnOff();
			mc.rc.setVolume(5);		
}

위의 코드와 같이 Televison클래스의 실체 메서드를 사용할 수 있습니다.

rc를 필드처럼 사용할 수 있으며 rc는 선언할 때 Televison클래스의 객체를 생성했기 때문에

Televison의 메서드를 사용할 수 있게 됩니다.

출력 결과


2. 클래스의 생성자에 인터페이스가 매개변수 타입으로 생성되었을 경우

public class MyClass {
RemoteControl rc; //RemoteControl 타입의 rc변수 선언
MyClass(RemoteControl rc){
		this.rc=rc;
		rc.setVolume(5);
		rc.turnOff();
	}

위의 코드는 MyClass의 생성자입니다.

매개변수를 RemoteControl타입의 변수로 받아옵니다.

따라서 MyClass를 생성할 때 매개변수로 new연산자를 통해 객체를 생성하면

생상 자안의 메서드는 생성된 객체의 메서드 내용이 실행됩니다.

2-1. Audio클래스의 객체를 MyClass의 생성자를 통해 생성해보기

public static void main(String[] args) {
            MyClass mc= new MyClass(new Audio());
			mc.rc.turnOff();
            }

 

MyClass 생성자의 매개변수로 new Audio( )를 넣으면 

Audio의 객체가 생성됩니다.

따라서 생성자 내부에서

this.rc=rc; rc.setVolume(5); rc.turnOff();

을 작성하였기 때문에 Audio클래스의 메서드를 불러올 수 있게 됩니다.

추가적으로 이제 rc는 Audio객체의 번지를 저장하고 있기 때문에

Audio클래스의 turnoff메서드를 실행할 수 있게 됩니다.

출력 결과


3. 인터페이스 타입의 변수를 지역변수로 사용했을 때

void methodA() {
		//로컬 변수로 선언된 rc
		RemoteControl rc=new Audio();
		rc.turnOff();
		rc.setVolume(5);		
	}

위의 코드는 MyClass 안의 메서드 내부에 

Audio 객체의 번지를 참조하는 RemoteControl 타입 변수인 rc를 선언한 뒤 

turnOff( ) 메서드를

3-1.methodA에 지역변수로 사용된 rc 사용

public static void main(String[] args) {
			MyClass mc= new MyClass( );
			mc.methodA();
}

MyClass의 객체를 생성하여 

methodA( )를 실행하였습니다.

출력 결과를 보시면 알겠지만 methodA내부에 있는 rc는

Audio객체의 번지를 참조하기 때문에 Audio구현 클래스의

turnOff( )와 setVolume( )을 실행하는 것을 확인할 수 있습니다.

출력 결과


4. 인터페이스가 메서드의 매개변수 타입으로 사용될 경우

void methodB(RemoteControl rc) {
		rc.turnOn();
		rc.setVolume(5);
	}

위의 코드는 methodB라는 메서드에 매개변수를 Remotecomtrol rc변수로 받아옵니다.

 따라서 methodb( ) 메서드의 매개 값은

RemoteControl 타입의 변수만 받을 수 있습니다.

메서드를 호출할 때 new 연산자 클래스명( )을 매개 값으로 넣어

객체를 생성할 수 있습니다.

4-1. 인터페이스가 메서드의 매개변수 타입에 매개 값 넣어보기

public static void main(String[] args) {
	MyClass mc= new MyClass();
//	mc.methodA();
	mc.methodB(new Audio());
	mc.methodB(new Televison());
}

MyClass의 객체를 생성한 뒤

mc.methodB( )에 new 연산자를 통해 Audio와 Televison의

구현 객체를 매개 값으로 대입했습니다.

이렇게 매개 값에 구현 객체를 넣는다면

methodB의 실행 내용이 Audio와 Televison의 turnOn( ) 메서드와

setvolume( ) 메서드를 수 있게 됩니다.

출력 결과


 

 

Comments