- 학습 목표 달성 확인 목록
- [] FileReader/FileWriter 클래스의 사용법을 아는가?
FileWriter out = new FileWriter("temp/test2.txt");//해당 폴더에 해당 파일 작성
String str = new String("AB");//입력할 데이터 입력
out.write(str);//데이터 삽입
out.close();//자원해제
System.out.println("데이터 출력 완료!");
FileReader in = new FileReader("temp/test2.txt");//읽어올 해당 파일
// 데코레이터를 붙인다.
// => 버퍼 기능 + 한 줄 읽기 기능
BufferedReader in2 = new BufferedReader(in);
System.out.println(in2.readLine());//한줄읽기
in.close();
- [] CSV 파일 포맷을 이해하는가?
Comma-Seperated Values 의 약자로 몇가지 필드를 쉼표로 구분하는 텍스트 데이터 및 텍스트 파일이다.
확장자는 .csv이다.
- [] MIME 에 대해 설명할 수 있는가?
간단히 말하면 파일 변환을 뜻한다
이메일과 함께 동봉할 파일을 텍스트 문자로 전환해서 이메일 시스템을 통해 전달하기 위해 개발되었기 때문에
이름에 MIME(Multi-purpose Internet Mail Extensions) Internet Mail Extensions이 들어갔다
그렇지만 현재는 웹을 통해서 여러형태의 파일 전달하는데 쓰인다.
- [] BufferedReader/BufferedWriter 데코레이터를 사용할 수 있는가?
FileReader를 기준으로 BufferedReader를 데코레이터로 사용하였다.
읽기,쓰기 속도를 높였다.
왜냐하면 한 공간에 쌓일때까지 담았다가 한번에 데이터를 전송하기 때문이다.
FileReader in = new FileReader("temp/test2.txt");//읽어올 해당 파일
// 데코레이터를 붙인다.
// => 버퍼 기능 + 한 줄 읽기 기능
BufferedReader in2 = new BufferedReader(in);
System.out.println(in2.readLine());//한줄읽기
in.close();
- [] GRASP의 Information Expert 패턴을 이해하는가?
역할을 수행할 수 있는 정보를 가지고 있는 객체에 역할을 부여한다
보통 데이터는 비공개로 감추고 메서드를 통해 데이터를 노출하는 방식을 취한다.
- [] GoF 의 Factory Method 패턴을 구현할 수 있는가?
CSV 형식의 문자열을 객체로 변환하는 것을 인터페이스를 이용해서 규칙으로 정의한다
이렇게 인터페이스로 규칙을 정의하면 CVS 문자열을 객체로 바꿀 때 일관성 있게 코딩할수 있으며
제네릭으로 인해 별도의 형변환을 하지 않아도 된다.
public interface ObjectFactory<T> {
T create(String csvStr);
}
// 다음과 같이 인스턴스를 생성해주는 메서드를
// "factory method"라 부른다.
// 팩토리 메서드 패턴
// - 인스턴스 생성 과정이 복잡할 때
// 인스턴스 생성을 대신 해주는 메서드를 만들어
// 그 메서드를 통해 객체를 생성하는 프로그래밍 방식이다.
public static Board valueOfCsv(String csv) {
String[] fields = csv.split(","); // 번호,제목,내용,작성자,등록일,조회수
Board b = new Board();
b.setNo(Integer.parseInt(fields[0]));
b.setTitle(fields[1]);
b.setContent(fields[2]);
b.setWriter(fields[3]);
b.setRegisteredDate(Date.valueOf(fields[4]));
b.setViewCount(Integer.parseInt(fields[5]));
return b;
}
- [] 인터페이스의 용법을 아는가?
객체의 사용 규칙을 정의 하는 문법이다.
즉 객체에 대해 메서드 호출 규칙을 정의한다.
- [] *functional interface*를 아는가?
함수형 인터페이스호 1개의 추상 메소드를 갖고 있는 인터페이스를 말한다.
interface Factory {
Object create();
}
static class Car {
}
public static void main(String[] args) {
//1.로컬 클래스로 인터페이스 구현체를 만든다
class CarFactory implements Factory {
@Override
public Object create() {//메서드 구현
return new Car();
}
}
//2.익명 클래스로 인터페이스 구현제를 만든다
Factory f2 = new Factory() {//별도의 클래스 없이 인터페이스로 만들수 있다
@Override
public Object create() {
return new Car();
}
};//세미콜론 잊지말것!
//3.람다로 인터페이스 구현체를 만든다
Factory f33 = () -> new Car();
//4.기존에 존재하는 메서드로 인터페이스 구현체를 만든다
Factory f4 = Exam0810::createCar;//메서드
//5.기존 클래스의 생성자로 인터페이스 구현체를 만든다
Factory f5 = Car::new;//Car클래스의 생성자
}
public static Car createCar() {
return new Car();
}
- [] 메서드 레퍼런스의 용법을 아는가?
상단 참조
- [] 클래스의 스태틱 메서드를 functional interface의 구현체로 사용할 수 있는가?
상단 참조
- [] 클래스의 생성자를 메서드 functional interface의 구현체로 사용할 수 있는가?
상단 참조
- [] 제네릭 문법을 활용할 수 있는가?
static <T> void loadObjects(File file, List<T> list, ObjectFactory<T> objFactory)
T에는 여러가지의 객체를 넣을수 있으며
T자리에 String과 같이 따로 선언을 하면 해당 객체만 데이터를 다룰수 있어
컴파일때 필터링하지 못하는것을 잡아낼수있다.