집합(Set) 자료형은 집합고 관련된 것을 쉽게 처리하기 위해 만든 자료형이다.
집합 자료형은 HashSet
을 사용해 만들 수 있다.
import java.util.Array;
import java.util.HashSet;
public class Sample{
public static void main(String[] args){
HashSet<String> set = new HashSet<>(Arrays.asList("H","e","l","l","o"));
System.out.println(set); // [H,e,l,o] 출력
}
}
* Set 자료형에는 HashSet, LinkedHashSet 등의 자료형이 있다.
집합은 중복을 허용하지 않으므로 자료형의 중복을 제거하기 위한 필터 역할로도 사용된다.
예시로 s1은 1-6까지, s2는 4-8까지 값을 지닌 집합을 생성했다.
(제네릭스로 int를 사용할 경우 Wrapper 클래스인 Integer를 대신 사용해야 한다.)
import java.util.Arrays;
import java.util.HashSet;
public class Sample{
public void static main(String[] args){
HashSet<Integer> s1 = new HashSet<>(Array.asList(1,2,3,4,5,6));
HashSet<Integer> s2 = new HashSet<>(Array.asList(4,5,6,7,8,9));
...
HashSet<Integer> intersection = new HashSet<>(s1); // s1으로 instersection 생성
intersection.retainAll(s2) // 교집합 수행 (별도 변수 지정 없음)
System.out.println(intersecion); //[4,5,6] 출력
}
}
...
HashSet<Integer> union = new HashSet<>(s1); // s1으로 union 생성
union.addAll(s2); // 합집합 수행
System.out.println(union); // [1,2,3,4,5,6,7,8,9] 출력
}
}
...
HashSet<Integer> substract = new HashSet<>(s1); // s1으로 substract 생성
substract.removeAll(s2); // 차집합 수행
System.out.println(substract); //[1,2,3] 출력
}
}
import java.util.HashSet;
public class Sample{
public static void main(String[] args){
HashSet<String> set = new HashSet<>();
set.add("Jump");
set.add("To");
set.add("Java");
System.out.println(set); // [Java, To,Jump] 출력
}
}
import java.util.Arrays;
import java.util.HashSet;
public class Sample{
public static void main(String[] args){
HashSet<String> set = new HashSet<>();
set.add("jump");
set.addAll(Arrays.asList("To","Java"));
System.out.println(set); //[Java, To, Jump] 출력
}
}
import java.util.Arrays;
import java.util.HashSet;
public class Sample{
public static void main(String[] args){
HashSet<String> set = new HashSet<>(Arrays.asList("Jump","To","Java"));
set.remove("To");
System.out.println(set); // [Java, Jump] 출력
}
}
TreeSet과 LinkedHashSet
집합(Set)은 맵(Map)과 같이 순서가 없다는 특징이 있다. 그러나 순서대로 데이터를 가져오고 싶은 경우 TreeSet과 LinkedHashSet을 사용한다.
- TreeSet - 값을 오름차순으로 정렬해 저장
- LinkedHashSet - 입력 순서대로 값을 정렬해 저장
Enum은 서로 관련있는 여러 개의 상수 집합을 정의할 때 사용하는 자료형이다. 이를 통해 얻을 수 있는 장점은 다음과 같다.
1) 매직넘버(1과 같은 숫자 상숫값)를 사용할 때보다 코드가 명확해진다.
2) 잘못된 값을 사용함으로 인해 발생할 수 있는 위험성이 사라진다.
3) 요일이나 계절처럼 한정된 개수의 값들을 하나로 묶어서 사용하고 싶을 때 용이하다.
프로그래밍에서 상수로 선언하지 않은 숫짜를 매직넘버라 한다.
예) 카페에서 판매하는 커피 종류가 아메리카노/아이스아메리카노/카페라떼라 가정해보자.
이 경우 enum으로 상수 집합을 만들 수 있다.
enum CoffeType{
Americano,
IceAmeicano,
CafeLatte
};
정의한 상수 집합은 다음처럼 사용할 수 있다.
public class Sample{
enum CoffeType{
Americano,
IceAmeicano,
CafeLatte
};
public static void main(String[] args){
System.out.println(CoffeType.Americano); // Americano 출력
System.out.println(CoffeType.IceAmeicano);
System.out.println(CoffeType.CafeLatte);
}
}
자료형간 타입 변환 방법과 타입 고정 방법에 대해 알아보도록 한다.
public class Sample{
public static void main(String[] args){
String num = "123";
int n = Integer.parseInt(num);
System.out.println(n); //123 출력
}
}
1) 정수열 문자 앞에 빈문자열""
추가하기
public class Sample{
public static void main(String[] args){
int n = 123;
String num = ""+n; // 123 출력
System.out.printlnt(num); 123 출력
2) 그 외 방법
public class Sample{
public static void main(String[] args){
int n = 123;
String num1 = String.valueOf(n); // 방법1
String num2 = Integer.toString(n); // 방법2
System.out.println(num1); //123 출력
System.out.println(num2); //123 출력
}
}
Double.parseDouble
또는 Float.parseFloat
를 사용해 형변환 할 수 있다.
public class Sample{
public static void main(String[] args){
int n1 = 123;
double d1 = n1; // 정수에서 실수 변경시 캐스팅 필요 없음
System.out.println(d1); //123.0
double d2 = 123.456;
int n2 = (int) d2; // 실수>정수시 정수형으로 캐스팅해야 한다.
System.out.println(n2); // 소숫점이 생략된 123출력
}
}
실수형 문자열을 정수로 변경시 NumberFormatException이 발생하므로 주의해야 한다.
final은 자료형에 값을 단 한번만 설정할 수 있게 강제하는 키워드이다.
(즉, 값을 한 번 설정하면 값을 다시 설정할 수 있다.)
public class Sample{
public static void main(String[] args){
final int n = 123; // final로 설정하면 값 변경 불가
n = 456; // 컴파일 에러 발생
}
}
리스트도 final로 선선시 재할당 불가하다.
import java.util.ArrayList;
import java.util.Arrays;
public class Sample{
public static void main(String[] args){
final ArrayList<String> a = new ArrayList<>(Arrays.asList("a","b"));
a = new ArrayList<>(Arrays.asLisst("c","d")); // 컴파일 에러 발생
}
}
Unmodifiable List
리스트의 경우 final로 선언시 리스트에 값을 더하거나(add) 빼는(remove) 것은 가능하다. 다만 재할당만 불가능할 뿐이다. 만약 그 값을 더하거나 빼는 것도 불가능하게 하고 싶은 경우는
List.of
로 수정이 불가능한 리스트를 생성해야 한다.
import java.util.List;
public class Sample{
public static void main(String[] args){
final List<String> a = List.of("a","b");
a.add("c"); // UnsupportedOperationExcepion 발생
}
}