인터페이스란?
: 변수 선언에 사용할 수 있는 타입(기본 타입/클래스/인터페이스/enum)
클래스와 달리 메서드 선언만 가짐
주로 인터페이스는 ~able(~할 수 있는)으로 끝난다.
인터페이스 역할
: 클래스들의 표준과 같은 역할
표준만 정하면 실제 클래스는 그에 맞게 끼워 넣음
서점에서 판매하는 객체 클래스가 되려면?
1) 인터페이스를 구현
2) ArrayList에 저장
3) 객체마다 read()/print()/matches() 메서드가 중복되므로 interface에 넣어준다.
// Manageable 인터페이스
interface Manageable{
public void read(Scanner s);
public void print();
public boolean matches(String kwd);
}
// BookStore 클래스
class Bookstore{
ArrayList<Manageable> sellList = new ArrayList<>();
void print(){
for(Manageable m: sellList)
m.print();
}
}
위의 코드에서 Manageable m 참조 변수의 다형성을 볼 수 있다.
1) 구현하거나 상속한 모든 클래스 객체를 가리킬 수 있음.
2) Book을 Manageable로 구현하면, m은 Book, Ebook, AppendixBook을 모두 가리킬 수 있음.
3) 전혀 다른 클래스가 Manageable을 구현하면, 역시 m이 가리킬 수 있다.
Book 클래스의 Manageable 인터페이스 기능 추가하기
- Book 클래스에 implements Manageable을 추가
- read, print, matches 메서드를 public으로 바꿈
- 메서드 선언부 앞에 @Override를 추가해줌
package hw5_book;
import java.util.ArrayList;
import java.util.Scanner;
public class Book implements Manageable {
..
@Override
public void read(Scanner s) {
...
}
void printBookType() {
System.out.print("[일반책]");
}
@Override
public void print() {
...
}
@Override
public boolean matches(String kwd) {
...
}
}
서점에서 Book, Ebook, Appendixbook을 구매할 수 있다.
그럼 책뿐만 아니라 문구류들도 서점에서 판매가 가능하도록 하려면?
1) Manageable 인터페이스를 implement 한다.
2) 우리가 각각의 객체들을 type에 따라 생성해줘야 하기 때문에 Bookstore 클래스의 변경 필수
// Pen 클래스
package hw5_book;
import java.util.Scanner;
public class Pen implements Manageable {
String name;
float thickSize;
int price;
@Override
public void read(Scanner s) {
// TODO Auto-generated method stub
name = s.next();
thickSize = s.nextFloat();
price =s.nextInt();
}
@Override
public void print() {
// TODO Auto-generated method stub
System.out.printf("[티슈]%s %5.2fmm (%d원)\n", name,thickSize,price);
}
@Override
public boolean matches(String kwd) {
// TODO Auto-generated method stub
if(name.contains(kwd)) return true;
if(kwd.contentEquals(""+thickSize)) return true;
return false;
}
}
// Tissue 클래스
package hw5_book;
import java.util.Scanner;
public class Tissue implements Manageable{
String name;
int nSheet;
int price;
@Override
public void read(Scanner s) {
// TODO Auto-generated method stub
name = s.next();
nSheet = s.nextInt();
price = s.nextInt();
}
@Override
public void print() {
// TODO Auto-generated method stub
System.out.printf("[펜]%s %d장 (%d원)\n", name, nSheet, price);
}
@Override
public boolean matches(String kwd) {
// TODO Auto-generated method stub
if(name.contains(kwd)) return true;
if(kwd.contentEquals(""+nSheet)) return true;
return false;
}
}
// Bookstore 클래스의 readAll() 메소드
class Bookstore{
ArrayList<Manageable> sellList = new ArrayList<>();
void readAll(String filename){
Scanner filein = openFile(filename);
Manageable item = null;
while(filein.hasNext()){
int type = filein.nextInt();
switch(type){
case 1: item = new Book(); break;
case 2: item = new Ebook(); break;
case 3: item = new AppendixBook(); break;
case 4: item = new Pen(); break;
case 5: item = new Tissue(); break;
default: break;
}
item.read(filein);
sellList.add(item);
}
}
'Computer Science > JAVA' 카테고리의 다른 글
[JAVA] 제너릭이란? (0) | 2020.11.03 |
---|---|
[JAVA] 추상화란? (0) | 2020.10.23 |
[JAVA] 상속이란? (+ 서점 구현하기) (0) | 2020.10.06 |
[JAVA] 변수와 메서드 (0) | 2020.09.11 |
[JAVA] 자바 기본 (0) | 2020.09.02 |
댓글