2023.08.13 - 제네릭스, 컬렉션 복습

mjjin·2023년 8월 13일
0

제네릭스


// 제네릭스에서 지원하는 것들은 객체들이다.
// 사용하기 위해서는 Wrapper가 필요하다.

Integer[] iArray = {1, 2, 3, 4, 5};
Double[] dArray = {1.0, 2.0, 3.0, 4.0, 5.0};
String[] sArray = {"A", "B", "C", "D", "E"};

private static <T> void printAnyArray(T[] array) {
    for (T t : array) {
        System.out.print(t + " ");   // 1 2 3 4 5
    }
    System.out.println();
}

printAnyArray(iArray);
printAnyArray(dArray);
printAnyArray(sArray);

제네릭스 클래스

  • 하나의 클래스에서 서로 다른 형태의 데이터를 받아서 한번에 처리 할 수 있다.
  • 코드의 중복도 없고 값을 가져올 때 형변환도 없기 때문에
  • 개발상의 실수도 없앨 수 있다.
//클래스
public class Coffee <T> {
    public T name;
    public Coffee(T name) {
        this.name = name;
    }
    public void ready() {
        System.out.println("커피 준비 완료 : " + name);
    }
}
Coffee<Integer> c5 = new Coffee<>(35); 
c5.ready(); // 출력 : 커피 준비 완료 : 35
int c5Name = c5.name;
System.out.println("주문 고객 번호 : " + c5Name); // 출력 : 주문 고객 번호 : 35


Coffee<String> c6 = new Coffee<>("조세호");
c6.ready(); // 출력 : 커피 준비 완료 : 조세호
String c6Name = c6.name;
System.out.println("주문 고객 이름 : " + c6Name); // 출력 : 주문 고객 이름 : 조세호
//값을 두 개 이상 받을 때
public static <T, V> void orderCoffee(T name, V coffee){
    System.out.println(coffee + " 준비 완료 : " + name);
}

컬렉션

컬렉션 프레임워크 (List, Set, Map)
많은 데이터를 쉽고 편리하게, 효과적으로 관리하기 위해
자바에서 제공해주는 클래스들의 모음

ArrayList

ArrayList<String> list = new ArrayList<>();
// 데이터 추가
list.add("유재석");
list.add("조세호");
list.add("김종국");
list.add("박명수");
list.add("강호동");
// 데이터 조회
for (int i = 0; i < 5; i++) {
    System.out.print(list.get(i) + ", ");
}
System.out.println();
System.out.println("-----------------");
// 삭제
System.out.println("신청 학생 수 : " + list.size()); // 5
list.remove("박명수");
System.out.println("신청 학생 수 : " + list.size()); // 4
System.out.println("-----------------");
System.out.println("남은 학생 수 (제외 전): " + list.size()); // 4
list.remove(list.size() - 1);
System.out.println("남은 학생 수 (제외 후): " + list.size()); // 3
System.out.println("---------------------");
// 순회
for (String s: list) {
    System.out.println(s);
}
System.out.println("---------------------"); // 유재석, 조세호, 김종국
// 변경 (수강권 양도)
System.out.println("수강권 양도 전 : " + list.get(0)); // 유재석
list.set(0, "이수근");
System.out.println("수강권 양도 후 : " + list.get(0)); // 이수근
System.out.println("---------------------"); // 유재석, 조세호, 김종국
// 포함 확인
System.out.println(list.indexOf("김종국")); // 2
// 리스트내에 포함되었는가?
if (list.contains("김종국")) {
    System.out.println("수강 신청 성공");
} else {
    System.out.println("수강 신청 실패");
}
System.out.println("----------------");
// 전체 삭제
list.clear();
if (list.isEmpty()) { // isEmpty()로 비었는지 확인
    System.out.println("학생 수 : " + list.size());
    System.out.println("리스트가 비었습니다.");
}
System.out.println("----------------");
// 다음 학기에 새로 공부 시작
list.add("유재석");
list.add("조세호");
list.add("김종국");
list.add("박명수");
list.add("강호동");
// 정렬
Collections.sort(list);
for (String s: list) {
    System.out.println(s);
}

