📌스레드 병렬 처리 연결 수락을 위해 ServerSocket의 accept()을 실행하거나, 서버 연결 요청을 위해 socket 생성자 또는 connect()를 실행할 경우에는 해당 작업이 완료되기 전까지 블로킹(blocking)된다. 데이터 통신을 할 때에도 마찬가지인데 InputStream의 read() 메소드는 상대방이 데이터를 보내기 전까지 블로킹되고, OutputStream의 wrtie() 메소드는 데이터를 완전하게 보내기 전까지 블로킹 된다. 즉 말하고자 하는 바는 ServerSocket과 Socket은 동기(블로킹) 방식으로 구동된다. 만약 서버를 실행시키는 main 스레드가 직접 입출력 작업을 담당하게 되면 입출력이 완료될 때 까지 다른 작업을 할 수 없게 된다. 서버 어플리케이션은 지속적..
📌IO 패키지 소개프로그램에선 데이터를 외부에서 읽고 다시 외부로 출력하는 작업이 빈번히 일어난다. 데이터는 사용자로부터 키보드를 통해 입력될 수도 있고, 파일 또는 네트워크로부터 입력될 수도 있다. 데이터는 반대로 모니터로 출력될 수도 있고, 파일로 출력되어 저장될 수도 있으며 네트워크로 출력되어 전송될 수 있다. Java에서 데이터는 Stream을 통해 입출력되므로 스트림의 특징을 잘 이해해야 한다. 📌입력 스트림과 출력 스트림 (InputStream & OutputStream)프로그램이 데이터를 입력받을 때는 입력 스트림(InputStream)이라 부르고,프로그램이 데이터를 보낼 때에는 출력 스트림(OutputStream)이라 부른다. 프로그램이 네트워크상의 다른 프로그램과 데이터 교환을 ..
BufferedReader와 BufferedWriter는 버퍼를 이용해서 읽고 쓰는 함수이다. 이 함수는 Scanner와 System.out.println()과 기능이 유사하지만 버퍼를 이용하기 때문에 이 함수를 이용하면 입출력의 효율이 올라간다. (속도 측면에서도 훨씬 빠르다.) 그럼 왜 버퍼를 이용하면 속도가 빠를까? 간단하게 생각했을 때 중간에 버퍼를 거치기 때문에 더 느리지 않을까란 생각을 할 수도 있다. 예를 들어 설명하겠다. 모래 사장에서 모래를 퍼서 다른 구역으로 옮긴다고 했을 때 조금씩 여러번 옮기는 것보다 한 곳에 가득 채워서 (버퍼) 한 번에 나르는 것이 더욱 효율적일 것이다. 즉 버퍼를 사용하면 모아두었다가 한 번에 전송하기 때문에 효율적이다. buffer >데이터를 일시적으로 보관하..
📌스트림이란? 많은 수의 데이터를 다룰 때, 컬렉션이나 배열에 데이터를 담고 원하는 결과를 얻기 위해 코드를 작성하면 너무 길고, 재사용성도 떨어진다. 이런 문제를 해결하기 위해 만든 것이 스트림(stream)이다. 스트림은 데이터 소스를 추상화하고, 데이터를 다루는데 자주 사용되는 메서드들을 정의해 놓았다. 데이터소스를 추상화하였다는 것은, 데이터 소스가 무엇이던 간에 같은 방식으로 다룰 수 있게 되었다는 것과 코드의 재사용성이 높아진다는 것을 의미한다. 즉, 스트림(Stream)은 컬렉션(배열 포함)의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자이다. 간단한 예를 하나 보여주도록 하겠다. 뒤에서 자세히 설명할 것이니 그냥 보기만 해도 된다. //기존 Iterator List..
📌람다식 (Lambda expression) 객체 지향 프로그래밍이 나오기 전부터 Lisp 또는 Scheme와 같은 함수적 프로그래밍 언어들이 있었다. 현업에서는 호응을 얻지 못하였지만, 빅데이터가 각광받으면서 이를 프로그램적으로 다룰 방법이 필요해짐에 따라 멀티 코어를 활용한 분산처리와, 병렬화 기술이 필요하였다. 즉 이제 하나의 CPU안에 다수의 코어를 삽입하는 멀티 코어 프로세서들이 등장하면서 일반 프로그래머에게도 병렬화 프로그래밍에 대한 필요성이 생기기 시작했다. 이러한 추세에 대응하기 위해 Java 8에서는 병렬화를 위해 컬렉션(배열, List, Set, Map)을 강화했고, 이러한 컬렉션을 더 효율적으로 사용하기 위해 스트림(Stream)을 강화했다. 또 스트림을 효율적으로 사용하기 위해 함수..