티스토리 뷰

_08_Iterator

public class _08_Iterator {
    public static void main(String[] args) {
        // 이터레이터
        // 컬렉션 프레임워크의 데이터를 순회하는 거라고 생각하면 쉽다.

        List<String> list = new ArrayList<>();
        // ctrl하고 클릭해보면 List는 인터페이스이고, ArrayList는 클래스이다.
        // ArrayList는 List 인터페이스를 상속받는 형태로 구현이 되는 것이에요.
        // 그래서 이는 다형성 사례라고 할 수 있음. LinkedList 써도 마찬가지

        //추가
        // 알 수 없는 오류로 잘못 된 더미 값이 들어온다고 쳐보자
        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("------------");

        // 이터레이터는 인텔리제이 내장이어서 편하게 쓸 수 있다.
        //it는 약자로 편하게 쓴 것.

        // 값 가져오기
        // list.iterator(); => 그런데, Ctrl + Alt + V 누르면 자동으로 Iterator<String> iterator = list.iterator(); 형식으로 바꿔줌!

        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());
        // 하나하나씩 번갈아가면서 출력 // // 커서 위치를 처음으로 이동
        // 그리고 다음 데이터를 하나씩 하나씩 가지고 온다고 생각하면 된다. 유재석~4번째 알수없음까지

        // 그런데 이터레이터는 index가 없다. 몇 번째 까지 순회하징???
        //hasNext를 통해 순회함.

        System.out.println("---------");

        it = list.listIterator(); // 커서 위치를 다시 처음으로 이동 객체를 처음 것을 불러오면 됨.
        while ((it.hasNext())) {
            System.out.println(it.next()); // 반복을 도는 동안 그 다음값들을 계속 찍어줘. 다음 값이 없으면 탈출.
        }
        System.out.println("------------");

    // 지우는 것부터 다음 시간에!

    //Day15 시작
    //커서 다시 처음으로 이동
        it = list.iterator();


        while (it.hasNext()) {

            // 먼저 데이터를 가지고 와서 우리가 삭제할 데이터인지를 확인해보자.
            String s = it.next(); // 현재 커서가 있는 위치에서부터 그 다음 데이터들을 차례로 찍어줌
            if(s.contains("(알 수 없음)")) { // 알 수 없음일 때,
                it.remove(); // 삭제
            }
        }

        System.out.println("-----------");

        //잘 삭제 되었는지 확인하기
        it = list.iterator();
        while (it.hasNext()) {
            System.out.println((it.next())); // 알 수 없음이 빠진 데이터들이 출력되겠지.
        }
        System.out.println("----------");

        //-------------------------------------
        //이터레이터를 맵이나 Set에서도 쓸 수 있다
        // 먼저 HashSet을 보자.
        HashSet<String> set = new HashSet<>();
        set.add("유재석");
        set.add("박명수");

        //set.iterator()을 쓴 다음에, ctrl + alt + v 하면 자동으로 객체가 생성된다!
        // 편리한 기능이니까 참고하도록.
        Iterator<String> itSet = set.iterator(); // Set에서 포함된 데이터를 찍어보는 부분을 만들기
        while (itSet.hasNext()) {
            System.out.println(itSet.next()); // 근데 순서는 보장이 안 되기 때문에 어떤 식으로 나올지는 모른다.
        }
        System.out.println("-------------------");

        // HashMap에서 써보기.
        HashMap<String, Integer> map = new HashMap<>(); // 객체 생성
        map.put("유재석", 10);
        map.put("박명수", 5);

        //map.iterator(); 내장함수로 제공되지 않음.
        //그럼 어떤식으로 불러와야할까. map.keuSet() 이용
        // key와 value를 이터레이터 통해 순회 하면 됨
        //map.keySet().iterator(); // 역시 ctrl + alt + v를 통해 객체를 생성
        // map.keySet().iterator();
        Iterator<String> itMapKey = map.keySet().iterator();
        while (itMapKey.hasNext()) {
            System.out.println(itMapKey.next());
        }
        System.out.println("---------");

 

Quiz

package Prac12;

import java.util.ArrayList;

// 아이유 파이썬
// 정우성 자바
// 유재석 자바
// 한소희 C
// 강동원 파이썬

// 자바 자격증을 보유한 학생
// ----------------------
// 박명수
// 김종국

class Student15 {
  public String name;
  public String certification;

  public Student15(String name, String certification) {
    this.name = name;
    this.certification = certification;
  }
}
public class Day15Quiz {