LinkedList

LinkedList<String> list = new LinkedList<>();
// 데이터 추가
list.add("유재석");
list.add("조세호");
list.add("김종국");
list.add("박명수");
list.add("강호동");
// 데이터 조회 (인덱스)
System.out.println(list.get(0)); // 유재석
System.out.println(list.get(1)); // 조세호
System.out.println(list.getFirst()); //유재석
System.out.println(list.getLast()); // 강호동
System.out.println("------------------");
// 추가
list.addFirst("서장훈"); //맨 처음에 추가
list.addLast("김희철"); // 맨 마지막에 추가
list.add(1, "김영철"); // 1번 index에 "김영철"추가
for (String s : list) {
    System.out.print(s + ","); //출력 : 서장훈,김영철,유재석,조세호,김종국,박명수,강호동,김희철
}
System.out.println("-------------------------");
// 삭제
System.out.println("남은 학생 수 (제외 전) : " + list.size()); // 8
list.remove(list.size() -1);
System.out.println("남은 학생 수 (제외 후) : " + list.size()); // 7
list.removeFirst(); //처음 데이터 삭제
list.removeLast(); // 마지막 데이터 삭제
System.out.println("남은 학생 수 (제외 후) : " + list.size()); // 5

HashSet

Set -> 데이터의 중복을 허용하지 않음
순서 보장이 필요할 때에는 LinkedHashSet으로 변경

HashSet<String> set = new HashSet<>();
// 데이터 추가
set.add("삼겹살");
set.add("쌈장");
set.add("음료");
set.add("소금");
set.add("후추");
set.add("삼겹살");
set.add("깻잎");
set.add("상추");
set.add("삼겹살");
System.out.println("총 구매 상품 수 : " + set.size());
//순회
for (String s : set) {
    System.out.print(s + ","); //출력 소금,쌈장,깻잎,음료,후추,상추,삼겹살 (중복x, 순서보장x)
}
System.out.println();
//확인
if (set.contains("삼겹살")) {
    System.out.println("삼겹살 사러 출발");
}
System.out.println("----------------");
//삭제
System.out.println("총 구매 상품 수 (삼겹살 구매 전) : " +set.size()); // 7
set.remove("삼겹살");
System.out.println("총 구매 상품 수 (삼겹살 구매 후) : " +set.size()); // 6
System.out.println("-------------------");
//전체 삭제
set.clear();
if (set.isEmpty()) {
    System.out.println("남은 구매 상품 수 : " + set.size());
    System.out.println("집으로 출발");
}

HashMap

// Map (Key, Value)
// 순서 보장이 필요할 시 LinkedHashMap<>() 사용
HashMap<String, Integer> map = new HashMap<>();
// 데이터 추가
map.put("유재석", 10);
map.put("박명수", 5);
map.put("김종국", 3);
System.out.println("총 고객 수 :" + map.size());
System.out.println("------------------");
// 조회
System.out.println("유재석 님의 포인트 : " + map.get("유재석")); // 10
System.out.println("유재석 님의 포인트 : " + map.get("박명수")); // 10
// 확인
if (map.containsKey("서장훈")) {
    int point = map.get ("서장훈"); map.put("서장훈", ++point);
    System.out.println("서장훈 님의 누적 포인트 : " + map.get("서장훈"));
} else {
    map.put("서장훈", 1);
    System.out.println("서장훈님 신규 등록 (포인트 1)");
}
System.out.println("---------------------");
// 삭제
map.remove("유재석");
System.out.println(map.get("유재석")); //null
System.out.println("--------------------");
// 전체 삭제
map.clear();
if (map.isEmpty()) {
    System.out.println("남은 고객 수 : " + map.size());
}
System.out.println("----------------------");
map.put("유재석", 10);
map.put("박명수", 5);
map.put("김종국", 3);
map.put("서장훈", 15);
// Key 확인
for (String key : map.keySet()) {
    System.out.println(key); // 박명수, 유재석, 김종국, 서장훈 (순서 보장X)
}
System.out.println("-----------------");
// Value 확인
for (int value: map.values()) {
    System.out.println(value); // 5, 15, 10, 15 (순서 보장 X)
}
System.out.println("------------");
// Key, Value 함께 확인
for (String key : map.keySet()) {
    System.out.println("고객 이름 : " + key + "\t\n포인트 : "  + map.get(key));
}
System.out.println("---------------------");

