티스토리 뷰

[개발] - Java/후발대

후발대 13일차 설명 보충

완벽한 장면 2023. 2. 3. 09:56

 

Generics(2)

public class _02_GenericsClass {
    public static void main(String[] args) {
        // 다양한 형태의 메서드들을 받아서 하나로 처리하는 걸로 구현을 앞에서 했었지
        // 커피 실습할거야.(커피 패키지 생성)

        // 5개 실습 중에 먼저 주문 번호로 알려주는 CoffeeByNumber부터 생성


        CoffeeByNumber12 c1 = new CoffeeByNumber12(33); // 대기번호
        c1.ready(); //커피 준비 완료 : 33 출력

        // 이제 닉네임으로 불러드리는 고객님이 오셨다고 하자...
        // CoffeeByNumber12에서는 int로 받았으니까, 닉네임으로 받는 걸 만들어줘야지, 클래스 생성하자. 2. CoffeeByNickName

        CoffeeByNickName12 c2 = new CoffeeByNickName12("미연");
        c2.ready();
        System.out.println("-----------"); // 줄변경
        // c1이나 c2나 사실 동작은 똑같다. 값이 바뀌어야 한다고 하면 그때마다 새로운 클래스를 만들어야 해서 번거로움이 있을 것이다.

        /*
        방법: 1 Object클래스 사용
        모든 클래스의 조상이기 때문에 따로 상속을 해주지 않아도, 모든 클래스에서는 object 타입을 받을 수가 있다.
         */

        //3. CoffeeByName 생성
        CoffeeByName12 c3 = new CoffeeByName12(34); // Object로 받았으므로 아무 문제가 없어요. 정수
        c3.ready();
        CoffeeByName12 c4 = new CoffeeByName12("조미연"); // 문자열
        c4.ready();
        System.out.println("------------------");

        // 이제 CoffeeByName12에서 name을 가져와서 이름과 주문번호를 확인하고 싶어요.

        int c3Name = (int)c3.name;
        // 반드시 형변환 해서 가져와야함. 처음엔 object인데 int값 들어왔다고 빨간줄이 떴음.
        System.out.println("주문 고객 변호: " + c3Name);

        String c4Name = (String)c4.name;
        // 반드시 형변환 해서 가져와야함. Object이므로
        System.out.println("주문 고객 변호: " + c4Name);

        // c3에 c4를 가져온다거나, 이렇게 잘못 가져온 경우가 있을 수 있지
        // c4Name = (String)c3.name

        // Objcet
        System.out.println("-------");//줄바꿈


        //5. Coffee 클래스 생성
        Coffee12<Integer> c5 = new Coffee12<>(35);
        c5.ready();
        //만약 우리가 c5의 name을 얻어온다고 가정하면!
        int c5Name = c5.name; // 에러 안 난다. 당연히 정수데이터를 넣기로 했기 때문에 형변환도 필요가 없어.
        System.out.println("주문 고객 번호: " + c5Name);

        Coffee12<String> c6 = new Coffee12<>("강동원");
        c6.ready();
        //여기도 마찬가지!
        String c6Name = c6.name;
        System.out.println("주문 고객 이름: " + c6Name);


        // 우리가 앞에서 있었던 문제가 c4 name을 c3으로 형변환 하면서 애러가 있었지, 만약에 35를 정우성으로 바꾸면 바로 에러 난다.
        // 숫자만 넣기를 기대했기 때문에, 물론 강동원을 35로 바꿔도 마찬가지

        /*
        이제 회원가입을 추가해서 관리했다고 가정하자. 휴대폰 번호 등을 이용해 포인트 적립 등으로 혜택
         */

        // 이제 사용자들이 주문하는 상황을 가정해봅시다 (CoffeeByUser12)

        CoffeeByUser12<User12> c7 = new CoffeeByUser12<>(new User12("이동욱"));
        // 지금 우변의 <>안에는 User12가 들어가도 되고, 생략해줘도 된다.
        //괄호() 안에 객체가 들어가야 함. User의 객체. new User12의 형태는 문자열로 받게 되어있으니까 문자가 들어가야.
        c7.ready();

        CoffeeByUser12<VipUser12> c8 = new CoffeeByUser12<>(new VipUser12("정우성"));
        c8.ready();
        //CoffeeByUser12<VipUser12> c8 = new CoffeeByUser12<>(new Camera11("정우성")); 이건 애러. 받는 것 제한

        //----------------------------------------------------------

        //Day13
        // 지금까지는 T 값 하나만 전달받아서 했는데, 하나 말고 더 할 수도 있다.
        System.out.println("---------------");
        orderCoffee("유재석");
        orderCoffee(36);

        System.out.println("--------------");
        orderCoffee("조보아", "자바칩프라프치노");
        orderCoffee(37, "라테");
    }
    public static <T> void orderCoffee(T name) {
        System.out.println("커피 준비 완료: " +name);
        System.out.println("------------");

    }
    public static <T, V> void orderCoffee(T name, V coffee) {
        System.out.println(coffee + " 준비 완료: " + name);
        // 아메리카노도 시켰는지, 라테도 같이 시켰는지 봐보자 // 다이아몬드 기호 속에 적어주면 된다.

    }
}

 

