Java

39 posts

[자바] 자주 사용되는 Lombok 어노테이션

Lombok 라이브러리에서 제공하는 어노테이션 중에서 자주 사용되는 어노테이션 위주로 살펴보도록 하겠습니다. 접근자/설정자 자동 생성 제일 먼저 살펴볼 어노테이션은 @Getter와 @Setter 입니다. 아마 Lombok에서 가장 많이 사용되는 어노테이션일 텐데요. 예를 들어, xxx라는 필드에 선언하면 자동으로 getXxx()(boolean 타입인 경우, isXxx())와 setXxx() 메소드를 생성해줍니다. 위와 같이 특정 필드에 어노테이션을 붙여주면, 다음과 같이 자동으로 생성된 접근자와 설정자 메소드를 사용할 수 있어서 매

[자바] 리스트를 순회하는 방법

자바에서 리스트를 순회하는 4가지 방법에 대해서 알아봅시다. 다음와 같이 5가지 과일 문자열을 담고 있는 리스트를 순회하면서 원소를 하나씩 출력해보겠습니다. 전통적인 For 루프 그냥 평범한 For 루프문을 사용하여 마치 배열을 순회하는 것과 동일한 방식으로 순회할 수 있습니다. 하지만 이 방법은 E get(int index) 메소드를 가지는 List 타입의 객체 대상으로만 사용할 수 있습니다. 상위 타입인 Collection이나 Set과 같은 이종 타입의 객체 대상으로는 사용이 불가한 방법입니다. Iterator 위의 대안 중 하

[자바] 컬렉션에서 원소 삭제하기 (ConcurrentModificationException 피하면서)

리스트를 순회하면서 특정 원소를 삭제하고 싶을 때가 있습니다. 예를 들어, 다음과 같이 알파벳과 숫자가 섞여있는 리스트가 있다고 가정해봅시다. 저는 이 리스트에서 숫자인 원소들은 모두 삭제하고 싶습니다. ConcurrentModificationException 발생 가장 먼저 떠오르는 방법은 boolean remove(Object o) 메소드를 사용하는 것입니다. for 루프를 돌면서 해당 원소가 숫자인지 체크 후에 숫자이면 remove 메소드를 호출합니다. 하지만 위 코드는 다음과 같은 ConcurrentModificationEx

[자바] NavigableSet 사용법

자바6에서 추가된 NavigableSet에 대해서 알아보도록 하겠습니다. NavigableSet은 SortedSet을 확장한 인터페이스입니다. 따라서 기존 SortedSet 대비 추가된 기능 위주로 살펴보는 게 좋을 것 같습니다. 객체 생성 자바에서 제공하는 NavigableSet 인터페이스의 대표적인 구현 클래스는 TreeSet 입니다. 따라서 TreeSet 객체를 생성 후에, NavigableSet 타입 변수에 할당하기면 하면 됩니다. 역순 접근: descendingIterator, descendingSet SortedSet을

[자바] SortedSet 사용법

SortedSet 사용법에 대해서 알아보록 하겠습니다. SortedSet은 원소들이 정렬되어 있는 Set입니다. 따라서 SortedSet 하여금 객체 간 대소 비교가 가능한 상황을 만들어줘야 합니다. 여기서 "객체 간 대소 비교가 가능한 상황"이란 다음 2가지로 생각해볼 수 있습니다. Comparable 인터페이스를 구현하고 있는 클래스의 객체를 원소로 사용 Comparator 인터페이스를 구현한 대소 판단을 위한 로직을 SortedSet 객체 생성 시에 넘김 본 포스팅에서는 Comparable 인터페이스를 구현하고 있는 Strin

AssertJ 소개

멋진 테스트 코드를 작성하도록 돕는 AssertJ 라이브러리에 대해서 알아봅시다. AssertJ의 장점 메소드 체이닝을 지원하기 때문에 좀 더 깔끔하고 읽기 쉬운 테스트 코드를 작성할 수 있습니다. 개발자가 테스트를 하면서 필요하다고 상상할 수 있는 거의 모든 메소드를 제공합니다. 라이브러리 의존성 설정 Java8 이상 기반 프로젝트는 3.x 버전을, Java7 이하 기반 프로젝트는 2.x 버전을 사용하셔야 합니다. Gradle Java8 Java7 Maven AssertJ 메소드 임포트 다음과 같이 정적 임포트를 하면 Assert

자바8 Optional 3부: Optional을 Optional답게

