Java & Kotlin

Thread 클래스를 상속하는 것보다 Runnable 인터페이스를 구현해야 하는 이유

이번 글에서는 자바에서 쓰레드를 구현하는 가장 핵심적인 두 가지 Thread 클래스와 Runnable 인터페이스에 대해 간략하게 소개하려고 합니다. 먼저 쓰레드의 생명 주기를 간략하게 보고, 왜 Runnable 인터페이스를 Implements 하는 방식의 구현이 Thread 클래스를 상속해서 구현하는 방식보다 나은지 그 이유를 적어보겠습니다. 1. 쓰레드의 생명 주기 쓰레드는 크게 아래와 같이 5가지 상태의 생명 주기를 갖습니다. New 쓰레드가 만들어진 상태로 아직 start() 메소드가 호출되지 않은 상태입니다. Runnable (실행대기) 쓰레드가 실행되기 위한 준비 단계입니다. 코드 상에서 start() 메소드를 호출하면 run() 메소드에 설정된 쓰레드가 Runnable 상태로 진입합니다. Ru..

2023.05.09 게시됨

Java & Kotlin

인터페이스의 메서드가 각기 다른 리턴 타입과 파라미터를 필요로 한다면?

1. 문제 인터페이스를 정의하여 구체 클래스의 세부 구현을 숨기는 것은 객체 지향에서 중요한 캡슐화의 한 방법입니다. 그런데 구체 클래스가 인터페이스를 구현하는 시점에는 인터페이스의 모든 메서드(Private, Default, Static 제외)를 반드시 오버라이딩해야 합니다. 그런데 회사에서 코드를 짜다보니 하다보니 아래와 같은 상황을 마주했습니다. public interface Reward { void giveReward(); } public class CashReward implements Reward{ } public class CouponReward implements Reward { } Reward는 '보상'과 관련된 인터페이스이며 보상을 지급하는 giveReward() 메서드가 있습니다. 세..

2023.05.08 게시됨

Java & Kotlin

[Java] Thread 안에서 발생하는 예외는 어떻게 처리되나

0. 문제 이번 글에서는 자바 개별 Thread에서 발생하는 예외를 어떻게 처리할 것인가에 대한 내용을 정리해보려고 합니다. 먼저 간단한 문제 상황을 보기 위해 아래 테스트 코드를 작성했습니다. @Test void threadExceptionTest() { ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10,10, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue()); int successCount = 0; for (int i = 0; i { throw new NullPointerException(); }); succ..

2023.03.31 게시됨

Java & Kotlin

[JAVA] JDK 17에서 제공하는 새로운 기능들 정리해보기

1. 빨라진 JDK Release 작년 9월, JDK 17이 최초로 공개되었고 바로 얼마 전에는 JDK 19 버전이 출시되었습니다. 비록 JDK 19가 LTS 버전은 아니지만, 내년 하반기에는 JDK 21 LTS 버전이 출시된다고 하는데요. 과거에는 JDK 버전업과 LTS 버전의 출시가 굉장히 큰 간격을 두고 이루어졌지만, 최근 들어 자바 진영에서는 새로운 JDK 버전의 Release를 공격적으로 가져가고 있습니다. 이렇게 변화의 속도가 빨라진 요즘, JDK에서 제공하는 기능들은 무엇이 있는지 이해하고 필요에 따라 적절히 사용하는 것은 기술 부채의 관점에서 개인이나 팀에게 굉장히 중요한 요소라고 생각합니다. 그래서 이번 글에서는 JDK 17 LTS 버전에서 제공하는 기능 몇 가지에 대한 예제 코드를 작성..

2022.11.18 게시됨

Java & Kotlin

[Java] 자바 람다식과 함수형 인터페이스(Functional Interface) - (2)

1. 들어가면서 지난 포스팅에서는 람다식의 기본적인 개념과 작성법, 그리고 함수형 인터페이스를 설명하면서 람다식이 어떻게 동작하는지에 대해 설명했습니다. [Java] 자바 람다식과 함수형 인터페이스(Functional Interface) - (1) 1. 들어가면서 - 람다식이란? 이번 시간에는 크게 네 가지 주제, [1] 람다식이란 무엇인가 [2] 어떻게 작성하는가 [3] 어떻게 동작하는가 [4] 어떻게 활용하는가에 대해 설명해보겠습니다. 보통 객체 studyandwrite.tistory.com 이번 시간에는 함수형 인터페이스와 관련된 이야기를 조금 더 해보려고 하는데요. "람다식이 함수형 인터페이스를 기반으로 동작하는 것이라면, 람다식을 쓰기 위해서는 매번 함수형 인터페이스를 일일이 만들어야하는가?" ..

2021.12.06 게시됨

Java & Kotlin

[Java] LinkedList, ArrayList를 구현하는 방식과 이에 따른 성능 비교해보기

