배운 내용
- 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파일이 생성된다.
'KOSTA' 카테고리의 다른 글
KOSTA 교육(알고리즘, 자료구조) (0) | 2021.03.05 |
---|---|
KOSTA 교육 (File, Thread) (0) | 2021.03.05 |
KOSTA 교육 (정규표현식, 자료구조, ArrayList, Stack, Hashmap, Queue) (0) | 2021.03.03 |
KOSTA 교육 (Calendar, Random, 정규표현식) (0) | 2021.02.24 |
KOSTA 교육 (Interface, Object Class, Nested Class, String API, BoxingUnboxing) (0) | 2021.02.23 |