반응형
인터페이스
- 두 컴포넌트 간의 중간 통신망
- 개발 코드(Main)와 객체가 서로 통신하는 접점
*개발자가 기능을 정의하고 있는 곳이 개발코드 입장이다 - 협업을 할때 인터페이스를 활용하여 메소드 정형화
- 인터페이스는 어떤 구현객체가 대입되어 있느냐에 따라 같은 추상메소드 호출이지만 결과가 달라지는 다형성을 구현하게된다
- 인터페이스 타입 변수에는 인터페이스의 구현 클래스로 생성된 구현 객체만 대입 가능
- 상속에서도 부모에 모든 자식 타입이 대입되는 원리를 사용하여 다형성을 구현할 수 있으나, 잘 사용되어 지지는 않는다.
- 개발소스와 객체간의 결합을 끊어 중간 매개체 역할을 하여 정형화 되어 있는 메소드를 제공함으로써 개발소스에서는 호출해야하는 메소드만 알고 있다면 대입된 객체가 누구냐에 따라 실행 결과가 다양해 질수 있는 기능을 의미
- 인터페이스는 외부에서 호출이 목적이기 때문에 접근제한자를 생략할 경우 기본 접근제한자는 public 이다.
- 인터페이스는 static 블럭을 사용할 수 없음(클래스가 아니기 때문에)
- 인터페이스를 사용하는 목적은 정형화된 메소드 선언부를 제공하여 하위 구현 클래스를 빠르고 가독성 높게 정의하기 위함이기 때문에, 인터페이스에서 추상 메소드를 선언할 때 abstract 키워드를 생략할 수 있다.
- 디폴트 메소드는 인터페이스를 사용하는 모든 객체(클래스)의 실행문까지 일치하는 공통기능을 정의할 때 사용합니다
메소드 선언부에 default 키워드 명시!! - 인터페이스의 디폴트 메소드는 모든 구현객체가 갖는 공통기능이다. 구현 클래스에 정의하지 않아도 모든 구현객체들이 호출할 수 있다. 이때, 디폴트 메소드는 각 구현 클래스에서 재정의(오버라이딩)할 수 있다
- 디폴트 메소드는 인터페이스가 아닌 구현 객체(클래스)로 사용
- 정적 메소드는 인터페이스의 고유 기능을 정의할 때 사용
리모콘의 배터리를 바꾼다와 같은 인터페이스의 기능을 정의할 때 사용 - 정적 메소드 호출시에는 인터페이스의 이름으로 호출
- 구현클래스는 인터페이스의 추상메소드들을 구현하고 있는 클래스를 말하며 구현 클래스로 생성된 객체를 구현 객체라고 부른다. 해당 인터페이스의 구현 객체만 인터페이스를 통해 호출될 수 있다
<인터페이스 구성요소>
- 상수 필드 : 변하지 않는 절대 하나의 값
- 추상 메소드
- 디폴트 메소드 : 구현 객체들의 공통 기능을 인터페이스에 정의하는 방법
- 정적 메소드 : 인터페이스 자체의 기능을 정의하는 방법
1) BoardInterface, 자유게시판, 공지게시판
public interface BoardInterface {
static final int MIN_HIT = 0;
/* public abstract */void modify(int bno,String title); //추상메소드
/* public abstract */void insert();
/* public abstract */void view();
/* public abstract */void delete();
/*public*/default void hit() {
System.out.println("조회수가 올라갑니다");
}
/*public*/static void method() {
System.out.println("인터페이스의 기능!");
}
}
public class FreeBoard implements BoardInterface {
@Override
public void modify(int bno, String title) {
System.out.println("---------------------------------");
System.out.println(bno + "번호인 " + title + "인 자유게시글을 수정합니다");
}
@Override
public void insert() {
System.out.println("---------------------------------");
System.out.println("자유게시글 등록입니다.");
}
@Override
public void view() {
System.out.println("---------------------------------");
System.out.println("자유게시글 조회입니다.");
}
@Override
public void delete() {
System.out.println("---------------------------------");
System.out.println("자유게시글 삭제입니다.");
}
@Override
public void hit() {
System.out.println("자유게시글 조회수 증가!");
}
}
public class NoticeBoard implements BoardInterface {
@Override
public void modify(int bno, String title) {
System.out.println("--------------------");
System.out.println("글번호:" + bno);
System.out.println("글제목:" + title);
System.out.println("공지사항 수정합니다.");
}
@Override
public void insert() {
System.out.println("--------------------");
System.out.println("공지사항 등록합니다.");
}
@Override
public void view() {
System.out.println("--------------------");
System.out.println("공지사항 조회합니다.");
}
@Override
public void delete() {
System.out.println("--------------------");
System.out.println("공지사항 삭제합니다.");
}
}
public class Main01 {
public static void main(String[] args) {
BoardInterface boardInterface; //구현객체를 담을 인터페이스를 선언
FreeBoard fboard = new FreeBoard(); //구현객체
NoticeBoard nboard = new NoticeBoard(); //구현객체
boardInterface = fboard;
boardInterface.modify(10, "반갑습니다");
boardInterface = nboard;
boardInterface.modify(10, "반갑습니다");
boardInterface.hit();
fboard.hit();
nboard.hit();
BoardInterface.method();
}
}
실행결과)
--------------------------------- 10번호인 반갑습니다인 자유게시글을 수정합니다 -------------------- 글번호:10 글제목:반갑습니다 공지사항 수정합니다. 조회수가 올라갑니다 자유게시글 조회수 증가! 조회수가 올라갑니다 인터페이스의 기능! |
2) Remocon, TV
public interface Remocon {
public void powerOn();
}
public class TV implements Remocon {
@Override
public void powerOn() {
System.out.println("TV를 켰습니다.");
}
public static void main(String[] args) {
Remocon r = new TV();
r.powerOn();
}
}
3) Soundable, Cat, Dog 울음소리
public interface Soundable {
public String sound();
}
public class Cat implements Soundable {
@Override
public String sound() {
return "야옹";
}
}
public class Dog implements Soundable {
@Override
public String sound() {
return "멍멍";
}
}
public class SoundExample {
/* 인터페이스를 통한 매개변수의 다형성 구현 예제 */
public static void printSound(Soundable soundable) {
System.out.println(soundable.sound());
}
public static void main(String[] args) {
printSound(new Cat());
printSound(new Dog());
}
}
실행결과)
야옹 멍멍 |
4) DataAccessObject, OracleDao, MySqlDao
public interface DataAccessObject {
void select();
void insert();
void update();
void delete();
}
public class OracleDao implements DataAccessObject {
@Override
public void select() {
System.out.println("Oracle DB에서 검색");
}
@Override
public void insert() {
System.out.println("Oracle DB에서 삽입");
}
@Override
public void update() {
System.out.println("Oracle DB에서 수정");
}
@Override
public void delete() {
System.out.println("Oracle DB에서 삭제");
}
}
public class MySqlDao implements DataAccessObject {
@Override
public void select() {
System.out.println("MySql DB에서 검색");
}
@Override
public void insert() {
System.out.println("MySql DB에서 삽입");
}
@Override
public void update() {
System.out.println("MySql DB에서 수정");
}
@Override
public void delete() {
System.out.println("MySql DB에서 삭제");
}
}
public class DaoExample {
public static void dbWork(DataAccessObject dao) {
dao.select();
dao.insert();
dao.update();
dao.delete();
}
public static void main(String[] args) {
dbWork(new OracleDao());
dbWork(new MySqlDao());
}
}
실행결과)
Oracle DB에서 검색 Oracle DB에서 삽입 Oracle DB에서 수정 Oracle DB에서 삭제 MySql DB에서 검색 MySql DB에서 삽입 MySql DB에서 수정 MySql DB에서 삭제 |
5) RemoteControl, Television, Audio
public interface RemoteControl {
//상수 필드
int MAX_VOLUME = 10;
int MIN_VOLUME = 0;
//추상메소드
void turnOn();
void turnOff();
void setVolume(int volume);
//디폴트 메소드
default void setMute(boolean mute) {
if(mute) {
System.out.println("무음처리합니다");
setVolume(MIN_VOLUME);
}else {
System.out.println("무음 해제합니다");
}
}
//정적 메소드
static void changeBattery() {
System.out.println("리모트 건전지를 교환합니다");
}
}
public class Television implements RemoteControl {
private int volume;
@Override
public void turnOn() {
System.out.println("TV를 켭니다");
}
@Override
public void turnOff() {
System.out.println("TV를 끕니다");
}
@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("현재 TV 볼륨 : " + volume);
}
}
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 볼륨 : " + volume);
}
}
public class RemoteControlExample {
public static void main(String[] args) {
//인터페이스 변수 선언
RemoteControl rc;
//Television 객체를 생성하고 인터페이스 변수에 대입
rc = new Television();
rc.turnOn();
rc.setVolume(5);
//디폴트 메소드 호출
rc.setMute(true);
rc.setMute(false);
System.out.println();
//Audio 객체를 생성하고 인터페이스 변수에 대입
rc = new Audio();
rc.turnOn();
rc.setVolume(5);
//디폴트 메소드 호출
rc.setMute(true);
rc.setMute(false);
System.out.println();
//정적 메소드 호출
RemoteControl.changeBattery();
}
}
실행결과)
TV를 켭니다 현재 TV 볼륨 : 5 무음처리합니다 현재 TV 볼륨 : 0 무음 해제합니다 Audio를 켭니다 현재 Audio 볼륨 : 5 무음처리합니다 현재 Audio 볼륨 : 0 무음 해제합니다 리모트 건전지를 교환합니다 |
반응형
'Java' 카테고리의 다른 글
[Java] 예외처리 (0) | 2024.08.08 |
---|---|
[Java] 익명 객체, 다중인터페이스 (0) | 2024.08.07 |
[Java] 상속, 메소드 오버라이딩, 추상클래스 (0) | 2024.08.03 |
[Java] 인스턴스 멤버, 정적 멤버, 정적 필드, 정적 메소드, 상수, 패키지, 접근제한자, 싱글톤 (0) | 2024.08.01 |
[Java] class, 필드, 생성자, 메소드, 오버로딩 (0) | 2024.07.31 |