[Java] 자료형5 (Set/enum/final)

이용준·2022년 10월 25일
0

Java

목록 보기
8/29

1. 집합(Set)

집합(Set) 자료형은 집합고 관련된 것을 쉽게 처리하기 위해 만든 자료형이다.

1.집합 생성

집합 자료형은 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 등의 자료형이 있다.

2.집합 특징

  • 중복을 허용하지 않는다.
  • 순서가 없다(Unordered).
    리스트와 배열은 순서가 있어(Ordered) 인덱싱을 통해 자료형 값을 얻을 수 있지만, 집합은 순서가 없으므로 인덱싱으로 값을 얻을 수 없다.

    집합은 중복을 허용하지 않으므로 자료형의 중복을 제거하기 위한 필터 역할로도 사용된다.

3.교/합/차집합

예시로 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));

3-1.교집합(retainAll)

    ...
    HashSet<Integer> intersection = new HashSet<>(s1); // s1으로 instersection 생성
    intersection.retainAll(s2) // 교집합 수행 (별도 변수 지정 없음)
    System.out.println(intersecion); //[4,5,6] 출력
    }
  }  

3-2.합집합(addAll)

   ...
   HashSet<Integer> union = new HashSet<>(s1); // s1으로 union 생성
   union.addAll(s2); // 합집합 수행
   System.out.println(union);  // [1,2,3,4,5,6,7,8,9] 출력
   }
 }  

3-3.차집합(removeAll)

   ...
   HashSet<Integer> substract = new HashSet<>(s1); // s1으로 substract 생성
   substract.removeAll(s2); // 차집합 수행
   System.out.println(substract); //[1,2,3] 출력
   }
 }  

4.집합 관련 메소드

4-1.값 추가하기(add)

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] 출력
    }
  }  

4-2.값 여러개 추가(addAll)

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] 출력
    }
  }

4-3.특정값 제거(remove)

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 - 입력 순서대로 값을 정렬해 저장

2.열거형(Enum)

Enum은 서로 관련있는 여러 개의 상수 집합을 정의할 때 사용하는 자료형이다. 이를 통해 얻을 수 있는 장점은 다음과 같다.

1) 매직넘버(1과 같은 숫자 상숫값)를 사용할 때보다 코드가 명확해진다.
2) 잘못된 값을 사용함으로 인해 발생할 수 있는 위험성이 사라진다.
3) 요일이나 계절처럼 한정된 개수의 값들을 하나로 묶어서 사용하고 싶을 때 용이하다.

프로그래밍에서 상수로 선언하지 않은 숫짜를 매직넘버라 한다.

2-1.enum 만들기

예) 카페에서 판매하는 커피 종류가 아메리카노/아이스아메리카노/카페라떼라 가정해보자.
이 경우 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);
    }
  }     

3.형변환과 final

자료형간 타입 변환 방법과 타입 고정 방법에 대해 알아보도록 한다.

3-1. 형변환

1) 문자 > 정수(Integer.parseInt)

public class Sample{
  public static void main(String[] args){
    String num = "123";
    int n = Integer.parseInt(num);
    System.out.println(n);  //123 출력
  }
}  

2) 정수 > 문자열("")

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 출력
    }
  }

3) 실수 > 문자열

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이 발생하므로 주의해야 한다.

3-2. final

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 발생
        }
      }  
profile
뚝딱뚝딱

0개의 댓글