코드 그라데이션

후발대 12일차 전체적 정리 본문

Java/후발대

후발대 12일차 전체적 정리

완벽한 장면 2023. 1. 27. 10:38

일단 파일 모양

Day 12

커밋 내용

 

코드

Generics

_Generics_01

package Prac12;

public class _01_Generics {
    public static void main(String[] args) {
    // 제네릭스
    // 다양한 타입의 객체를 지원하는 클래스나 인터페이스 또는 메서드를 정의하는 방법

        // 앞을 대문자로 수정할거야
        Integer[] iArray = {1,2,3,4,5};
        Double[] dArray = {1.0, 2.0, 3.0, 4.0, 5.0};
        String[] sArray = {"Aa", "Bb", "Cc", "Dd", "Ee"};
        
        printIntArray(iArray); // 아직 메서드를 만들지 않았기 때문에 빨간줄
        printDoubleArray(dArray);
        printStringArray(sArray);

        System.out.println("----------------"); // 줄바꿈
        prinAntArray(iArray); // array 어떤 것도 호출할 수 있다.
        prinAntArray(dArray);
        prinAntArray(sArray); // 요것만 문제가 없다 . 제네릭스에서 제공하는 것은 객체입니다. 기본자료형은 제네릭스로 사용할 수 없기 때문에
        // 이것을 감싸주는 레퍼 클래스가 필요해요. 이건 다음번 시간에 자세히 할 것이다.
        // Integer.parseInt();
        // double.parseDouble(); 등
    }

    private static void printStringArray(String[] sArray) {
        for(String s : sArray) {
            System.out.print(s + " ");
        }
        System.out.println();
    }

    private static void printDoubleArray(Double[] dArray) {
        for(double d : dArray) {
            System.out.print(d + " "); // 1.0 2.0 3.0 4.0 5.0 출력
        }
        System.out.println();
    }

    private static void printIntArray(Integer[] iArray) {
        // for-each문 사용
        for(int i : iArray) {
            System.out.print(i + " "); //1 2 3 4 5 (한칸 띄고 출력)
        }
        System.out.println();
    }
    //T : Type, K: Key, V: Value, E: Element
    private static <T> void prinAntArray(T[] array) { // 왼쪽의 T와 오른쪽 T가 같아야 한다.
        for(T t : array) {
            System.out.print(t + " ");
        }
        System.out.println();
    }
}

 

_Generics_02

package Prac12;

import Prac12.coffee12.*;
import Prac12.user12.User12;
import Prac12.user12.VipUser12;

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

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

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

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

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

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

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

        int c3Name = (int)c3.name;
        System.out.println("주문 고객 변호: " + c3Name); // 반드시 형변환 해서 가져와야함.

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

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

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

        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("이동욱")); //괄호 안에 객체가 들어가야 함. User의 객체. 형태는 문자열이 들어가야
        c7.ready();

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

    }
}

 

Coffee 패키지

Coffee

package Prac12.coffee12;

public class Coffee12 <T> {
    public T name;

    public Coffee12(T name) {
        this.name = name;
    }

    public void ready() {
        System.out.println("커피 준비 완료: " + name);
    }
}

 

CoffeeByName

package Prac12.coffee12;

public class CoffeeByName12 {
    public Object name;

    public CoffeeByName12(Object name) {
        this.name = name;
    }
    public void ready() {
        System.out.println("커피 준비 완료: " + name);
    }
}

//Object사용

 

CoffeeByNickName

package Prac12.coffee12;

public class CoffeeByNickName12 {
    public String nickname;

    public CoffeeByNickName12(String nickname) {
        this.nickname = nickname;
    }

    public void ready() {
        System.out.println(" 커피 준비 완료: " + nickname);
    }
}

 

CoffeeByNumber

package Prac12.coffee12;

public class CoffeeByNumber12 {
    public int waitingNumber;

    public CoffeeByNumber12(int waitingNumber) {
        this.waitingNumber = waitingNumber;
    }

    public void ready() {
        System.out.println("커피 준비 완료: " + waitingNumber);
    }
}

 

CoffeeByUser

package Prac12.coffee12;

import Prac12.user12.User12;

//받는 형을 제한해주겠다~!
public class CoffeeByUser12 <T extends User12> { // 어떤 타입의 클래스를 써도 상관은 없는데, T 형태를 쓰는 우리가 아는 User 클래스만 받을 수 있다는 뜻.
    public T user;

    public CoffeeByUser12(T user) {
        this.user = user;
    }

    public void ready() {
        System.out.println("커피 준비 완료: " + user.name); // 유저가 유저정보를 다 가지고 있으므로.
        user.addPoint();
    }
}

 

 

User 패키지

User

package Prac12.user12;
/*
       이제 회원가입을 추가해서 관리했다고 가정하자. 휴대폰 번호 등을 이용해 포인트 적립 등으로 혜택
        */
public class User12 {
    public String name;

    public User12(String name) {
        this.name = name;
    }
    public void addPoint() {
        System.out.println(this.name + " 님, 포인트가 적립 되었습니다!");
    }
}

 

VIPUser

package Prac12.user12;
// 헤비유저가 있다고 치자
public class VipUser12 extends User12 {

    public VipUser12(String name) {
        super("특별한 " + name);
        //특별한 ..님 이렇게 불러주는게 user클래스예요.
    }
}

 

수업 이후 가져야할 Action item

  • Generics 문법을 익힌다.
  • Generics로 메서드와 클래스 활용을 익힌다.
728x90

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

후발대 13일차 설명 보충  (0) 2023.02.03
후발대 13일차 전체 코드  (0) 2023.02.03
후발대 12일차 전체 코드  (0) 2023.01.27
후발대 11일차 수업 내용별 클래스 분류  (0) 2023.01.23
후발대 11일차 전체 내용  (0) 2023.01.23
Comments