본문 바로가기
Computer Science/JAVA

[JAVA] 인터페이스란? (+서점 구현하기)

by 그적 2020. 10. 6.

인터페이스란?
: 변수 선언에 사용할 수 있는 타입(기본 타입/클래스/인터페이스/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);
	}
}

 

Appendix.java
0.00MB
Book.java
0.00MB
book4.txt
0.00MB

 

BookStore.java
0.00MB
Ebook.java
0.00MB
Manageable.java
0.00MB
Pen.java
0.00MB
Tissue.java
0.00MB

 

'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

댓글