-
KOSTA 교육 14일차 (ArrayList, Sort, Comparable, Comparator, 입출력, Stream)Review 2020. 6. 21. 17:14
18.11.15(목)
배운 내용
- ArrayList Sort
- Stream
1. ArrayList Sort(배열 정렬)
배열 정렬은?
배열 내의 포함된 요소들을 정렬시키는 것이다.
- 대부분은 데이터베이스에서 정렬된 데이터를 조회하여 ArrayList에 담아서 사용하므로 ArrayList 자체를 정렬할 일이 잘 없지만 ]가끔씩 리스트를 직접 정렬해야 할일이 생긴다.
- 정렬하는데에는 Collections.sort(); 메소드를 사용한다.
- Comparable : 최초 정렬기준 된 내용을 작성한다. compareTo()를 오버라이딩한다.
- Comparator : 정렬된 내용을 변경하기 위해 사용한다. compare()을 오버라이딩한다.
뽑은 로또의 숫자를 내림차순으로 정렬하는 실습을 해보자
- Main클래스에서 랜덤 값을 출력하기 위하여 Random 객체를 생성한다.
- Set으로 중복을 방지하기 위하여 배열을 생성하고 for문을 이용하여 6개를 출력, 그리고 add로 값을 추가한 다음 출력해준다.
- 정렬이 되어있는 기준을 변경해야하기 때문에 implements Comparator<Integer> 를 클래스에 추가한다.
- 오버라이딩을 하여 compare의 o1, o2 값을 비교하여 정렬하는데 o1이 o2보다 작다면 양수로 자리를 바꾸라고 리턴하고
o2이 o1보다 크다면 음수로 자리를 바꾸지 말라고 리턴시킨다. - 결과를 출력시키면 배열이 내림차순으로 정렬 될 것이다.
추가 예제로 심화학습을 해보자
- 먼저 최초정렬을 위하여 Comparable<Person> 을 implements하고 Person을 정렬해야하기 때문에 타입은 Person으로 둔다.
- 변수, 디폴트, 생성자, toString, getter setter를 선언한다.
- 여기서 정렬하기 위해 오버라이딩을 하는데 compareTo메소드로 선언한다. 파라미터 값은 Person p 이다.
- 나이를 기준으로 오름차순 정렬하려면 기준이 되는 age와 비교할 p.age를 비교하여 p.age가 크다면 음수, 작다면 양수를 리턴하여 정렬해준다.
- 이 부분에선 나이 순이 아닌 이름 순으로 정렬할 것이다.
- 정석은 또 하나의 클래스를 생성하여 implements comparator 해야하지만 더 쉬운 익명으로 생성이 가능하다.
- Collections.sort를 사용하여 현재 배열, 익명을 통하여 오버라이딩 한다.
- 이때 compare의 파라미터값은 총 2개이다.
- o1이 크면 음수, o2가 크면 양수의 결과가 나오므로 o1.getName과 o2.getName을 비교하여 양수가 나오면 바꾸고 음수면 바꾸지 않게 출력한다.
- 출력하면 이름순으로 출력된다.
2. Stream(스트림)
Stream(스트림)은?
한 지점에서 데이터를 읽어 들이고, 목표 지점에 기록하여 출력하는것처럼 데이터를 받고 출력하는 작업을 도와주는 역할이다.
- 입력스트림 : 스트림에 존재하는 데이터를 읽는다.
- 출력스트림 : 스트림에 존재하는 데이터를 보낸다.
- 입력문자스트림에는 Reader, 출력문자스트림에는 writer 가 있다.
- 입력바이트스트림에는 InputStream, 출력바이트스트림에는 OutputStream이 있다.
예제를 통하여 이해해보자
- FileReader는 입력문자스트림으로서 파일을 입력받기 위하여 사용한다.
- 주의할 점은 스트림은 생성과 선언을 동시에 하지 못하기 때문에 선언을 먼저 한다.
- 반복문 없이 출력하려면 배열을 사용하는데 while문 없이 바로 try, catch, finally문을 사용하여 출력한다.
- while문을 사용할 경우엔 data를 변수로 하여 선언한다. data는 더 이상 읽을 것이 없으면 -1을 출력한다. FileReader(“peom.txt”);를 선언하여 읽어들이기 위해 배열을 read해야하는데 read가 아스키코드로 읽기 때문에 char로 강제캐스팅을 하고 close메소드를 통하여 종료시킨다.
- 여기서 try catch문을 왜 사용하였는지 의문이 들 것이다. 사용을 하지 않으면 오류가가 날 것인데 그 이유는 무조건 예외처리를 해버리기 때문이다. 그래서 try, catch, finally문을 사용하여 예외를 처리해야한다.
다음은 write스트림 예제이다.
- FileWrite는 출력문자스트림으로서 파일을 출력하기 위하여 사용한다.
- 먼저 Writer를 null로 선언한다. 이유는 전과 동일하다.
- 키보드로 입력받기 위하여 Scanner를 사용하고 입력받을 때 입력하는 문자열을 기록하기 위하여 String으로 str변수를 선언했다. 여기서 str에 입력값을 저장시킬 peom도 선언하였다.
- 입력을 마칠 때 까지 반복을 위하여 while문을 사용하였는데 여기서 true값을 나타내기 위해서 str에 q를 입력하지 않는다면 계속 반복하도록 제한했다. 그리고 입력할 때마다 peom에 더하여 저장되도록 하였다.
- 그리고 try, catch 문을 사용하여 FileWriter(“peom2.txt”) 객체를 생성하고 write 메소드를 통하여 peom에 작성한다.
- 입력 한 후 q를 눌러주면 입력값이 담긴 peom2.txt가 생성된다.
다음은 Buffered를 사용한 예제를 살펴보자
- BufferedReader, BufferedWriter는 문자 입력 스트림으로부터 문자를 읽어들이거나, 내보낼 때 버퍼링을 함으로서 보다 효율적으로 처리할 수 있도록 도와준다.
- BufferedReader, BufferedWriter를 각각 변수 null값을 선언하고 입력이 가능할 수 있도록 String str변수를 공백으로 선언한다.
- try, catch문으로 각각 변수에 객체를 생성하는데 BufferedReader 객체를 생성하고 입력을 하기 위하여 new InputStreamReader(System.in) 객체를 생성한다.
- BufferedWriter안에 output.txt를 만들기 위하여 FileWriter 객체를 생성했다.
- 입력간 반복을 하기 때문에 while문을 사용하여 str을 한줄에 입력하는데 비어있지 않다면 계속 반복하여 str을 write한다.
- 출력하면 output.txt가 생성될 것이다.
다음은 ObjectOutputStream클래스로서 객체를 출력하는 클래스를 학습한다.
여기선 직렬화, 역직렬화가 나오는데 직렬화란 객체를 스트림으로 만드는 것이고 역직렬화는 스트림을 객체로 만드는 것이다.
이 클래스를 구현하기 위해선 Serializable 인터페이스가 필요한데 이는 오버라이딩이 따로 필요가 없이 사용한다.예제를 보면서 학습해보자.
- 먼저 MemberSerial클래스에 Serializable 인터페이스를 implements한다.
- 변수, 생성자, 디폴트, toString, getter, setter를 생성한다.
- 타 클래스에서 MemberSerial을 m으로 선언하고 read, write 메소드를 선언한다.
- 먼저 objectInputStream을 null값으로 선언한다.
- try, catch문을 사용하여 object.ser파일을 들이고 objectInputStream으로 객체화 하였다. 이때, Object타입이기 때문에 MemberSerial로 강제캐스팅을 하여 출력할 수 있도록 한다. 객체를 가져와서 역직렬화를 한 것이다.
- 값을 보내기 위해서 m을 홍길동, 20으로 선언하고객체를 ObjectOutputStream을 null값으로 선언한다.
- try, catch문을 사용하여 object.ser파일을 보내기 위해 ObjectOutputStream으로 객체화 하였다. writeObject를 통해 직렬화를 하고 출력하면 object.ser파일이 생성된다.
오늘 교육 간 느낀점
IO 및 API를 배우면서 자바의 다양한 방면을 익히고있는데 절차지향과 기본적인 객체지향의 개념에선 알기 힘들었던 내용들을 다루니 자바를 하는 것이 아닌 또 다른 언어를 하고있는 느낌이 들었다.
특히 IO는 양이 너무 많았고 실제로 쓰이는 메소드를 학습하다보니 기존에 사용하던 API가 얼마나 소중하고 코딩을 간편하게 할 수 있는지 깨달았다.
내일 추가적인 IO를 배우게 되는데 지금 양으로도 많은 것들을 했는데 더 배우면 더 많은 것을 배울 수 있을 것 같다.
빨리 습득해서 실무에 사용할 수 있도록 해야겠다.'Review' 카테고리의 다른 글
KOSTA 교육 16일차(알고리즘, 자료구조) (0) 2020.06.21 KOSTA 교육 15일차(File, Thread) (0) 2020.06.21 KOSTA 교육 13일차(정규표현식, 자료구조, ArrayList, Stack, Hashmap, Queue) (0) 2020.06.21 KOSTA 교육 12일차(Calendar, Random, 정규표현식) (0) 2020.06.21 KOSTA 교육 11일차(Interface, Object Class, Nested Class, String API, BoxingUnboxing) (0) 2020.06.21