ABOUT ME

-

오늘
-
어제
-
-
  • KOSTA 교육 14일차 (ArrayList, Sort, Comparable, Comparator, 입출력, Stream)
    Review 2020. 6. 21. 17:14

    18.11.15(목)

     

    배운 내용

     

    1. ArrayList Sort
    2. 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를 배우게 되는데 지금 양으로도 많은 것들을 했는데 더 배우면 더 많은 것을 배울 수 있을 것 같다.
    빨리 습득해서 실무에 사용할 수 있도록 해야겠다.

    댓글