[개발] - 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
반응형