Problem 1
우선 해당 데이터들을 저장할 제네릭 클래스를 생성해야 한다.
문제에서 제공되었듯 2개의 데이터를 매개변수로 하는 제네릭 클래스의 객체로 생성하여 처리한다.
또한, 접근자를 생성하여 데이터에 접근할 수 있도록 해야한다.
class SimplePair<T> { // 제네릭 클래스 생성
public T t1, t2;
public SimplePair(T t1, T t2) { // 생성자 설정
this.t1 = t1;
this.t2 = t2;
}
public T getFirst() { // 접근자 생성
return t1;
}
public T getSecond() { // 접근잣 생성
return t2;
}
}
public class SimplePairTest {
public static void main(String[] args) {
SimplePair<String> pair = new SimplePair<String>("apple", "tomato"); // 제네릭 클래스 객체 생성
System.out.println(pair.getFirst()); // 접근자를 활용하여 해당 정보에 접근한다.
System.out.println(pair.getSecond());
}
}
위 코드와 같이 제네릭 클래스를 생성하고, 객체를 생성하여 접근자를 활용하여 데이터의 정보에 접근하는 코드를 작성하였다.
실행결과
Problem 2
set은 자료를 저장할 때 중복을 허용하지 않는 특성을 지니고 있다.
그러한 set을 구현하기 위해 여러 set의 구현체 중 Hashset을 사용하고자 한다.
또한 중복을 허용하지 않기에 특정 데이터가 담긴 컬렉션에서 다른 요소들을 모두 더하면 합집합이, 컬렉션에 저장된 데이터와 동일한 것만 남기고 모두 삭제하면 차집합을 구할 수 있다.
set에서는 addAll메소드와 retainAll메소드를 활용하면 쉽게 코드를 구현할 수 있다.
import java.util.HashSet;
import java.util.Set;
public class HashSetTest {
public static void main(String[] args) {
Set<String> s1 = new HashSet<String>(); // 데이터를 저장할 두개의 set 객체 생성
Set<String> s2 = new HashSet<String>();
// 데이터 추가
s1.add("A");
s1.add("B");
s1.add("C");
s2.add("A");
s2.add("D");
// s1 객체의 데이터를 저장할 union 객체 생성
Set<String> union = new HashSet<String>(s1);
union.addAll(s2); // 두 객체의 데이터를 모두 더해 union 객체에 저장
System.out.println(union);
// s1 객체의 데이터를 저장할 intersection 객체 생성
Set<String> intersection = new HashSet<String>(s1);
intersection.retainAll(s2); // 두 객체의 데이터 중 중복된 데이터를 제외한 값들을 모두 제거
System.out.println(intersection);
}
}
실행결과
S1 에는 {"A", "B", "C"} , S2에는 {"A", "D"} 가 저장되어 있다.
정상적으로 합집합인 A B C D 그리고 교집합인 A가 출력됨을 확인할 수 있다.
Problem 3
map은 key와 value를 한쌍으로 저장하는 인터페이스이다.
여기서 key는 value에 접근하기 위한 역할을 하는 데이터이다.
map은 HashMap을 사용하여 구현한다.
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class MapTest {
public static void main(String[] args) {
// Map 객체와 Scanner 객체를 생성
Map<String, String> countryCapitalMap = new HashMap<>();
Scanner scanner = new Scanner(System.in);
// Map 객체에 Key와 Value의 쌍을 저장.
countryCapitalMap.put("USA", "Washington");
countryCapitalMap.put("Japan", "Tokyo");
countryCapitalMap.put("China", "Beijing");
countryCapitalMap.put("UK", "London");
countryCapitalMap.put("Korea", "Seoul");
System.out.print("국가의 이름을 입력하세요 : ");
String country = scanner.nextLine();
System.out.print(country + "의 수도 : ");
// key를 사용해서 value의 데이터 값을 반환
System.out.println(countryCapitalMap.get(country));
}
}
실행결과
Problem 4
ArrayList가 데이터의 추가와 제거가 편하다는 장점이 있지만 단점이 없는 것은 아니다.
여러 데이터가 저장되어 있다고 가정할 때 첫번째 데이터를 추가 혹은 삭제한다면 맨 앞 요소를 수정하고 이후 데이터들의 인덱스를 하나씩 이동시켜 다시 저장해야 한다.
이와 대비되는 LinkedList의 경우에는 앞 요소를 변동한 후 맨 앞 요소를 헤더로 재선언 하면 되기에 연산 소요시간이 ArrayList보다 짧다.
해당 코드를 완성하고 맨 앞에 랜덤 값을 10만번 추가하여 걸리는 시행시간을 측정해보겠다.
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
public class ListPerformanceCompariso {
private static final int ELEMENTS_COUNT = 100000; // 배열의 크기
private static final int OPERATIONS_COUNT = 10000; // 연산 횟수
public static void main(String[] args) {
// ArrayList 및 linkedList 객체 생성
List<Integer> arrayList = new ArrayList<>(ELEMENTS_COUNT);
List<Integer> linkedList = new LinkedList<>();
Random random = new Random();
// ArrayList 맨 앞 요소에 랜덤 값을 10만번 추가
long startTime = System.nanoTime();
for(int i = 0; i < OPERATIONS_COUNT; i++) {
arrayList.add(0, random.nextInt());
}
long endTime = System.nanoTime();
// 시작 시간과 끝 시간을 측정하여 결과를 출력
System.out.println("ArrayList add: " + (endTime - startTime) / 1e6 + " ms");
// LinkedList 맨 앞 요소에 랜덤 값을 10만번 추가
long startTime2 = System.nanoTime();
for(int i = 0; i < OPERATIONS_COUNT; i++) {
linkedList.add(0, random.nextInt());
}
long endTime2 = System.nanoTime();
// 시작 시간과 끝 시간을 측정하여 결과를 출력
System.out.println("LinkedList add: " + (endTime2 - startTime2) / 1e6 + " ms");
}
}
실행결과
예상했던 결과와 같이 ArrayList가 LinkedList보다 맨 앞에 요소를 추가할 시 걸리는 시간이 더 길다는 사실을 확인할 수 있다.
'JAVA > JAVA프로그래밍(실습)' 카테고리의 다른 글
순천향대 JAVA프로그래밍LAB 13주차 레포트 (0) | 2024.06.04 |
---|---|
순천향대 JAVA프로그래밍LAB 12주차 레포트 (0) | 2024.05.28 |
순천향대 JAVA프로그래밍LAB 10주차 레포트 (0) | 2024.05.14 |
순천향대 JAVA프로그래밍LAB 9주차 레포트 (0) | 2024.05.07 |
순천향대 JAVA프로그래밍LAB 7주차 레포트 (0) | 2024.04.23 |