코드 그라데이션

후발대 15일차 설명 추가 코드 본문

Java/후발대

후발대 15일차 설명 추가 코드

완벽한 장면 2023. 2. 11. 08:04

_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

'Java > 후발대' 카테고리의 다른 글

후발대 16일차 설명 추가 코드  (0) 2023.02.12
후발대 16일차 전체 코드  (0) 2023.02.12
후발대 15일차 전체 코드  (0) 2023.02.11
후발대 14일차 설명 포함 코드  (0) 2023.02.03
후발대 14일차 전체 코드  (0) 2023.02.03
Comments