코딩 개발/Java

Java - Set, ArrayList

호소세 2023. 4. 11. 21:53
728x90
반응형

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를 확인하면서 사용방법을 터득하겠습니다.

반응형