티스토리 뷰
반응형
1. 인터페이스
- 인터페이스란 서로 다른 하드웨어 장치들이 상호 데이터를 주고받을 수 있는 규격을 의미한다.
예를들어 전원과 플러그라고 생각해보면, 다양한 회사들에서 규격(220v 인터페이스)에 맞추어 제품(220v 플러그)을 만들고 이 규격에 맞으면 언제나 연결이 가능하다. 하지만 규격이 맞지 않는 제품은 연결이 불가능하다. - 이러한 인터페이스 개념은 sw에서도 적용되며 서로 인터페이스가 맞는 모듈을 조립하듯이 응용프로그램을 작성할 수 있다.
인터페이스는 왜 필요할까?
class PoketMon{
void cry(Pika doll) { // 피카츄가 오면 피카츄가 나온다
System.out.println("피카츄!");
}
void cry(Rai doll) { // 라이츄가 오면 라이츄가 나온다
System.out.println("라이츄!");
}
}
class Pika{
}
class Rai{
}
public class ex {
public static void main(String[] args) {
PoketMon mon = new PoketMon();
Pika pika = new Pika();
Rai rai = new Rai();
mon.cry(pika); // cry pika 출력
mon.cry(rai); // cry Rai 출력
}
}
결과
______________
피카츄!
라이츄!
- 만약 여기서 다양한 포켓몬 인형 종류가 추가된다면 매번 getDoll메소드를 추가해야한다. 매번 이렇게 추가하기 어려우니 이를 위해서 인터페이스의 도움이 필요하다.
2. 인터페이스 구성
- 인터페이스는 interface 키워드를 사용하여 클래스를 선언하듯이 선언한다.
interface poketMon { // 인터페이스 선언
void cry(); // 추상메소드
}
- 인터페이스는 5종류의 멤버로 구성되며 필드(멤버변수)를 만들 수 없다.
- 상수와 추상메소드
- default 메소드
- private 메소드
- static 메소드
- 추상메소드는 public abstract로 정해져 있고 생략가능하며, 다른 접근 지정자는 지정할 수 없다.
- default 메소드의 접근 지정은 public으로 고정되어 있다.
- private메소드는 인터페이스 내에서만 호출 가능하다.
- static메소드의 경우 접근지정이 생략되면 public이며, private으로 지정될 수 있다.
인터페이스는 객체를 생성할 수 없다.
- 인터페이스에 구현되지 않은 추상메소드를 가질 수 있기 때문에 객체를 생성할 수 없다.
new poketMon(); //오류
3. 인터페이스 구현
- 인터페이스 구현은 implements 키워드를 사용하여 인터페이스의 추상메소드를 구현한 클래스를 작성하는 것을 말한다.
class Pika implements poketMon{
@Override
public void cry() {
System.out.println("피카츄");
}
}
- Pika클래스에는 poketMon인터페이스의 모든 추상 메소드를 구현한다.
인터페이스 예제
interface PoketMon {
void cry();
}
class Pika implements PoketMon{
@Override
public void cry() {
System.out.println("피카츄!");
}
}
class Rai implements PoketMon{
// poketMon의 메소드 구현
@Override
public void cry() {
System.out.println("라이츄!");
}
}
public class InterfaceEx01 {
public static void main(String[] args) {
Pika pika = new Pika();
Rai rai = new Rai();
pika.cry();
rai.cry();
}
}
결과
______________
피카츄!
라이츄!
반응형
4. 인터페이스 상속
- 클래스는 인터페이스를 상속받을 수없고, 인터페이스는 인터페이스끼리만 상속이 가능하다.
- 인터페이스 상속은 extends 키워드를 사용한다.
interface fireMon extends PoketMon{ // 상속
void fire();
}
- fireMon인터페이스는 cry(), fire()의 멤버를 가지게 된다
- 자바는 인터페이스의 다중상속을 허용한다.
interface legendaryMon extends PoketMon, electMon { //다중상속
void legendFight();
}
5. 다중 인터페이스 구현
- 클래스는 하나 이상의 인터페이스를 구현할 수 있다.
- 이 경우 콤마로 각 인터페이스를 구분하여 나열하며 각 인터페이스에 선언된 모든 추상 메소드를 구현해야 한다.
interface PoketMon {
void cry();
}
interface electMon{
void elect();
}
interface fireMon extends PoketMon{ //인터페이스 상속
void fire();
}
interface legendaryMon extends PoketMon, electMon { //인터페이스 다중상속
void legendFight();
}
class Pika implements PoketMon{ //인터페이스 구현
@Override
public void cry() {
System.out.println("피카츄!");
}
}
class Rai implements PoketMon, electMon{ //다중인터페이스 구현
// poketMon의 메소드 구현
@Override
public void cry() {
System.out.println("라이츄!");
}
// electMon의 메소드 구현
@Override
public void elect() {
System.out.println("백만볼트!!!!!!!!");
}
}
class Firy implements fireMon{
@Override
public void cry() {
System.out.println("파이리!");
}
@Override
public void fire() {
System.out.println("불꽃발사!!!!!!!");
}
}
class Thunder implements legendaryMon{
@Override
public void cry() {
System.out.println("썬더!");
}
@Override
public void elect() {
System.out.println("전기공격!");
}
@Override
public void legendFight() {
System.out.println("전설의 공격");
}
}
public class InterfaceEx01 {
public static void main(String[] args) {
Pika pika = new Pika();
Rai rai = new Rai();
Firy firy = new Firy();
Thunder thunder = new Thunder();
pika.cry();
rai.cry();
rai.elect();
firy.cry();
firy.fire();
thunder.cry();
thunder.elect();
thunder.legendFight();
}
}
결과
______________
피카츄!
라이츄!
백만볼트!!!!!!!!
파이리!
불꽃발사!!!!!!!
썬더!
전기공격!
전설의 공격
6. 인터페이스와 추상클래스 비교
비교 | 목적 | 구성 |
추상클래스 | - 추상클래스는 자식클래스에서 필요로하는 대부분의 기능을 구현해두고 자식클래스가 상속받아 활용할 수 있도록 함 - 자식 클래스에서 구현할 수밖에 없는 기능만을 추상메소드로 선언하여 자식클래스에서 구현하도록 하는 목적(다형성) |
- 추상메소드와 일반메소드 모두 포함 - 상수, 변수 필드 모두 포함 |
인터페이스 | - 인터페이스는 객체의 기능을 모두 공개한 표준화문서와 같은것 - 인터페이스를 상속받는 클래스의 목적에 따라 인터페이스의 모든 추상메소드를 만들도록 하는 목적(다형성) |
- 멤버변수는 포함하지 않음 - 상수, 추상메소드, 일반메소드, default 메소드, static 메소드 모두 포함 - protected 접근 지정 선언 불가 - 다중상속 지원 |
반응형
'JAVA' 카테고리의 다른 글
[Eclipse] 이클립스 커밋 target 폴더 제외(ignored) (0) | 2022.08.23 |
---|---|
[Java] 추상클래스, 추상메소드 (0) | 2022.04.01 |
[Java] 다형성(polymorphism), 업캐스팅, 다운캐스팅, instanceof연산자 (0) | 2022.03.31 |
[Java] 상속(Inheritance) - (2)super, super(), 오버라이딩 (0) | 2022.03.30 |
[Java] 상속(Inheritance) - (1)상속 개념, 상속 특징 (0) | 2022.03.24 |
댓글
반응형
공지사항