일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 클래스
- 웹개발
- select
- DML
- Git
- 프로그래머스 sql 고득점 kit
- SQL
- github
- sql문
- 프론트엔드
- 스프링
- 데이터 조회
- select문
- 예외처리
- where
- html
- 백엔드
- 개발자
- 프로그래머스 SQL
- StringBuilder
- 정보처리기사필기요약
- 자바
- mybatis
- String클래스
- scanner
- 형변환
- 리눅스
- 메서드
- 자바스크립트
- order by
- BufferedReader
- 알고리즘
- 프로그래밍
- JavaScript
- MySQL
- 백준
- 입출력
- Linux
- 정보처리기사
- Java
- Today
- Total
ToBe끝판왕
[ JAVA ] 인터페이스( Interface ) 본문
인터페이스
• 자식클래스가 여러 부모 클래스를 상속받을 수 있다면, 다양한 동작을 수행할 수 있다는 장점을 가지게 된다.
But, 클래스를 이용하여 다중 상속을 할 경우, 메서드 출처의 모호성 등 여러가지 문제가 발생할 수 있어
자바에서는 클래스를 통한 다중 상속은 지원하지 않는다.
• 하지만, 다중 상속의 이점을 버릴 수는 없기에, 자바에서는 인터페이스라는 것을 통해 다중상속을 지원하고 있다.
• 인터페이스( Interface )란 다른 클래스를 작성할 때, 기본이 되는 틀을 제공, 다른 클래스 사이의
중간 매개 역할까지 담당하는 일종의 추상클래스 이다.
• 인터페이스( Interface ) 는 오로지 추상 메서드와 상수만을 포함할 수 있다.
( 추상클래스는 추상메서드 / 생성자 / 필드 / 일반메서드 포함 가능 )
• 인터페이스를 구현하는 구현 클래스로부터 생성된 객체들의 기능들을 코드의 수정없이 간편하게 사용하기 위함이다.
▶ 인터페이스의 선언
• 인터페이스 선언
접근제어자 interface 인터페이스 이름 {
// 상수
public static final 타입 상수이름 = 값;
...
// 추상 메서드
public abstract 메서드이름( 매개변수 목록 );
...
}
※ 인터페이스 선언시, 접근제어자와 함께 interface 키워드를 사용한다.
※ 인터페이스의 모든 필드는 public static final 이어야 하며, 모든 메서드는
public abstract 이어야 한다. ( 모든 인터페이스 공통 적용 )
※ 인터페이스는 객체로 생성할 수 없기 때문에 생성자를 가질 수 없다.
• 예시( 상수 필드 선언 )
• 인터페이스 상수 필드 선언
public interface RemoteControl {
public int MAX_VOLUME = 10;
public int MIN_VOLUME = 0;
}
※ 실행 시, 데이터를 저장할 수 있는 인스턴스 or 정적 필드 선언 불가능
but, 상수는 선언 가능
※ 상수는 public static final 로 선언하지만, 이를 생략해도 자동적으로 인터페이스
내에 붙게 된다.
• 예시( 추상 메서드 선언 )
• 인터페이스 추상 메서드 선언
public interface RemoteControl {
// 상수 선언
public int MAX_VOLUME = 10;
public int MIN_VOLUME = 0;
// 추상 메서드
public void turnOn();
public void turnOff();
public void setVolume( int volume );
}
※ 추상메서드 선언은 리턴타입 / 메서드 이름 / 매개변수만 기술
( 중괄호 필요 X )
※ 추상 메서드 모두 public abstract의 특성 갖기 때문에, 생략해도
컴파일 과정에서 자동으로 붙는다.
▶ 인터페이스의 구현
• 개발 코드가 인터페이스 메서드를 호출하면, 인터페이스는 객체의 메서드를 호출
• 객체는 인터페이스에서 정의된 추상메서드와 동일한 메서드 이름 / 매개타입 / 리턴타입을 가진 실체 메서드를
가지고 있어야 한다.
• 이러한 객체를 인터페이스의 구현객체( Implement ) 라고 하며, 구현객체를 생성하는 클래스를 구현클래스라고 한다.
• 구현클래스
• 구현 클래스 선언
public class 구현클래스 이름 implements 인터페이스 이름 {
// 인터페이스에 선언된 추상 메서드의 실체 메서드 선언
}
※ 인터페이스의 모든 메서드는 기본적으로 public 접근 제한을 가지기 때문에
public 보다 더 낮은 접근제한으로는 작성 X
• 예시
• 인터페이스 선언
public interface RemoteControl {
// 상수 선언
public int MAX_VOLUME = 10;
public int MIN_VOLUME = 0;
// 추상 메서드
public void turnOn();
public void turnOff();
public void setVolume( int volume );
}
• 구현 클래스 1
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 = ReomoteControl.MAX_VOLUME;
} else if( volume < RemoteControl.MIN_VOLUME ) {
this.volume = RemoteControl.MIN_VOLUME;
} else {
this.volume = volume;
}
System.out.println( "현재 TV 볼륨 : " + this.volume );
}
}
• 구현 클래스 2
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 = ReomoteControl.MAX_VOLUME;
} else if( volume < RemoteControl.MIN_VOLUME ) {
this.volume = RemoteControl.MIN_VOLUME;
} else {
this.volume = volume;
}
System.out.println( "현재 Audio 볼륨 : " + this.volume );
}
}
• 실행 클래스
public class RemoteContorlExample {
public static void main( String[] args ) {
RemoteControl rc;
rc = new Television();
rc = new Audio();
}
}
※ 구현클래스가 작성되면, new 연산자로 구현클래스의 객체 생성 가능
※ 인터페이스 변수는 참조타입이기 때문에, 구현 객체가 대입될 경우
객체의 번지를 저장한다.
▶ 다중 인터페이스 구현 클래스
• 인터페이스 A와 인터페이스 B
- 객체의 메서드를 호출할 수 있으려면, 객체는 이 두 인터페이스를 모두 구현해야한다.
- 다중 인터페이스를 구현할 경우, 구현 클래스는 모든 인터페이스의 추상메서드에 대해 실체 메서드를 작성해야 한다.
• 예시
• 구현클래스 작성
public class 구현클래스이름 implements 인터페이스A, 인터페이스B {
// 인터페이스 A에 선언된 추상메서드의 실체메서드 선언
// 인터페이스 B에 선언된 추상메서드의 실체메서드 선언
}
• 새로운 인터페이스 정의
public interface Searchable {
void search( String url );
}
• 다중 인터페이스 구현하는 구현클래스 작성
public class SmartTelevision implements RemoteControl, Searchable {
// 필드
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_VOULUME ) {
this.volume = RemoteControl.MIN_VOLUME;
} else {
this.volume = volume;
}
System.out.println( "현재 TV 볼륨: " + this.volume );
}
@Override
public void search( String url ) {
System.out.println( url + " 을 검색합니다." );
}
}
• 구현 객체 인터페이스 변수에 대입
public class SmartTelevisionExample {
public static void main( String[] args ) {
SmartTelevision tv = new SmartTelevision();
RemoteControl rc = tv;
Searchable searchable = tv;
}
}
▶ 인터페이스의 사용
• 클래스를 선언할 때, 인터페이스는 ( 필드, 생성자 ) 또는 ( 메서드의 매개변수, 생성자 ) 또는 ( 메서드의 로컬변수 ) 로
선언될 수 있다.
1) 인터페이스가 필드 타입으로 사용될 경우, 필드에 구현 객체를 대입할 수 있다.
2) 인터페이스가 생성자의 매개변수 타입으로 사용될 경우, new 연산자로 객체를 생성할 때 구현 객체를 생성자의
매개값으로 대입 할 수 있다.
3) 인터페이스가 로컬 변수 타입으로 사용될 경우, 변수에 구현 객체를 대입할 수 있다.
4) 인터페이스가 메서드의 매개변수 타입으로 사용될 경우, 메서드 호출 시 구현 객체를 매개값으로 대입할 수 있다.
• 예제1
public class MyClass {
// 필드1번
RemoteControl rc = new Television();
// 생성자 2번
MyClass( RemoteControl rc ) {
this.rc = rc;
}
// 메서드
void methodA() {
// 로컬변수 3번
RemoteControl rc = new Audio();
}
// 메서드의 매개변수 타입 4번
void methodB( RemoteControl rc ) {
}
}
• 필드로 선언된 rc 사용 -- 1번
MyClass myclass = new MyClass();
myclass.rc.turnOn() // Television의 turnOn() 실행
myclass.rc.setVolume(5); // Television의 setVolume(5) 실행
• 생성자의 매개변수 타입 선언 rc 사용 -- 2번
MyClass( RemoteControl rc ) {
this.rc = rc;
rc.turnOn();
rc.setvolume(5);
}
• 로컬변수로 선언된 rc 사용 -- 3번
void methodA() {
RemoteControl rc = new Audio();
rc.turnOn(); // Audio의 turnOn() 실행
rc.setvolume(5); // Audio의 setVolume(5) 실행
}
• 메서드의 매개변수 타입 선언 rc 사용 -- 4번
void methodB( RemoteControl rc ) {
rc.turnOn()
rc.setVolume(5);
}
• 예제2
• 실제 사용 예시
public class MyClass {
// 필드
RemoteControl rc = new Television();
// 생성자
MyClass() {}
MyClass( RemoteControl rc ) {
this.rc = rc;
rc.turnOn();
rc.setVolume(5);
}
// 메서드
void methodA() {
RemoteControl rc = new Audio();
rc.turnOn();
rc.setVolume(5);
}
void methodB( RemoteControl rc ) {
rc.turnOn();
rc.setVolume(5);
}
}
• 실행 클래스
public class myClassExample {
public static void main( String[] args ) {
System.out.println( "1번)----------------- );
MyClass my1 = new MyClass();
my1.rc.turnOn();
my1.rc.setVolume(5);
System.out.println( "2번)----------------- );
myClass my2 = new MyClass( new Audio() );
System.out.println( "3번)----------------- );
MyClass my3 = new MyClass();
my3.methodA();
System.out.println( "4번)----------------- );
MyClass my4 = new myClass();
my4.methodB( new Television() );
}
}
• 출력결과
1번)-------------------
TV를 켭니다.
현재 TV 볼륨 : 5
2번)-------------------
Audio를 켭니다.
현재 Audio 볼륨 : 5
3번)-------------------
Audio를 켭니다.
현재 Audio 볼륨 : 5
4번)-------------------
TV를 켭니다.
현재 TV 볼륨 : 5
'■ 프로그래밍 SKILLS > JAVA' 카테고리의 다른 글
[ JAVA ] java.lang 패키지( String 클래스 / StringBuffer 클래스 / Math 클래스 / Wrapper 클래스 / System 클래스 ) (0) | 2022.05.25 |
---|---|
[ JAVA ] java.lang 패키지( Object 클래스 , String 클래스 ) (0) | 2022.05.25 |
[ JAVA ] 추상클래스 (0) | 2022.05.24 |
[ JAVA ] 타입변환과 다형성 (0) | 2022.05.23 |
[ JAVA ] 상속 (0) | 2022.05.23 |