본문 바로가기
자바(Java)

자바 입문하기15 - 인터페이스

by codeyaki 2022. 1. 12.
반응형

해당 강의를 보고 정리한 것입니다.

https://programmers.co.kr/learn/courses/5

 

자바 입문

자바 입문 가장 널리 쓰이는 프로그래밍 언어 Java로 프로그래밍의 기초를 다져보세요. 이 강의의 내용을 책으로 만나고 싶으시면 여기를 눌러 책 정보를 확인하세요. 강의를 다 들었는데, 지금

programmers.co.kr


인터페이스 

: 서로 관계가 없는 물체들이 상호 작용을 하기 위해서 사용하는 장치나 시스템

마치 목차처럼 어떤 기능들이 있는지 쭉 나열하는 것. (추상 클래스!!!)

  • 인터페이스 정의
    - 추상 메서드와 상수를 정의할 수 있다.
    - 객체를 생성 불가능
public interface TV {
	public int MIN_VOLUME= 0;
	public int MAX_VOLUME= 100;
	
	public void turnOn();
	public void turnOff();
	public void changeVolume(int volume);
	public void changeChannel(int channel);
	
}
  • 인터페이스에서 변수를 선언하면 컴파일 시 자동으로 아래와 같이 바뀐다.
public static final int MIN_VOLUME = 0;
public static final int MAX_VOLUME = 100;
  • 인터페이스에서 정의된 메소드는 모두 추상 메서드이다. 컴파일 시 아래와 같이 바뀐다.
public abstract void turnOn();
public abstract void turnOff();
public abstract void changeVolume(int volume);
public abstract void changeChanner(int channel);

 


인터페이스 사용하기

  • 인터페이스는 사용할떄 해당 인터페이스를 구현하는 클래스에서 implements키워드를 이용한다.
  • 이클립스에선 인터페이스에 넣으면 자동으로 클래스가 짜여서 나온다.

public class LedTV implements TV {

	@Override
	public void turnOn() {
		// TODO Auto-generated method stub

	}

	@Override
	public void turnOff() {
		// TODO Auto-generated method stub

	}

	@Override
	public void changeVolume(int volume) {
		// TODO Auto-generated method stub

	}

	@Override
	public void changeChannel(int channel) {
		// TODO Auto-generated method stub

	}

}
  • 클래스 작성
public class LedTV implements TV {

	public void turnOn() {
		System.out.println("켜기");
	}

	public void turnOff() {
		System.out.println("끄기");
	}

	public void changeVolume(int volume) {
		System.out.println(volume + "으로 볼륨변경");
	}

	public void changeChannel(int channel) {
		System.out.println(channel + "으로 채널변경");
	}

}
  • 테스트
public class LedTVExam {
	public static void main(String[] args) {
		TV led = new LedTV();
		led.turnOn();
		led.changeChannel(53);
		led.changeVolume(39);
		led.turnOff();	
	}
}

>>
켜기
53으로 채널변경
39으로 볼륨변경
끄기

  • 참조변수의 타입으로 인터페이스를 사용할 수 있음. 이 경우 인터페이스가 가지고 있는 메서드만 사용할 수 있다.
  • 만약 TV인터페이스를 구현하는 LcdTV를 만들었다면 위의 코드에서 new LedTV부분만 new LcdTV로 변경해도 똑같이 프로그램이 동작할 것이다.
    동일한 인터페이스를 구현한다는 것은 클래스의 사용법이 같다는 것을 의미함.
  • 클래스는 이러한 인터페이스를 여러 개 구현할 수 있다.

인터페이스의 default method

: JAVA 8에서 인터페이스에 대한 정의가 몇 가지 변경되었음.

  • defalut 메서드
  • static 메서드

 

defalut메서드

  • 인터페이스가 defalut 키워드로 선언되면 메서드가 구현될 수 있다. 또한 이를 구현하는 클래스는 default메서드를 오버 라이딩할 수 있다.
public interface Calculator {
	public int plus(int i, int j);
	public int multiple(int i, int j);
	
	default int exec(int i, int j) {
		return i + j;
	}
}
public class MyCalculator implements Calculator {

	public int plus(int i, int j) {
		return i + j;
	}

	public int multiple(int i, int j) {
		return i * j;
	}

}

public class MyCalExam {
	public static void main(String[] args) {
		Calculator cal = new MyCalculator();
		System.out.println(cal.plus(3, 4));
		System.out.println(cal.multiple(5, 2));
		System.out.println(cal.exec(2, 5));
		
	}
}
  • 인터페이스가 변경이 되면, 인터페이스를 구현하는 모든 클래스들이 해당 메소드를 구현해야 하는 문제가 발생.
    이러한 문제를 해결하기 위해서 인터페이스에 기본 메서드를 구현해 놓을 수 있도록 하였다.

static메서드

public interface Calculator {
	public int plus(int i, int j);
	public int multiple(int i, int j);
	
	default int exec(int i, int j) {
		return i + j;
	}
	public static int exec2(int i, int j) {
		return i * j;
	}
}
public class MyCalculator implements Calculator {

	public int plus(int i, int j) {
		return i + j;
	}

	public int multiple(int i, int j) {
		return i * j;
	}

}
public class MyCalExam {
	public static void main(String[] args) {
		Calculator cal = new MyCalculator();
		System.out.println(cal.plus(3, 4));
		System.out.println(cal.multiple(5, 2));
		//default 메서드
		System.out.println(cal.exec(2, 5));
		//static 메서드
		System.out.println(Calculator.exec2(3, 4));
	}
}
  • 인터페이스에 static 메서드를 선언함으로써, 인터페이스를 이용하여 간단한 기능을 가지는 유틸리티 성 인터페이스를 만들 수 있게 됨.
  • static 메서드를 사용할때는 인터페이스명. 메서드명 형식으로 사용해야 함
    cal.exec2(3,4) (x), Calculator.exec2(3,4) (o)
반응형