목록Java (37)
개발놀이터
안녕하세요, 이번 포스팅에선 스레드 풀의 존재 의의를 스레드 생성 비용의 관점에서 공부해보고 정리했습니다! 흔히 알기로 데이터베이스 커넥션, JVM의 스레드의 생성비용이 크기 때문에 커넥션 풀, 스레드 풀을 적극 사용한다고 알려져있습니다. 이런 내용의 포스팅은 많이 있지만 이 스레드의 생성 비용이 정확히 어느정도인지 알려주는 곳은 없더군요. 저와 같은 생각을 가지신 분이 "널널한 개발자" 유튜버분에게 질문을 올리시고 그에 대한 답변 영상에 영감을 얻어 공부했습니다. 운영체제가 관리하는 스레드스레드는 프로세스에 속해있는 실행 단위이죠. 보통 운영체제가 프로세스를 PID라는 것으로 관리하고 이 프로세스는 컴퓨터의 파일 (여기서 파일은 소켓이 될 수도 있고, 실제 파일이 될 수도 있고 다양합니다.) 을..
이번 포스팅은 가상 스레드에 대해서 알아보도록 하겠습니다. 공부 주제를 선정한 것은 우아한 기술블로그에서 가상 스레드에 대한 포스팅을 보고 나서 결정하게 되었습니다. 글을 되게 재밌게 잘 쓰셨더군요. 글을 보고 흥미가 생겨서 공식 문서를 정독하면서 공부해봤습니다. 거두절미하고 바로 시작해보죠! 가상 스레드기존 자바에서의 스레드는 OS에서 제공해주는 네이티브 스레드를 그대로 사용했습니다. OS와 JVM사이에 JNI라는 인터페이스를 통해 네이티브 스레드를 사용하였죠. 자바 진영에서 이 네이티브 스레드는 플랫폼 스레드라고 부릅니다. 가상 스레드는 가상 메모리와 닮아있는데요. 가상 메모리에선 프로세스가 일을 처리할 때 실제 메모리 주소를 바라보게 하지 않고 가상 주소를 바라보게 함으로써 프로세스 더 나아가..
StreamAPI는 제가 자주 사용하는 문법 중 하나인데, 정작 뭐가 어떻게 동작하는지는 잘 모르고 썼던 것 같습니다. 그래서 정리하면서 사용법까지 훑어보도록 하겠습니다. StreamAPI란?자바8부터 지원하게 된 StreamAPI는 Collection을 함수형 인터페이스를 이용해 함수형 프로그래밍을 지원하기위한 목적을 가지고 나왔습니다. 때문에 우리는 Collection 에 담겨있는 객체들을 이용해 for문을 돌리고 if문을 사용하는 것을 StreamAPI로 깔끔하게 줄일 수 있게 되었습니다. StreamAPI는 람다식을 이용해 함수형 프로그래밍을 지원합니다. 대부분 Collection에 stream() 을 붙여서 사용합니다. 예시 코드와 함께 보시죠. List findBucket..
이번 포스팅은 기존 Map 인터페이스의 구현체 중 thread-safe 하다고 알려져있는 바로 그 구현체 ConcurrentMap입니다. 앞선 포스팅인 Map에 대한 기본적인 내용과 지금 쓰려는 이 내용은 지식의 깊이부터 다르기 때문에 성격이 맞지않다고 판단하여 따로 분리하여 포스팅하였습니다. 들어가기에 앞서 Map은 자바 컬렉션 중에서 가장 대중적으로 사용하는 것 중 하나입니다. 그리고 그 중 가장 많이 사용하는 HashMap은 thread-safe 하지 않은 구현체입니다. java 1.5 이전 (ConcurrentMap이 나오기 전) 에는 Hashtable이라는 클래스를 많이 사용했습니다. Hashtable은 HashMap과 다르게 멀티스레드 환경에서 thread-safe를 보장합니다. 하지만 Has..
구글링을 통해 많은 코드들을 보다보니 문득 궁금증이 생겼습니다. super, super() 이런게 뭘까? 스프링을 공부한다는 사람이 자바의 기본적인 문법도 모르는게 조금 부끄럽긴 하지만 그래도 모르니까 배우지 라는 마인드로 한번 포스팅 해보도록 하겠습니다. super super는 자손클래스에서 조상클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수이다. 멤버 변수와 지역 변수의 이름이 같을 때 this를 사용해서 구별했듯이 상속받은 멤버와 자신의 클래스에 정의된 멤버의 이름이 같을 때는 super를 사용해서 구별할 수 있다. 조상클래스로부터 상속받은 멤버도 자손클래스 자신이 멤버이므로 super대신 this를 사용할 수 있다. 그래도 조상클래스의 멤버와 자손클래스의 멤버가 중복 정의되어 서로 구별해..
자바에서 final 키워드는 상수를 표현하기 위한 예약어이다. '마지막' 이라는 단어 뜻처럼 선언한 그대로 사용하라는 의미이다. 변수, 메서드, 클래스에서 모두 이용되고 있는데 지금부터 각각의 의미에 대해서 살펴보도록 하자. final 변수 상수라고도 불린다. 변수를 선언과 동시에 초기화하며 이후에 값을 수정할 수 없다. 오직 get만 가능하다. public class Fruit { public static void main(String[] args) { // 선언 및 초기화 final int coiunt = 10; // 수정 count = 15;//컴파일 에러 } } count 변수를 선언할 때 final 키워드를 추가해 줌으로써 상수임을 나타내고 있다. 그리고 선언과 동시에 초기화를 진행하여 10을 ..
Java7 버전 이전에는 다 사용하고 난 자원을 반납하기 위해서 try-catch-finally 구문을 사용했다. Java7 버전 이후에 추가된 try with resources 기능은 try구문에 리소스를 선언하고, 리소스를 다 사용하고 나면 자동으로 반납 해주는 기능이다. java.lang.AutoCloseable 인터페이스를 구현하는 객체가 try with resource의 resource로 사용될 수 있다. 기존의 방식 (try-catch-finally) 리소스 생성 / 반납 public class ResourceClose { public static void main(String[] args) { Scanner scanner = null; try { scanner = new Scanner(new..
Optional 이란? NPE란? 개발을 할 때 가장 많이 발생하는 예외 중 하나가 바로 NPE (NullPointerException)이다. NPE를 피하려면 null 여부를 검사해야 하는데, null 검사를 해야하는 변수가 많은 경우 코드가 복잡해지고 번거롭다. 그래서 null 대신 초기값을 사용하길 권장하기도 한다. List names = getNames(); names.sort(); // names가 null이라면 NPE가 발생함 List names = getNames(); // NPE를 방지하기 위해 null 검사를 해야함 if(names != null){ names.sort(); } 출처: https://mangkyu.tistory.com/70 [MangKyu's Diary:티스토리] Opti..
람다함수란? 람다 함수는 프로그래밍 언어에서 사용되는 개념으로 익명 함수를 지칭하는 용어이다. 현재 사용되고 있는 람다의 근간은 수학과 기초 컴퓨터과학 분야에서의 람다 대수이다. 람다 대수는 간단히 말하자면 수학에서 사용하는 함수를 보다 단순하게 표현하는 방법이다. 람다의 장단점 장점 코드의 간결성 - 람다를 사용하면 불필요한 반복문의 삭제가 가능하며 복잡한 식을 단순하게 표현할 수 있다. 지연연산 수행 - 람다는 지연연산을 수행함으로써 불필요한 연산을 최소화 할 수 있다. 병렬처리 가능 - 멀티스레드를 활용하여 병렬처리를 사용할 수 있다. 단점 람다식의 호출이 까다롭다. (어렵다) 람다 Stream 사용 시 단순 for문 혹은 while문보다 성능이 떨어진다. 불필요하게 너무 사용하게 되면 오히려 가독..
자바의 예외는 크게 3가지로 나눌 수 있다. 체크 예외 (CheckedException) 언체크 예외 (UncheckedException) 에러 (Error) 자바에서 에러, 예외와 관련된 클래스들의 계층구조는 위와 같다. Throwable 클래스를 기준으로 Error, Exception 클래스로 나뉘어진다. 왼쪽에 보이는 Error는 말 그대로 에러와 관련된 클래스이다. 그리고 오른쪽에 보이는 Exception도 말 그대로 예외와 관련된 클래스이다. 자바에서 실행 시(Runtime) 발생할 수 있는 프로그램 오류를 에러와 예외 두가지로 구분하였다. Error란? 에러는 시스템에 비정상적인 상황이 발생했을 경우에 발생한다. 대표적으로 OOME로 많이 알려진 OutOfMemoryError나 StackOve..