티스토리 뷰
일단 파일 모양
커밋 내용
코드
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