제곧내
제목이 곧 내용
바로 들어가겠다.
인터페이스 : 서로 다른 장치들이 연결되어서 상호 데이터를 주고받는 규격(규칙)
인터페이스가 서로 다르면 연결이 불가하다
추상 클래스보다 더 추상적인 클래스
인터페이스도 하나의 자료형이라 생각 (참조 변수 선언 가능)
인터페이스 형식은
public interface RemoteControl {
//추상 메소드 정의
public void turnOn(); //전자제품을 켠다.
public void turnOff(); //전자제품을 끈다.
}
구현부({ })가 없다.
인터페이스를 구현하는 형식은
public interface RemoteControl {
// 추상 메소드 정의
public void turnOn(); // 가전 제품을 켠다.
public void turnOff(); // 가전 제품을 끈다.
}
public class Television implements RemoteControl { //implements를 통해 클래스가 인터페이스 구현
boolean onOff = false;
public void turnOn() {
// TV의 전원을 켜기 위한 코드가 들어간다.
onOff = true;
System.out.println("TV가 켜졌음");
}
public void turnOff() {
// TV의 전원을 끄기 위한 코드가 들어간다.
onOff = false;
System.out.println("TV가 꺼졌음");
}
}
public class TelevisionTest {
public static void main(String[] args) {
Television t = new Television();
t.turnOn();
t.turnOff();
}
}
한번 인터페이스를 사용해서 자율 주행 자동차를 만들어보자
[자동차 제조사 SW]
↕
[인터페이스]
void start();
void stop();
int setSpeed(int speed);
int turn(int degree);
↕
[자율 주행 시스템 SW]
[인터페이스]
public class AutoCarTest {
public static void main(String[] args) {
OperateCar obj = new AutoCar();
obj.start();
obj.setSpeed(30);
obj.turn(15);
obj.stop();
}
}
[자동차 제조사 SW]
public class AutoCar implements OperateCar {
public void start() {
System.out.println("자동차가 출발합니다.");
}
public void stop() {
System.out.println("자동차가 정지합니다.");
}
public void setSpeed(int speed) {
System.out.println("자동차가 속도를 " + speed + "km/h로 바꿉니다.");
}
public void turn(int degree) {
System.out.println("자동차가 방향을 " + degree + "도 만큼 바꿉니다.");
}
}
[자율 주행 시스템 SW]
public interface OperateCar {
void start();
void stop();
void setSpeed(int speed);
void turn(int degree);
}
다음은 ActionListener 인터페이스를 사용해서 타이머를 만들어보겠다
어떤 이벤트 처리를 위한 공통 규격이 필요한데
ActionListener 인터페이스는 액션 이벤트 처리를 위한 규격을 정의해준다.
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;
class MyClass implements ActionListener { //ActionListener 인터페이스를 구현한 클래스 생성
public void actionPerformed(ActionEvent event) { //Timer에 의하여 1초에 한번씩 호출
System.out.println("일어나");
}
}
public class CallbackTest {
public static void main(String[] args) {
ActionListener listener = new MyClass(); //상향 형변환
Timer t = new Timer(1000, listener); //actionPerformed()를 호출해달라고 Timer에 등록
t.start();
for (int i = 0; i < 1000; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
}
}
무슨 코드인지 전혀 모르겠지만
이런 코드가 존재한다는 사실만 알고 넘어가겠다
아직 안배운 개념이 너무 많다.
인터페이스가 인터페이스를 상속받는 것도 가능하다.
class --(extends)--> class
class --(implements)--> interface
interface --(extends)--> interface
public interface InterFace2 extends InterFace1 {
public void volumeUp();
public void volumeDown();
}
다중상속이란 하나의 클래스가 여러 개의 부모 클래스를 가지는 것이다.
예를 들면 하늘을 나는 자동차는
비행기의 특성과 자동차의 특성을 모두 가져야 할때 다중 상속이 필요하다.
다중 상속은 애매한 상황을 만들 수 있어 자바에서는 금지되어 있는데
인터페이스를 사용하면 다중 상속의 효과를 낼 수 있다.
class Shape { protected int x, y }
interface Drawable { void draw(); }
public class Rectangle extends Shape implements Drawable {
int width, height;
public void draw() {
System.out.println("Recteangle Draw");
}
}
인터페이스는 상수를 정의할 수 있다.
인터페이스에 정의된 변수는 자동적으로 public static final로 처리한다.
public interface MyConstants {
int NORTH = 1;
int EAST = 2;
int SOUTH = 3;
int WEST = 4;
}
인터페이스에서 정의한 상수를 공유한 예제를 보자.
interface Days {
public static final int SUNDAY = 1, MONDAY = 2, TUESDAY = 3,
WEDNESDAY = 4, THURSDAY = 5, FRIDAY = 6, SATURDAY = 7;
}
public class DayTest implements Days
{
public static void main(String[] args)
{
System.out.println("일요일 : " + SUNDAY);
}
}
디폴트 메소드 : 인터페이스 개발자가 메소드의 디폴트 구현을 제공할 수 있는 기능이다.
예약어 default를 사용한다.
디폴트 메소드가 정의되어 있으면 인터페이스를 구현하는 클래스가
메소드의 몸체를 구현하지 않아도 메소드를 호출할 수 있다.
interface MyInterface {
public void myMethod1(); //보통의 추상메소드
default void myMethod2() { //디폴트 메소드, 메소드의 몸체를 제공
System.out.println("myMethod2()");
}
}
public class DefaultMethodTest implements MyInterface {
public void myMethod1() {
System.out.println("myMethod1()");
}
public static void main(String[] args) {
DefaultMethodTest obj = new DefaultMethodTest();
obj.myMethod1();
obj.myMethod2(); //구현하지 않아도 바로 사용가능
}
}
디폴트 메소드를 사용하니 코드의 양이 확실히 줄었다.
인터페이스에서 디폴트 메소드 외에 정적 메소드도 사용가능하다.
interface MyInterface {
static void print(String msg) {
System.out.println(msg + ": 인터페이스의 정적 메소드 호출");
}
}
public class StaticMethodTest {
public static void main(String[] args) {
MyInterface.print("Java 8");
}
}
드디어 인터페이스의 마지막 개념까지 왔다.
무명클래스 : 클래스 몸체는 정의되지만 이름이 없는 클래스,
클래스를 정의하면서 동시에 객체 생성
한번만 사용가능하다.
new 부모클래스이름()
{
}
무명클래스의 형식이다.
interface RemoteControl {
void turnOn();
void turnOff();
}
public class AnonymousClassTest {
public static void main(String args[]) {
RemoteControl ac = new RemoteControl() { // 무명 클래스 정의
public void turnOn() {
System.out.println("TV turnOn()");
}
public void turnOff() {
System.out.println("TV turnOff()");
}
};
ac.turnOn();
ac.turnOff();
}
}
역시 코드의 수가 많이 줄었다.
이렇게 인터페이스에 대한 정리가 끝났다.
처음 접하는 내용이다 보니 아직 이해가 제대로 되지 않았다.
다음은 인터페이스와 함께 거론되는 람다식과 패키지를 이어서 소개하겠다.
'자바학점을 자바줘 (JAVA)' 카테고리의 다른 글
[코딩테스트] 대소문자 바꿔서 출력하기 (0) | 2023.04.27 |
---|---|
[자바] 람다식, 패키지 (0) | 2022.04.24 |
[자바] 상속 (0) | 2022.04.21 |
[자바] 클래스와 메소드 심화 개념 (1) | 2022.04.21 |
[자바] String 클래스 개념 (0) | 2022.04.07 |