0. 들어가면서 LinkedList, ArrayList는 자바 List 인터페이스를 구현한 클래스들입니다. 그리고 List 인터페이스는 Collection를 구현하고 있고, Collection는 최상위의 Iterable을 구현하고 있습니다. 이러한 계층 구조의 상속과 분리는 특정 클래스들의 공통점과 차이점으로 인한 결과라고 볼 수 있는데요. 이번 시간에 살펴볼 ArrayList, LinkedList 역시 List를 구현한 클래스들로 보면 공통점이 있지만, 서로 분리된 클래스라는 점에서는 분명 차이점이 존재하는 클래스들입니다. 그래서 이번 포스팅에서는 ArrayList와 LinkedList에 대해 정리해보고 각각의 클래스가 어떤 상황에서 사용하기 적합한지 직접 성능을 테스트해보려고 합니다. 1. Array..

2021.12.02 게시됨

Java & Kotlin

[Java] 제네릭(Generics)에 대해 생각해보기

0. 들어가면서 이번 포스팅에서는 자바 제네릭(Generic)에 대한 기본적인 내용부터 제가 궁금했던 부분들이나 고민해보면 좋을 부분들을 정리하려고 합니다. 제네릭은 공부할수록 범위도 많고 제대로 쓰는 것이 정말 어렵겠구나를 느껴서 차근차근 더 공부를 해야 할 것 같긴 합니다. 우선 시작해보겠습니다. 1. 제네릭을 쓰는 이유 제네릭(Generic)은 JDK 1.5 버전에 처음 도입된 기능으로 객체의 타입 안정성을 높여주고 형변환의 번거로움을 덜어주었습니다. 이 말의 의미를 직접 느껴보기 위해 아래 코드를 보겠습니다. 우선 저는 인텔리제이 IDE를 쓰고 있는데, IDE는 위처럼 ArrayList라는 현재 제네릭 클래스로 정의된 클래스에 대해 제네릭을 선언해주지 않으면 노란 밑줄을 그어줍니다. 제네릭을 써야..

2021.11.23 게시됨

Java & Kotlin

[JAVA] 자바 hashCode()

1. 자바 hashcode() 자바의 hashcode() 메서드는 Object 클래스의 메서드로써, 모든 클래스는 Object 클래스를 상속하기 때문에 사실 상 모든 객체에서 가지고 있는 메서드라고 볼 수 있습니다. 그리고 이 hashCode() 메서드는 해싱 기법에 사용되는 해시함수(hash function)을 구현한 것인데요. 해시함수는 찾고자 하는 값을 입력하면 그 값이 저장된 위치를 알려주는 해시코드(hash code)를 반환합니다. 2. equals()와 hashCode() equals() 메서드 역시 Object 클래스가 가진 메서드입니다. equals는 매개변수로 객체의 참조변수를 받아서 비교하고, 그 결과를 boolean 값으로 리턴하는데요. 실제 Object 클래스 안에 equals 메서..

2021.11.20 게시됨

Java & Kotlin

[Java] 자바 람다식과 함수형 인터페이스(Functional Interface) - (1)

1. 들어가면서 - 람다식이란? 이번 시간에는 크게 네 가지 주제, [1] 람다식이란 무엇인가 [2] 어떻게 작성하는가 [3] 어떻게 동작하는가 [4] 어떻게 활용하는가에 대해 설명해보겠습니다. 보통 객체지향적 프로그래밍을 한다는 것은 프로그램 안에서 상호작용하는 객체들을 중심으로 객체가 가지는 값이나 행위들로 프로그램을 끌고 나가는 것을 말합니다. 반면, 함수형 프로그래밍은 프로그램을 상태값을 지니지 않는 함수값들의 연속으로 생각할 수 있게 해주는 방법을 말하죠. 이러한 관점에서 바라볼 때, JDK1.8에서 도입된 람다식(Lambda Expression)은 메서드를 하나의 식(expression)으로 표현할 수 있게 하여 자바가 객체지향언어인 동시에 함수형 언어의 속성을 갖게 해주었습니다. 뒤에서도 살..

2021.11.02 게시됨

Java & Kotlin

[자바/JAVA] 생성자(Constructor)

생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'입니다. 따라서 인스턴스 변수의 초기화 작업에 주로 사용되며, 인스턴스 생성 시에 실행되어야 할 작업을 위해서도 사용되죠. 사실 생성자는 자바를 사용한다면 누구나 무의식적으로 쓰는 개념입니다. 그럼에도 불구하고, 몇 가지 기본적인 개념에 대해서는 한 번 짚고 넘어가면 좋을 것 같아서 정리해보겠습니다. 1. 기본 생성자(Default Constructor) 자바 코드를 컴파일 할 때, 소스파일(*.java)의 클래스에 생성자가 하나도 정의되어 있지 않은 경우 컴파일러는 자동적으로 아래처럼 같은 내용의 기본 생성자를 추가하여 컴파일합니다. class Data{ Data(){ } // Default Constructor int value; } 단..

2021.08.02 게시됨