본문 바로가기

자바32

[Java] 자바 스트림(Stream) 사용법 및 예제 자바 스트림(Stream) 자바의 스트림(Stream)은 'Java 8'부터 지원되기 시작한 기능이다. 컬렉션에 저장되어 있는 엘리먼트들을 하나씩 순회하면서 처리할 수 있는 코드패턴이다. 람다식과 함께 사용되어 컬렉션에 들어있는 데이터에 대한 처리를 매우 간결한 표현으로 작성할 수 있다. 또 한, 내부 반복자를 사용하기 때문에 병렬처리가 쉽다는 점이 있다. 'Java 6' 이전까지는 컬렉션의 엘리먼트들을 순회하기 위해서 Iterator 객체를 이용했다. ArrayList list = new ArrayList(Arrays.asList("a", "b", "c")); Iterator iterator = list.iterator(); while(iterator.hasNext()) { String value = .. 2021. 7. 11.
[Java] 제네릭(Generic) 사용법 및 예제 자바 제네릭 자바에서 제네릭은 데이터의 타입을 일반화하는 것을 의미한다. 클래스나 메소드에서 사용할 데이터의 타입을 컴파일 시에 미리 지정하는 방법이다. 제네릭(Generic)이라는 단어의 의미에도 '일반적인'이라는 뜻이 있다. 우리가 자바로 프로그래밍을 할 때 많이 사용하는 컬렉션 타입들이 제네릭을 구현되어 있다. 예를들어 ArrayList stringList = new ArrayList(); ArrayList integerList = new ArrayList(); ArrayList 객체의 경우 객체에서 다룰 데이터의 타입을 제네릭으로 입력하도록 되어 있다. ArrayList처럼 다양한 타입에 대해 동작하는 클래스를 구현하고 싶을 때 제네릭을 사용한다. 제네릭은 데이터의 타입을 클래스 내부에서 지정하는.. 2021. 7. 10.
[Java] 리소스 번들(ResourceBundle) 사용법 및 예제 자바 프로그램을 작성할 때, 로케일을 통한 국제화를 지원해야할 경우가 있다. 에러 메시지를 로케일에 따라 한국어로 찍었다가 일본어, 영어로 출력하는 경우를 생각해볼 수 있다. 자바는 리소스 번들(ResourceBundle)을 통해 이런 기능을 지원한다. ResourceBundle 리소스번들은 한번에 여러 로케일(언어와 국가)을 처리할 수 있다. 쉽게 현지화할 수 있고, 다른 언어로 번역해서 사용할 수 있다. 향후에 더 많은 로케일이 지원되어 쉽게 수정할 수 있다. 국제화 지원을 위한 프로퍼티 파일은 다음과 같이 구성되어야 한다. ${프로퍼티명}_${언어코드}_${국가코드}.properties ${프로퍼티명}_${언어코드}.properties ${프로퍼티명}.properties 예를 들어, 'message.. 2021. 6. 29.
[Java] 오버플로우 없이 정수 다루기 - BigInteger 사용법 및 예제 Java 혹은 C를 이용해서 프로그래밍하다보면 '오버플로우(Overflow)'라는 개념을 기억하고 있어야한다. 정수형 타입의 데이터를 저장하기 위해서 4바이트의 int 변수를 선언하게 된다. 문제는 int 타입의 변수는 -2,147,483,648 ~ 2,147,483,647 사이의 값만 저장할 수 있다는 점이다. 좀 더 큰 수를 저장하기 위해서 long 타입으로 선언하더라도 그 범위가 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807로 늘어날 뿐 모든 범위의 숫자를 정확하게 저장할 수 있는 것은 아니다 일반적인 경우라면 이 정도 범위의 숫자만으로도 문제가 없겠지만 과학 데이터를 다루는 프로그램이나 데이터의 숫자가 대륙의 스케일로 넘어가버리면 문제가 생기는 .. 2021. 6. 23.
[Java] 오버플로우 없이 실수 다루기 - BigInteger 사용법 및 예제 Java 혹은 C를 이용해서 프로그래밍하다보면 '오버플로우(Overflow)'라는 개념을 기억하고 있어야한다. 소수점을 가지고 있는 실수 타입의 데이터를 저장하기 위해서 double 혹은 float 타입의 변수를 선언하게 된다. 문제는 float 타입의 변수는 1.4E-45 ~ 3.4028235E38 사이의 값만 저장할 수 있다는 점이다. double 타입으로 선언하더라도 그 범위가 4.9E-324 ~ 1.7976931348623157E308 로 늘어날 뿐 모든 범위의 숫자를 정확하게 저장할 수 있는 것은 아니다. 게다가 부동 소수점 데이터의 경우 2진수로 데이터를 다루는 기본형 타입에서는 부정확한 결과가 나올 수도 있다. 따라서 정밀한 소수점 계산이 필요한 과학 데이터의 경우 double, float .. 2021. 6. 23.
[Java] TreeSet 사용법 및 예제 TreeSet TreeSet 클래스 역시 Set 인터페이스를 구현한 클래스다. Set 인터페이스를 구현했기 때문에 데이터에 대한 중복 저장을 하지 않으며, 저장된 순서를 유지하지 않는다. 해시코드를 이용해서 내부 해시 테이블에 데이터를 저장하는 HashSet과 다르게 TreeSet은 내부에 데이터 저장을 위한 RB-Tree(Red/Black Tree) 자료구조를 가지고 있다. RB 트리는 이진탐색트리(Binary Search Tree)의 일종으로 저장된 값들이 트리 전체에 고루 저장되도록하여 비정상적으로 트리의 높이가 높아지는 현상이 없게 만든 균형트리(Balanced Tree)다. 아무튼 내부에 RB 트리를 이용해서 값을 저장하기 때문에 현재까지 저장된 값들 중 최소 값 혹은 최대 값을 출력할 수 있으.. 2021. 6. 4.
[Java] Vector 사용법 및 예제 Vector Vector 클래스는 ArraList 클래스처럼 List 인터페이스를 구현하고 있다. Vector 클래스는 ArrayList와 동일한 방법으로 데이터를 저장하고 있다. ArrayList처럼 저장 순서를 기억하고, 중복 데이터의 저장을 허용한다. 인덱스를 통해 특정 위치에 데이터를 추가하거나 특정 위치의 데이터를 제거할 수도 있다. Vector 객체 역시 데이터가 추가되면서 필요한 경우 자동으로 크기가 늘어나도록 구현되어 있다.(참고 : [Java] ArrayList 사용법 및 예제) ArrayList 클래스와 Vector 클래스는 큰 차이가 없다고 생각해도 된다. 다만 Vector 클래스는 멀티스레드 환경에서 동기화처리가 되어 있다. 반면 ArrayList 클래스는 멀티스레드 환경에 대한 고.. 2021. 5. 29.
[Java] InputStream 객체와 File 객체 상호 변환하기 자바 프로그래밍에서 InputStream 객체를 File 객체로 만들거나 File 객체를 InputStream 객체로 만들어야 할 경우가 종종있다. 사용하고자하는 API에서 어떤 객체를 입력으로 받는지에 따라 상호변환이 필요할 수 있다. File 객체에서 InputStream 객체 얻기 우선 File 객체를 InputStream 객체로 만들어보자. File file = new File("path to file"); InputStream inputStream = new FileInputStream(file); FileInputStream 객체를 생성할 때, File 객체를 넘겨주면 된다. 간단한 사용법이다. InputStream 객체에서 File 객체 만들기 InputStream 객체는 어디에선가 데이터를.. 2021. 5. 26.
[Java] ArrayList 사용법 및 예제 ArrayList 자바 프로그램에서 데이터의 나열을 저장하기 위해서 List 인터페이스를 구현한 클래스를 사용한다. ArrayList는 List 인터페이스를 구현하는 리스트로 배열처럼 연속된 메모리 공간을 사용하며, 인덱스를 이용해서 특정위치의 데이터에 바로 접근할 수 있다. 한번 생성되면 크기가 변하지 않는 배열과는 달리 객체가 추가되면서 필요할 경우 자동으로 크기가 늘어나도록 내부적으로 구현되어 있다는게 ArrayList 클래스의 특징이다. 리스트 자료구조를 만들고 싶을 때, 가장 많이 사용되는 클래스다. ArrayList 사용법 ArrayList 생성 import java.util.ArrayList; 자바는 java.util.ArrayList 클래스를 통해 ArrayList를 제공하고 있다. Arr.. 2021. 5. 24.