Optional을 좀 더 Java8 API 설계자의 의도에 맞게 쓰는 방법에 대해서 알아봅시다. 이전 포스팅를 통해서 Optional에 대해서 소개드렸습니다. 또한 Optional을 Optional답지 않게 사용할 경우, 어떤 부작용이 발생하는지도 살펴보았는데요. 이 번 포스팅에서는 어떻게 코드를 작성해야 Optional을 Optional답게 쓸 수 있는지 알아보도록 하겠습니다. Stream처럼 사용하기 Optional을 제대로 사용하려면, Optional을 최대 1개의 원소를 가지고 있는 특별한 Stream이라고 생각하시면 좋습니

자바8 Optional 2부: null을 대하는 새로운 방법

Java8의 Optional API를 통해 어떻게 null 처리를 할 수 있는지 알아봅시다. 이전 포스팅를 통해 Java8 이 전에는 얼마나 null 처리가 고통스러웠는지 살펴보았습니다. 그리고 문제의 본질이 null 참조를 통해 "값의 부재"를 표현하는 자바 언어의 초기 설계에 기인한다라는 것도 말미에 언급하였습니다. null 관련 문제 돌아보기 이 전 포스팅의 예제 코드를 통해 살펴본 null과 관련된 문제들을 크게 2가지로 요약됩니다. 런타임에 NPE(NullPointerException)라는 예외를 발생시킬 수 있습니다. N

자바8 Optional 1부: 빠져나올 수 없는 null 처리의 늪

Java8이 나오기 이 전에는 얼마나 힘들게 null 처리를 했었는지 살펴봅시다. null 창시자가 스스로 인정한 null 탄생의 실수 우선 null이라는 개념은 언제 누구에 의해 만들어졌을까요? null 참조는 1965년에 Tony Hoare라는 영국의 컴퓨터 과학자에 의해서 처음으로 고안되었습니다. 당시 그는 "존재하지 않는 값"을 표현할 수 있는 가장 편리한 방법이 null 참조라고 생각했다고 합니다. 하지만 나중에 그는 그 당시 자신의 생각이 "10억불 짜리 큰 실수"였고, null 참조를 만든 것을 후회한다고 토로하였습니다

소켓이란 무엇인가?

본 포스팅는 오라클 자바 튜토리얼의 What Is a Socket?를 번역하였습니다. 소켓 통신 일반적으로 서버는 특정 포트가 바인딩된 소켓를 가지고 특정 컴퓨터 위에서 돌아갑니다. 해당 서버는 클라이언트의 연결 요청을 소켓을 통해 리스닝하면서 그냥 기다릴 뿐이죠. 클라이언트는 서버가 떠 있는 머신의 호스트네임과 서버가 리스닝하고 있는 포트 번호를 알고 있습니다. 따라서 클라이언트는 이 호스트 네임과 포트를 통해서 서버와 연결을 시도하게 됩니다. 또한 클라이언트는 서버 상대로 자신을 식별시켜주기 위해서 연결동안 사용될 로컬 포트에

자바8: 반복문에서 벗어나기

본 포스팅는 Dead Code Rising의 Java 8: No more loops를 번역하였습니다. 이전 포스팅통해 자바의 판도를 바꿀 자바8의 새로운 함수형 기능들에 대해서 살펴보았습니다. 자바 개발자들에게는 새로운 세상이 열렸으며, 이제 우리가 그 새로운 세상에 적응해야 할 때 입니다. 이번 포스팅에서는 전통적인 반복문에 대한 몇가지 대안들에 대해서 알아보겠습니다. 자바8의 새로운 함수형 기능의 훌륭한 점은 어떻게 실행하는지 대신에 무엇이 실행되야 할지를 명시할 수 있다는 것입니다. 이런 측면에서 반복문이 탈락되게 됩니다. 물

자바8: 람다 1부 - 메소드 참조, 가상 확장 메소드, 결론

본 포스팅는 오라클 웹사이트에 Ted Neward가 기고한 Java 8: Lambdas, Part 1를 번역하였습니다. 메소드 참조 (Method Reference) 지금까지 다룬 모든 람다는 사용 시점에 람다를 정의하는 익명 리터럴이였습니다. 이는 1회성 행위를 위해서는 훌륭하지만, 이 행위가 여러 곳에서 사용되어야 하는 상황에서는 별로입니다. 예를 들어 다음 Person 클래스를 생각해봅시다. (지금은 부적절한 캡슐화에 대해서는 무시하시죠.) Person 객체를 SortedSet에 저정하거나 어떤 형태로든 리스트 내에서 정렬될

자바8: 람다 1부 - 람다식, 타입 추론, 어휘 범위

