본문 바로가기

Java95

[Java] Project Lombok Annotation 자바의 버전이 올라가면서 간결한 코드 작성을 위한 장치들이 많이 도입되고 있다. 하지만 여전히 자바의 가장 큰 문제점 중 하나로 군더더기가 많은 점이 꼽힌다. '프로젝트 롬복(Project Lombok)'은 자바로 작성된 소스코드를 좀 더 간결하게 만들어주기 위한 프로젝트다. 간단한 클래스를 작성해보자. public class Student { private final int id; private final String name; private final int age; private final String department; public Student(int id, String name, int age, String department) { this.id = id; this.name = name; t.. 2021. 3. 30.
[Java] SimpleDateFormat을 이용한 날짜 포맷 변환 예제 Java를 이용해서 시간 데이터를 다루는 방법에는 몇 가지가 있다. 그 중에 가장 간단한 방법은 SimpleDateFormat 클래스를 이용해서 문자열을 파싱하거나 문자열로 시간 데이터를 표현하기도 한다. 이번 포스트에서는 SimpleDateFormat 클래스의 사용방법과 예제, 주의 사항을 다뤄보겠다. SimpleDateFormat은 java.text.DataFormat 이라는 abstract 클래스를 상속받은 클래스다. 이름에서도 알 수 있듯이 간단하게(Simple) 날짜 포맷을 다룰 수 있는 메소드를 제공한다. SimpleDateFormat 예제 - 문자열을 Date 객체로 변환 문자열로 표현된 날짜 정보를 파싱하여 Date 객체로 변환해보자. // 변환할 문자열 String dateStr = "2.. 2021. 3. 30.
[Java] java.library.path와 LD_LIBRARY_PATH 리눅스 환경에서 자바 프로그램을 실행할 때 설정해줘야 하는 환경 변수 중에 LD_LIBRARY_PATH라는게 있다. LD_LIBRARY_PATH는 '로더(Loader)'가 공유 라이브러리나 동적 라이브러리를 찾을 때 찾아가는 경로를 지정하는 환경변수다. 맨 앞에 있는 LD라는 프리픽스(Prefix)가 로더를 의미한다. 리눅스 환경에서 실행 파일을 PATH 환경변수에 지정한 경로에서 찾는 것과 동일하다고 생각하면 된다. .bashrc 파일이나 스크립트 파일에서 다음과 같이 LD_LIBRARY_PATH 환경 변수를 지정해주면 된다. $ LD_LIBRARY_PATH=/home/user/lib:/home/user/test/lib $ export LD_LIBRARY_PATH PATH 환경변수처럼 각 경로들은 '콜.. 2021. 2. 23.
[Java] computeIfAbsent 예제 Map을 사용할 때 굉장히 빈번하게 사용하는 코드 패턴이 있다. Map map = new HashMap(); Value value = map.get(key); if (value == null) { value = getNewValue(key); map.put(key, value); } Map에서 특정 키에 해당하는 값이 존재하는지 확인한 후, 없으면 새로 만들어서 넣어주는 형태의 코드다. Key 값에 해당하는 Value가 존재하면 가져와서 사용하고 없으면 새로 만들어주는 패턴의 코드를 위해 Java 8에서는 computeIfAbsent()라는 메소드를 이용해서 짧게 구현할 수 있다. Map map = new HashMap(); Value value = map.computeIfAbsent(key, k -> .. 2021. 1. 19.
Java NIO - Pipe 파이프(Pipe)는 두 스레드를 연결해주는 'One-way' 데이터 커넥션이다. 파이프(Pipe)에는 데이터를 쓸 수 있는 싱크채널(Sink Channel)과 데이터를 읽어가는 소스채널(Source Channel)이 있다. 싱크채널에 데이터를 써주면 파이프를 통해 소스채널로 전달되고, 다른 스레드가 소스채널을 통해 데이터를 읽을 수 있다. Pipe pipe = Pipe.open(); 우선 파이프 객체를 가져온다. Pipe.SinkChannel sinkChannel = pipe.sink(); String data = "Send message"; ByteBuffer buffer = ByteBuffer.allocate(64); buffer.clear(); buffer.put(data.getBytes()); b.. 2021. 1. 6.
Java NIO - 비동기 파일 채널 (AsynchronousFileChannel) Java NIO에서는 비동기적으로 파일 입출력을 실행할 수 있는 AsynchronousFileChannel을 제공한다. FileChannel은 동기적이다. read()/write() 요청을 하면 어찌되었던 메소드에서 리턴을 하고 다음 동작들이 실행된다. 이 동작을 비동기적으로 실행할 수 있도록 해주는 것이 AsynchronousFileChannel이다. Path path = Paths.get("/tmp/test.txt"); AsynchronousFileChannel channel = AsynchronousFileChannel.open(path, StandardOpenOption.READ); Path 객체로 파일 경로를 만들고 정적메소드 AsynchronousFileChannel.open()을 호출해서 채.. 2021. 1. 4.
Java NIO - 파일 다루기 (Files 클래스) Java NIO에는 파일을 손쉽게 다룰 수 있는 유틸성 메소드를 모아둔 Files 라는 클래스가 있다. 주로 Path 인터페이스와 함께 사용해서 파일과 디렉토리를 다루는데 사용된다. Files.exists() 주어진 Path에 해당하는 파일이 파일시스템에 존재하는지 여부를 확인한다. Path path = Paths.get("/tmp/test.txt"); boolean exists = Files.exists(path, LinkOption.NOFOLLOW_LINKS); Path 객체를 가져와서 Files.exists() 메소드의 첫 번째 인자로 넘겨준다. 두 번째 인자로 준 LinkOption.NOFOLLOW_LINKS는 exists() 메소드가 파일 경로를 찾아갈 때 심볼릭 링크는 따라가지 않겠다는 의미다.. 2021. 1. 3.
Java NIO - 파일 읽기 쓰기 (FileChannel, Path) Java NIO를 이용해서 파일을 다룰 수 있는 클래스와 예제 코드를 소개하겠다. 1. FileChannel 파일에서 데이터를 읽고 쓸 수 있는 채널이다. 파일 채널을 생성하기 위해서는 IO의 FileInputStream, FileOutputStream의 getChannel()메소드를 호출하거나 RandomAccessFile의 getChannel() 메소드로 열 수도 있다. // RandomAccessFile 이용 RandomAccessFile file = new RandomAccessFile("testFile.txt", "rw"); FileChannel channel1 = file.getChannel(); // FileInputStream 이용 FileInputStream fis = new FileIn.. 2021. 1. 2.
[Java 예제] Array를 Set으로 변환 예제 코드 Java에서 배열(Array)을 Set 타입으로 변경하는 코드는 다음과 같다. Set set = new HashSet(Arrays.asList(array)); 배열을 List로 변경한 다음 HashSet의 생성자에 넘겨주면 된다. 참고로 Arrays.asList(array) 동작은 O(1) 연산이다. 그냥 배열을 리스트 API로 해석할 수 있도록 만들어주는 역할을 할 뿐이다. List를 HashSet의 생성자로 넘겨주면, 리스트 크기의 해시 테이블을 먼저 만들고 리스트를 순회하면서 엘리먼트들을 하나씩 HashSet에 추가하는 연산을 수행한다. 즉, 최종적으로는 O(n) 동작이다. Set set = new HashSet(); Collecdtions.addAll(set, array); 결국 풀어쓰면 이 코드.. 2020. 12. 30.