  public static void main(String[] args) {
    ArrayList<Student15> list = new ArrayList<>();
    list.add(new Student15("아이유", "파이썬"));
    list.add(new Student15("정우성", "자바"));
    list.add(new Student15("유재석", "자바"));
    list.add(new Student15("한소희", "C"));
    list.add(new Student15("강동원", "파이썬"));

    System.out.println("자바 자격증을 보유한 학생");
    System.out.println("----------");

    for(Student15 student : list) {
      if(student.certification.equals("자바")) { //student의 certification에 "자바" 가 있니?
        System.out.println(student.name); //Sturdent의 이름을 뽑아달라.
      }
    }
  }
}

 

익명클래스

_01_AnonymousClass

package Prac15;

public class _01_AnonymousClass1 {
  public static void main(String[] args) {
    // 익명 클래스 : 이름이 없는 클래스
    // 우리는 지금까지 클래스는 최상단에 정의해 왔는데,
    // 사실은 클래스도 다른 클래스 내부에 만들 수 있다.(내부 클래스)
    // 내부 클래스 중 특이한 게 익명클래스

    Coffee c1 = new Coffee(); // 순서 2
    c1.order("아메리카노");
    System.out.println("--------");

    Coffee c2 = new Coffee(); // 순서 3
    c2.order("라테");
    System.out.println("-----------");

    // 순서 4
    // 내가 커피숍 사장인데,
    // 굉장히 친한 친구 방문. 절친이니까 커피에 조각케이크를 서비스를 주려고 한다.
    // 이 때 쓰는 게 익명클래스. 한 번 보자.

    Coffee specialCoffee = new Coffee() {
      @Override
      public void order(String coffee) {
        //order 쓰면 자동완성. 그것 선택하면 super()로 바뀐다.
        
        // 이게 무슨 뜻이냐면, Coffee 객체를 만들 때, specialCoffee 객체만을 위한 order라는 동작을 재정의 할 수 있다는 것.
        /*
        그럼 우리가 Coffee를 상속해가지고, 다른 specialCoffee라는 클래스를 만들 필요 없이,
        그냥 메서드만 재정의 해서 우리가 원하는 동작을 추가할 수 있는 거죠.
         */
        super.order(coffee); // 주문하신 (커피) 나왔습니다. 는 기본값이고
        System.out.println("(귓속말) 딸기 케이크는 서비스예요."); // 추가로...!
      }

      @Override
      public void returnTray() {
        System.out.println("(귓속말) 자리에 두시면 제가 치울게요.");
      }
    };
    specialCoffee.order("바닐라 라테"); // 주문하신 바닐라 라테 나왔습니다. // 순서 6
    specialCoffee.returnTray();
  }
}

class Coffee { //순서 1
  public void order(String coffee) {
    System.out.println("주문하신 " + coffee + " 나왔습니다.");
  }

  public void returnTray() { // 순서 7. 접시를 반남하는 기능을 추가
    System.out.println("커피 반납이 완료되었습니다. ");
  }
}

 

_02_AnonymousClass

package Prac15;

public class _02_AnonymousClass2 {
  // 예시 : 집에서 만드는 수제버거

  // 자 그런데, 수제버거는 레시피가 집집마다 다를 수 있지.
  // 그래서 수제버거 추상클래스를 상속하지 않고 익명 클래스를 이용해서 처리해보도록 하겠다.
  public static void main(String[] args) {
    HomeMadeBurger momMadeBurger = getMomMadeBurger();
    momMadeBurger.cook();
    System.out.println("------------");

    HomeMadeBurger broMadeBurger = getBroMadeBurger();
    broMadeBurger.cook();
  }

  private static HomeMadeBurger getBroMadeBurger() {
    return new HomeMadeBurger() {
      @Override
      public void cook() {
        System.out.println("집에서 만드는 동생표 군대리아");
        System.out.println("재료: 빵, 치킨패티, 양배추 샐러드, 딸기잼, 치즈, 삶은 계란");
      }
    };
  }



  public static HomeMadeBurger getMomMadeBurger() {
    return new HomeMadeBurger() {
      @Override
      public void cook() {
        System.out.println("집에서 만드는 엄마표 수제 버거");
        System.out.println("재료 : 빵, 소고기패티, 해쉬브라운, 양상추, 마요네즈, 피클");

      }
    };

  }
}

    // 코드 한쪽에 다 때려넣으면 복잡하니까 별도의 메서드를 만들어서 처리하도록 하자.


  abstract class HomeMadeBurger {
  // 앞서 배운 것처럼 추상클래스이기 때문에 HomeMadebuger로는 바로 객체를 만들 수는 없고,
  // 이 클래스를 상속해서 cook() 메서드를 재정의 해야만 객체를 만들 수가 있지.
    public abstract void cook();
  }

  /*
  정리하자면 우리는 HomeMadeBuger라는 추상클래스 객체를 만드는 것인데,
  이 객체를 다른 곳에서 상속을 해가지고 클래스를 정의를 한 게 아니고, 그때 그때 새로운 익명클래스 객체를 만들어서
  반환을 해주는 것이다.
   */

 

728x90
반응형
Comments
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
250x250