WrapperClass

public class _03_WrapperClass {
    public static void main(String[] args) {
        // wrapper 클래스

        // 다양하게 형태 작성 가능
        Integer i = 123; // int i = 123;
        Double d = 1.0; // double d = 1.0;
        Character c = 'A'; // char c = 'A'

        System.out.println(i);
        System.out.println(d);
        System.out.println(c);

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

        // 이제 기능이랑 메서드를 활용해서 출력해보겠다.
        //i 하고 . 찍으면 인티저와 관련된 많은 기능들을 확인해 볼 수 있음.
        System.out.println(i.intValue());
        System.out.println(d.intValue()); // 실수를 형변환해서 int로 바뀐 것을 볼 수 있을 듯
        System.out.println(c.charValue());

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

        // 정수를 문자열 형태로 쉽게 바꾸기
        String s= i.toString();
        System.out.println(s); // i에 있던 123값이 문자로 바뀌어서 출력됨을 확인할 수 있다.

        String str = "10";
        int num = Integer.parseInt(str);
        System.out.println(num); // String을 숫자값으로 출력시켜줌.

        Integer ii = new Integer(10); // 박싱 : 숫자를 인티저 타입으로 넣는 것
        int num1 = ii.intValue(); // 언박싱 : ii에서 intValue값만 꺼내와서 이거를 다시 int형태의 값에다가 담는 것.
    }
}

 

ArrayList

public class _04_ArrayList {
    // 컬랙션 프레임워크. 많은 데이터를 효과적으로 관리하기 위해서 자바가 제공하는 어떤 클래스의 모음.
    // List, Set, Map
    public static void main(String[] args) {

        // 우리가 이전에 두 개 이상의 데이터를 관리하기 위해서 배열을 배웠었지.
        // 하지만 배열은 크기 고정이므로, 새로운 데이터 추가 시 새로운 배열을 선언해줘야 해서 불편함이 있었다.
        /*
        int[] array = new int[3];
        array[0] = 1;
        array[1] = 2;
        array[2] = 3;
         */

        // ArrayList
        // 어떤 학원에서 진행하는 5명짜리 수업이 있다고 하자. 선착순 5명!

        // 데이터 추가
        ArrayList<String> list = new ArrayList<>(); //꺽쇠 안에는 받을 데이터 타입
        list.add("유재석");
        list.add("조세호");
        list.add("김종국");
        list.add("박명수");
        list.add("강호동");
        System.out.println("-------------"); // 줄변경

        // 데이터 조회
        System.out.println(list.get(0));
        System.out.println(list.get(1));
        System.out.println(list.get(2));
        System.out.println(list.get(3));
        System.out.println(list.get(4));

        // 만약 박명수씨가 등록을 철회한다면?
        // 데이터 삭제
        // 한 개만 지워줄 때는 remove

        System.out.println("신청 학생 수 (등록 철회 전) : " + list.size());
        list.remove("박명수"); // ()괄호 안에 삭제할 데이터를 그대로 적어주면 됨.
        System.out.println("신청 학생 수 (철회 후) : " + list.size());

        System.out.println(list.get(3)); // 강호동 씨가 앞으로 올라온 것을 알 수 있음.

        System.out.println("-----------");
        System.out.println("남은 학생 수 (제외 전) : " + list.size());
        list.remove(list.size()-1); // 마지막 인덱스를 삭제
        System.out.println("남은 학생 수 (제외 후) : " + list.size());

        // 순회 : for each문 통해 확인
        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("김종국")); // 괄호 안에 찾으려는 데이터를 넣어주면 된다. 여기서는 김종국씨의 위치를 찾겠지.