Iterator

컬럭션 프레임워크에서 배운 List나 Set와 같은 데이터를 순회하는 것

List<String> list = new ArrayList<>();
list.add("유재석");
list.add("(알 수 없음)");
list.add("김종국");
list.add("(알 수 없음)");
list.add("강호동");
list.add("(알 수 없음)");
list.add("박명수");
list.add("(알 수 없음)");
list.add("조세호");
for (String s : list) {
    System.out.println(s);
}
System.out.println("-------------");
// 이터레이터라는 자료형으로 받아서 처리해야함
// 인텔리제이에서는 Ctrl + Alt + V 쓰면 자동으로 완성해줌
Iterator<String> it = list.iterator();
System.out.println(it.next()); // 다음 데이터 출력, 유재석
System.out.println(it.next()); // 다음 데이터 출력, (알 수 없음)
System.out.println(it.next()); // 다음 데이터 출력, 김종국
System.out.println(it.next()); // 다음 데이터 출력, (알 수 없음)
System.out.println("-------------");
// 커서를 처음으로 돌리기
it = list.iterator();
// 모든 데이터 순회
while(it.hasNext()) {
    System.out.println(it.next());
}
System.out.println("-------------");
it = list.iterator();
// 알 수 없음 삭제하기
while (it.hasNext()) {
    String s = it.next();
    if (s.contains("(알 수 없음)")) {
        it.remove(); // 삭제
    }
}
it = list.iterator();
while (it.hasNext()) {
    System.out.println(it.next()); // 유재석, 김종국, 강호동, 박명수, 조세호
}
HashSet<String> set = new HashSet<>();
set.add("유재석");
set.add("박명수");
Iterator<String> itSet = set.iterator();
// 확인
while (itSet.hasNext()) {
    System.out.println(itSet.next());
}
System.out.println("----------------");
HashMap<String, Integer> map = new HashMap<>();
map.put("유재석", 10);
map.put("박명수", 5);
// map은 iterator가 없음.
Iterator<String> itMapKey = map.keySet().iterator();
while (itMapKey.hasNext()) {
    System.out.println(itMapKey.next());
}
System.out.println("---------");
Iterator<Integer> itMapValues = map.values().iterator();
while (itMapValues.hasNext()) {
    System.out.println(itMapValues.next());
}
System.out.println("--------------");
//키와 밸류가 셋으로 옴, 한번에 출력하기
Iterator<Map.Entry<String, Integer>> itMap = map.entrySet().iterator();
while (itMap.hasNext()) {
    System.out.println(itMap.next()); // 박명수=5, 유재석=10
}

퀴즈

public class _Quiz_09 {
    public static void main(String[] args) {
        ArrayList<Student> list = new ArrayList<>();
        list.add(new Student("유재석", "파이썬"));
        list.add(new Student("박명수", "자바"));
        list.add(new Student("김종국", "자바"));
        list.add(new Student("조세호", "C"));
        list.add(new Student("서장훈", "파이썬"));
        System.out.println("자바 자격증을 보유한 학생");
        System.out.println("-------------------");
        for (Student s : list) {
            if (s.certification.equals("자바")) {
                System.out.println(s.name);
            }
        }
    }
}
class Student {
    public String name;
    public String certification;
    public Student(String name, String certification) {
        this.name = name;
        this.certification = certification;
    }
}

0개의 댓글