Set 이란?
Set은 순서가 없는 고유한 요소의 목록입니다.
Set 구현 Class
Set 구현 클래스로는 HashSet, TreeSet, LinkedHashSet이 있습니다.
- HashSet : Set을 구현하는 대표 클래스로 데이터 중복할 수 없고 순서를 보장하지 않습니다.
- TreeSet : HashSet 특성에 오름차순으로 데이터를 정렬합니다.
- LinkedHashSet : 데이터를 중복해서 저장할 수 없고 입력한 순서대로 데이터를 저장합니다
Set의 예시
HashSet
Set<String> set = new HashSet<String>();
set.add("apple");
set.add("banana");
set.add("orange");
System.out.println(set);
//[banana, orange, apple]
TreeSet
Set<String> set = new TreeSet<String>();
set.add("apple");
set.add("banana");
set.add("orange");
System.out.println(set);
//[apple, banana, orange]
LinkedHashSet
Set<String> set = new LinkedHashSet<String>();
set.add("banana");
set.add("apple");
set.add("orange");
System.out.println(set);
//넣은 순서대로 들어간다.[banana, apple, orange]
ArrayList란?
Java의 List 인터페이스의 크기 조정 가능한 배열 구현입니다. null을 포함한 모든 요소를 허용하며 모든 선택적 목록 작업을 수행합니다. 이 클래스는 List 인터페이스를 구현하는 것 외에도 내부적으로 사용되는 배열의 크기를 조작하는 메서드를 제공합니다.
다양한 메소드들은 java api를 통해 확인하면 됩니다.
Generic을 사용해서 미리 데이터 타입을 지정하여 타입의 안정성과 객체 캐스팅 절차를 감소할 수 있습니다.
*참고 : jdk 1.5 이상 부터는 자동으로 primitive type data를 reference type data 로 변환 후 저장됩니다.
예제
Generic을 사용하지 않은 예제
public class TestArrayList2 {
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void main(String[] args) {
ArrayList<Integer> list=new ArrayList<Integer>();
//jdk 1.5 이상 auto boxing : 자동으로 primitive type data를
//reference type data 변환 후 저장
list.add(22);// list.add(new Integer(22)); 와 동일
System.out.println(list.get(0));
System.out.println(list.get(0).getClass());//class java.lang.Integer
// Generic Test
ArrayList personList=new ArrayList(); // Generic 적용하지 않은 리스트 사용
personList.add(new Person("손흥민",30));
personList.add(new Person("이강인",24));
personList.add(new Person("정우영",26));
//personList.add(77777);// Generic을 사용하지 않아 다른 형태의 데이터가 저장가능 => 오류 가능성 내재
//첫번째 요소를 가져와서 나이를 출력
Object obj=personList.get(0);
Person per=(Person)obj; // Object Down Casting 필요
System.out.println(per.getAge());
System.out.println("*********************");
// personList 요소들의 이름 모두 출력
for(int i=0;i<personList.size();i++) {
Person p=(Person)personList.get(i); // Object Down Casting 필요
System.out.println(p.getName());
}
}
}
Generic을 사용하지 않았을 때 컴파일에러가 생성되겠지만 위에 작성한
@SuppressWarnings({ "rawtypes", "unchecked" })
로 에러를 막았습니다. 저렇게 하면 선수의 이름이나 나이를 불러올 때 Object down casting을 하여 값을 불러와야하기 때문에 코드가 복잡해 질 뿐더러 비효율적인 동작이 됩니다. 따라서, Generic을 사용하여 효율성을 높여야합니다.
Generic을 사용한 예제
public class TestArrayList3 {
public static void main(String[] args) {
ArrayList<Person> personList=new ArrayList<>(); // Generic 적용하지 않은 리스트를 사용해본다
personList.add(new Person("손흥민",30));
personList.add(new Person("이강인",24));
personList.add(new Person("정우영",26));
//첫번째 요소를 가져와서 나이를 출력 ( TestArrayList2 와 비교 ) -> Generic 적용 장점
System.out.println(personList.get(0).getAge());// casting 필요없음
// 다른 자료형 데이터를 넣어본다
// personList.add(7777); // Generic 적용하여 다른 자료형은 입력 불가 => 타입 안정성
// personList 의 요소들의 모든 이름을 출력해본다
for(int i=0;i<personList.size();i++) {//TestArrayList2 와 비교-> Generic 적용 장점 : 캐스팅 절차 감소
System.out.println(personList.get(i).getName());
}
}
}
기존에 사용하던 down casting을 사용하지 않고 단 한 줄만에 나이 혹은 이름을 가져올 수 있습니다. 이러한 상황에는 누가봐도 이 방법을 사용하려고 할 것입니다.
소감
아무래도 프로젝트를 할 때 Array를 많이 사용하게 될 것 같은데, 미리미리 연습을 하여 더 복잡한 데이터들을 처리할 때 수월하게 사용할 수 있도록 해야겠습니다.
또한, 처음에는 왜 primitive값을 넣을 수 없는지 궁금했지만 원래부터가 Object로 저장이되는 것이라고 합니다. 계속 API를 확인하면서 사용방법을 터득하겠습니다.
'코딩 개발 > Java' 카테고리의 다른 글
Java - Exception handling (feat. try, catch, throw, throws) (2) | 2023.04.14 |
---|---|
Java - Map (0) | 2023.04.12 |
Java - Interface (feat. abstract) (0) | 2023.04.11 |
Java - abstract (추상클래스, 추상 메소드) (0) | 2023.04.09 |
Java - Static (feat. final, metaspace) (0) | 2023.04.09 |