Programming Language/Java
[Java] 스트림과 병렬 실행
[Java] 스트림과 병렬 실행
2023.08.02데이터 컬렉션을 병렬로 처리하려면 데이터를 작은 단위로 분할하고 분할된 서브파티를 각각의 쓰레드로 할당해서 실행해야 한다. 이 과정에서 쓰레드의 Race Condition이 발생하지 않도록 동기화 해 줘야 하고, 각 쓰레드의 작업 결과를 합쳐 줘야 한다. 몇 개의 쓰레드를 사용하고 결과 변수는 어떻게 동기화 해야 하는지도 함께 고려해 줘야 한다. 스트림은 순차 스트림을 병렬 스트림으로 바꾸는 기능을 제공한다. 스트림을 사용해 병렬 작업을 구현해보자. 컬렉션에서 parallelStream을 호출하면 병렬 스트림이 생성된다. 병렬 스트림은 각각의 쓰레드에서 처리할 수 있도록 스트림 요소를 여러 덩어리로 분할한 스트림으로, 멀티코어 프로세서가 각 덩어리를 처리하도록 할당할 수 있다. public long pa..
[Java] 컬렉션과 스트림
[Java] 컬렉션과 스트림
2023.08.01스트림은 데이터의 흐름을 나타내고, 흐름에 다양한 연산을 수행한다. 선언형으로 컬렉션 데이터를 처리할 수 있고, 이 작업을 병렬로 처리할 수 있다. List expensiveCarNames = cars.stream() .filter(car -> car.getPrice() > 1000) .sorted(Comparator.comparing(Car::getPrice)) .map(Car::getName) .collect(Collectors.toList()); List expensiveCarNames2 = cars.parallelStream() .filter(car -> car.getPrice() > 1000) .sorted(Comparator.comparing(Car::getPrice)) .map(Car::ge..
[Java] 람다 표현식
[Java] 람다 표현식
2023.06.09코드를 간결하게 작성하고 중복을 최대한 피하기 위해 사용한다. 어떤 메서드를 구현한다고 해 보자. 확장성을 열어놓기 위해 특정 비즈니스 요구사항이 추가됐을 때 쉽게 수정하고 추가할 수 있어야 한다. 이를 위해 값을 메서드의 파라미터로 넘기는 것 보다 동작을 메서드의 파라미터로 넘기는 편이 합리적이다. package Parameter; public class Apple { private String color; priavet String weight; public Apple(String color, String weight) { this.color = color; this.weight = weight; } public String getColor() { return color; } public String..
자바 예외 이해하기
자바 예외 이해하기
2022.09.03예외도 객체로 분류되기 때문에 다른 객체들과 마찬가지로 최상위 부모는 Object이다. Throwable은 Object바로 아래의 최상위 예외로, Exception과 Error를 자손으로 가진다. Error 메모리 부족이나 심각한 시스템 오류처럼 애플리케이션 레벨에서 복구 할 수 없는 시스템 예외이다. 에러가 발생하면 잡으려고 하지 말고 그냥 두자. 조상 에러를 catch로 잡으면 하위 예외도 함께 잡힌다. (던질 때도 마찬가지) 그러니 애플리케이션 로직에서 Error 예외를 잡지 않도록 하기 위해 Throwable 예외도 잡지 않도록 하자. 애플리케이션 로직은 Exception부터 필요한 예외로 생각하면 된다. Exception 애플리케이션에서 잡을 수 있는 실질적인 최상위 예외이다. Exception..
[Java] 네트워킹 (Networking) 2
[Java] 네트워킹 (Networking) 2
2021.12.13컴퓨터끼리 통신을 할 때 쓰는 도구를 소켓이라고 한다. 소켓을 통해 진행하는 통신의 종류로는 TCP와 UDP가 있는데, 소켓 프로그래밍에 대해 알아보자. 데이터를 전송(네트워킹)은 계층적인 구조로 이루어져있다. 여기서 전송을 담당하는 계층이 있는데 이 전송 방식으로 TCP와 UDP가 있다. TCP는 1:1 통신방식을 사용해 속도가 UDP보다 느리지만, 데이터 전송이 잘못되면 다시 요청하기 때문에 데이터의 신뢰성이 높다. UDP 는 보내는 사람이 일방적으로 보내는 형식이라고 생각할 수 있다. 덕분에 속도도 빠르지만, 받는 데이터가 올바른 데이터인지 아닌지 확인하는 과정이 없어 데이터의 신뢰성이 좀 떨어진다. (Streaming 에서 사용함) datagram은 데이터 단위라고 생각하면 된다. TCP는 byt..
[Java] 네트워킹 (Networking) 1
[Java] 네트워킹 (Networking) 1
2021.12.05컴퓨터간의 관계를 서버와 클라이언트로 구분할 수 있다. 서비스를 제공하는 쪽이 서버이고 제공받는 쪽이 클라이언트가 된다. 하나의 서버가 여러 가지 서비스를 제공하기도 하고, 하나의 서비스를 여러 대의 서버로 제공하기도 한다. 서버는 서버 일만, 클라이언트는 클라이언트의 일만 하는 모델을 서버기반 모델이라고 한다. 파일 공유 시스템(Torrent)에서 많이 사용하는 모델으로 P2P 모델이 있다. 각각의 클라이언트들이 서버의 역할도 수행하는 모델이다. 우리는 보통 클라이언트의 역할을 한다. 서버에 접속하기 위해서는 특별한 경로, 특별한 식별자가 필요한데 이를 IP주소라고 한다. 이 IP주소를 바탕으로 컴퓨터들을 구분한다. IP주소는 4바이트와 6바이트로 나타낼 수 있는데, 원래는 4바이트를 많이 사용했는데 ..
[Java] 입출력 (I/O) 2
[Java] 입출력 (I/O) 2
2021.11.29지난 시간에 바이트기반 스트림에 대해 알아봤으니 이번에는 문자기반 스트림에 대해 알아보자. 바이트기반 스트림과 문자기반 스트림은 매우 유사하다. 집중해서 봐야 할 부분은 byte[] 에서 char[]로 바뀌었다는 점이다. 단위만 문자 단위로 쓰는구나... 라고 생각하고 공부하자. 위쪽 부분에서 FileInputStream은 바이트단위로 처리하고, FileReader는 문자 단위로 처리한다. FileInputStream을 통해 파일 내용을 읽게 되면 영어는 1바이트로 처리할 수 있어 제대로 처리되지만, 한글은 2바이트가 이상이기 때문에 (UTF-8 16 인코딩에 따라 다르긴 함) 텍스트가 깨진다. 똑같은 문장을 FileReader로 읽을 경우에는 문자 단위로 처리하기 때문에 텍스트가 깨지지 않는다. Pip..
[Java] 입출력 (I/O) 1
[Java] 입출력 (I/O) 1
2021.11.21컴퓨터에서 제일 기본적인 입력 장치는 키보드이고, 출력 장치는 모니터이고 키보드와 모니터를 Standard Input output으로 말한다. Java에서 출력을 처리할 때 System.out.println등등 비슷한 메서드를 사용하고 입력을 받을 때는 Scanner 클래스를 이용해 처리하는데 이런 방법 말고 입력과 출력의 소스를 다르게 했을 때는 어떻게 처리 할 수 있을까? 입력과 출력을 합쳐서 입출력 (Input / Output) 이라고 하고 두 대상 간의 데이터를 주고 받는 걸 의미한다. 입력을 받을 때 쓰이는 통로와 출력을 처리할 때 쓰이는 통로는 각각 따로 정의돼야 하고, 이 통로를 Stream 이라고 한다. (입력스트림 / 출력스트림) 스트림은 바이트 단위로 데이터를 전송하고 입출력의 대상에 ..
[Java] 쓰레드 (Thread) 2
[Java] 쓰레드 (Thread) 2
2021.11.12함수를 쓰게 되면 운영체제가 자신의 시스템에 맞게 조절을 하게 되어, 프로그래머가 컨트롤 할 수 있는 부분이 그렇게 크지는 않다. 하지만, 이런 제한된 컨트롤 가능 범위 내에서 쓰레드의 실행을 어떻게 제어할 것인지를 알아보자. 쓰레드의 실행을 제어하기 위해 사용하는 메서드들을 살펴보자. 이 메서드들 중에서 stop suspend resume 메서드는 호환성을 위해서 정의돼있긴 하지만, 쓰레드의 비정상적인 종료에 큰 영향을 미치는 메서드들이기 때문에 자바에서 사용을 권장하지 않는다. 이 메서드들을 하나하나 살펴보기 전에 쓰레드의 상태에 대해 알고있어야 한다. 쓰레드에는 여러 가지 상태가 있는데, 쓰레드의 여러 가지 메서드들을 통해 어떤 상태를 다른 상태로 바꿔 줄 수도 있다. 일단 start() 메서드를 ..
[Java] 쓰레드 (Thread) 1
[Java] 쓰레드 (Thread) 1
2021.11.08시스템프로그래밍(시스템 자원을 쓰는것) / 운영체제(Operating System)에서 자세하게 다루는 부분이다. 어떻게 활용하는지에 초점을 맞춰 공부해보자. 프로세스 : 프로그램의 단위 하나의 프로그램이 실행될 때 하나의 프로세스에 할당돼 실행된다. PID(Process ID) 인터넷 익스플로어, 크롬.. 등등 여러 가지 프로그램들이 하나의 프로세스로써 돌아간다. 아니 그러면 한 번에 하나의 프로그램만 쓸 수 있나?? 라고 생각할 수 있다. 과거 DOS라는 운영체제는 멀티태스킹을 지원하지 않아 실제로 한 번에 두 가지 이상의 프로그램을 사용할 수 없었다. 하지만, 운영체제가 Windows 로 넘어가면서 멀티태스킹을 지원해 여러 가지 프로그램들을 한 번에 띄울 수 있게 됐다. 쓰레드는 프로세스를 가볍게 ..
[Java] 래퍼 클래스 (Wrapper)
[Java] 래퍼 클래스 (Wrapper)
2021.10.29객체지향 언어인 자바에서도 모든 것을 객체로 다루진 않고, 8개의 기본형 타입이 있다. 하지만, 때로는 기본형 변수도 객체로 다뤄야 할 때가 있다. 지네릭스 타입을 설정할때.. 매개변수로 객체를 요구할때.... 등등 많은 경우가 있다. 이를 처리해 주는 래퍼 클래스에 대해 간단히 알아보자. 8개의 기본형을 대표하는 8개의 래퍼클래스로 기본형 값을 객체로 다룰 수 있다. char -> Character / int -> Integer 말고는 앞글자를 대문자로 바꾼 형태이다. 문자열을 숫자로 변환할 때 많이 쓰던 Integer.parseInt() 메서드도 래퍼클래스의 메서드이다. 원래는 Integer.parseInt() 메서드는 int로 변환하고, Integer.valueOf() 메서드는 Integer 타입을..
[Java] 예외처리
[Java] 예외처리
2021.10.29런타임 시 발생하는 오류를 처리해 주자. 어떻게 사용하는지에 집중해 알아보자. try { }catch (Exception e) { } 위와 같은 형식으로 작성된다. 예외가 발생하면 발생한 예외와 일치하는 catch블럭을 확인하고, catch 블럭 내의 문장을 수행한다. 그 다음 전체 try-catch 문을 빠져나가서 다음 코드를 계속해서 수행한다. 예외가 발생하지 않으면 catch 블럭을 무시하고 전체 try-catch 문을 빠져나가서 다음 코드를 계속해서 수행한다. throw로 고의로 예외를 발생시킬 수 있다. Exception은 모든 예외들의 최고 조상이며, 모든 종류의 예외를 처리할 때는 Exception을 선언해 편하게 처리할 수 있다. Exception e = new Exception("고의로발..