본 포스팅는 오라클 웹사이트에 Ted Neward가 기고한 Java 8: Lambdas, Part 1를 번역하였습니다. 자바8은 그런한 코드 블록을 쉽게 작성하게 하기위해 설계된 몇몇 새로운 언어 기능들을 도입합니다. 그 중에서 가장 중요한 기능은 구어체로 클로저또는 익명 함수라고 일켣는 람다식입니다. (클로저라고 불리는 이유는 잠시 후 논의할 것입니다.) 이것들에 하나 씩 다뤄봅시다. 람다식 람다식은 기본적으로 나중에 실행하는 메서드의 구현을 간결하게 기술하는 방법에 불과합니다. 예를 들어 그러므로 일람 2와 같이 Runnable

자바8: 람다 1부 - 서문, 배경

본 포스팅는 오라클 웹사이트에 Ted Neward가 기고한 Java 8: Lambdas, Part 1를 번역하였습니다. 자바8의 람다 표현식 알아보기 자신이 선택한 프로그래밍 언어나 플랫폼의 새로운 출시 소식보다 소프트웨어 개발자를 흥분시키는 일이 있을까? 자바 개발자들도 예외는 아니다. 사실, 오히려 자바 개발지들 더욱 새로운 출시에 대해 간절했을지도 모릅니다. 왜냐하면 자바를 만들었던 Sun이 그랬던 것 처럼 자바도 쇠퇴의 길을 걷지 않을까 생각했던 게 그리 오래 전 일이 아니기 때문이죠. 죽을 고비를 겪고 나면 다시 주어진 삶

동기화 (Synchronization)

본 포스팅는 오라클 자바 튜토리얼의 Synchronization와 Thread Interference, Memory Consistency Errors, Synchronized Methods, Intrinsic Locks and Synchronization, Atomic Access를 번역하였습니다. 쓰레드는 주로 필드들이 가리키고 있는 객체 참조를 공유함으로써 서로 통신합니다. 이는 굉장히 효율적 통신 방법이지만, 쓰레드 간섭(thread interference)과 메모리 일관성 오류(memory consistency errors)

자바 쓰레드 Sleep & Intterupt & Join

본 포스팅는 오라클 자바 튜토리얼의 Pausing Execution with Sleep와 Interrupts, Joins, The SimpleThreads Example를 번역하였습니다. Sleep으로 실행 중지하기 Thread.sleep() 메소드는 현재 쓰레드가 일정 기간동안 실행을 중지시킵니다. 이것은 해당 애플리케이션 또는 시스템 상에서 돌고 있는 다른 애플리케이션 내의 다른 쓰레드들에게 프로세서를 이용 가능하도록 만들기 위한 효율적인 방법입니다. sleep() 메소드는 다음 예제와 같이 속도 조절을 위해서도 사용될 수 있습

자바 쓰레드

본 포스팅는 오라클 자바 튜토리얼의 Thread Objects와 Defining and Starting a Thread를 번역하였습니다. 쓰레드 객체 모든 쓰레드는 Thread 클래스의 인스턴스와 관계를 갖습니다. 동시 애플리케이션(concurrent application)을 개발하기 위해서 쓰레드 객체를 사용하는데는 두 가지 기본 전략이 있습니다. 쓰레드의 생성과 관리를 직접 제어하기 위해서, 애플리케이션이 비동기 작업이 필요할 때 마다 단순히 Thread 클래스의 인스턴스를 만들 수 있습니다. 응용 프로그램으로 부터 쓰레드 관리

프로세스와 쓰레드

본 포스팅는 오라클 자바 튜토리얼의 Processes and Threads를 번역하였습니다. 동시 프로그래밍(Concurrent Programming)에는 프로세스와 쓰레드, 이 두가지 기본 실행단위가 있습니다. 자바 프로그래밍 언어에서는 동시 프로그래밍은 주로 쓰레드와 관련이 있지만 프로세스 또한 중요합니다. 컴퓨터는 보통 여러 개의 활성화된 프로세스와 쓰레드를 가지고 있습니다. 이것은 심지어 동시에 하나의 쓰레드 밖에 실제로 처리할 수 없는 싱글 코어를 가진 시스템에서도 마찬가지입니다. 싱글 코어의 처리 시간은 운영체제의 시분활

자바: Thread 클래스와 Runnable 인터페이스

자바에서 쓰레드를 작성하는 2가지 방법에 대해서 알아보겠습니다. Thread 클래스 확장하기 첫번째 방법으로 java.lang.Thread 클래스를 확장할 수 있습니다. Thread 클래스에는 상당히 많은 메소드가 있는데요. 그 중에서 run() 이라는 메소드만 오버라이드해주면 됩니다. 쓰레드마다 수행 시간을 다르게 하여 현실과 비슷한 상황을 연출하고 싶었습니다. 그래서 Thread.sleep() 메서드를 이용해여 1초 이상 6초 미만의 랜덤 딜레이를 주었습니다. 그리고 각 쓰레드의 시작과 종료 시점에 Thread.currentTh

Discord