        // 리스트 안에 포함되어 있는지 아닌지 확인 //  선착순 5명 내에 포함되어 있는가?
        // contains() 메서드 => True, False로 반환값 출력
        if (list.contains("김종국")) {
            System.out.println("수강 신청 성공");
        }
        else {
            System.out.println("수강 신청 실패");
        } // 수강 신청 성공 출력됨.

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

        // 리스트에 있는 내용 전체 삭제 : clear()
        list.clear();
        // 리스트가 비워져 있는지를 확인
        if(list.isEmpty()) {
            System.out.println("학생 수: " + list.size() );
            System.out.println("리스트가 비어 있습니다.");
        }

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

        // 여기까지 되면 완전히 리스트 깨끗해짐


        // 새로운 학기가 시작되어 새로운 학생 5명을 선착순으로 받아서 새로 공부를 시작한다.
        list.add("유재석");
        list.add("조세호");
        list.add("김종국");
        list.add("박명수");
        list.add("강호동");

        // 출석부를 만들어보자. 가나다순으로 이름 정렬해서

        // 정렬
        Collections.sort(list); //(안에는 정렬하고 싶은 데이터의 이름)
        // for-each문을 통해 잘 정렬되었는지 확인
        for(String s : list) {
            System.out.println(s); // 강호동, 김종국, 박명수, 유재석, 조세호 순으로 출력 됨.
        }
    }
}

 

 

LinkedList ( 1 )

public class _05_LinkedList {
    public static void main(String[] args) {
        // 링크드 리스트
        // 여러명이 앉을 의자가 있다고 가정한 설명
        /*
        먼저 어레이리스트는, 여러명이 앉을 의자가 연달아 있으면, 중간에 누가 앉으려고 한다면 그 사람의 위치로부터
        그 사람 뒤에 있는 사람들이 모두 일어나서 한 칸씩 이동해야 하는 번거로움이 있다.

        링크드 리스트는 의자 없이 사람들이 나란히 손을 잡고 있는 상황이다.
        중간에 한 명이 2-3번 사이로 들어간다고 하면, 잡았던 손을 놓고, 그 사이에 들어가고 나서 기존에 2-3번에 있는 사람과 손을 잡으면서
        쉽게 여러 사람들 사이로 들어갈 수 있다. 그냥 손을 놨다가 새로 들어온 사람과 손을 잡는..

        쓰는 방법은 두 가지가 거의 비슷하다.
         */

        // 선착순으로 수업 진행
        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("서장훈"); // 처음으로 데이터가 들어가게 만든다.
        for(String s : list) {
            System.out.println(s);
        }

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

        list.addLast("김희철");
        for(String s : list) {
            System.out.println(s);
        } // 7명이 됨

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

        // 중간에 데이터를 추가하는 경우
        System.out.println("학생 추가 전: " + list.get(1)); // 유재석 출력
        list.add(1, "김영철"); // 유재석 씨 앞에 김영철 씨 추가됨
        System.out.println("학생 추가 후: " + list.get(1)); // 김영철 출력

        // 진짜 추가되었는지 확인해보기
        System.out.println("학생 추가 후: " + list.get(2)); // 유재석 출력 <== 이동한 위치
728x90
반응형
Comments
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
250x250