JAVA 입문 시작
22.12.02 (불금) 제네릭
강준석
2022. 12. 2. 12:12
728x90
아 늦잠 잤다
제네릭클래스
package 제네릭;
public class NoGeneric<T> {
//오브젝트로 처리한 이유는 어떤 자료형 타입을 사용할지 정하지 않았기 때문에
T[] v; //오브젝트 자료형 타입은 어떤한 객체든 들어갈 수 있게끔 선언해준 것
void set(T[] n) { //메인에서 호출한 무엇인가를 전달받아 클래스 변수인 v에다가 전달
v = n;
}
T[] get() { //위에서 저장된 v를 전달
return v;
}
void print() {
for(T o : v) {
System.out.print(o + " ");
}
System.out.println();
}
}
메인문
package 제네릭;
public class Sample01 {
public static void main(String[] args) {
//제네릭 설정할 때는 <자료형 타입> = new <> 처음에만 타입을 입력하면 된다.
/**객체 생성 **/
NoGeneric<String> nogen1 = new NoGeneric<>(); //String 문자열 타입 고정
String[] ss = {"마스터이", "티모", "상남자강준석"}; //만든 배열을 위 객체로 전달
/** 위에서 받은 배열값을 nogen으로 보낸다.**/
nogen1.set(ss);
nogen1.print();
for(String o : nogen1.get()) {
System.out.println(o + 1);
}
Integer[] ii = {1, 2, 3};
NoGeneric<Integer> nogen2 = new NoGeneric<>();
nogen2.set(ii);
nogen2.print();
for(Integer o : nogen2.get()) {
System.out.print(o + 5);
}
}
}
결과
마스터이 티모 상남자강준석
마스터이1
티모1
상남자강준석1
1 2 3
678
예시1
메인클래스
package 제네릭;
import java.util.ArrayList;
import java.util.List;
public class Sample02 {
public static void main(String[] args) {
List<Member>list = new ArrayList<Member>();
//<Member> : 제레릭처리, list는 Member클래스에 대한 객체만 넣을 수 있음.
//Integer,Double,String 등등도 넣을 수 있음.
/** 객체 생성 **/
//객체 내부에는 name, id, password, age에 변수를 보관중
Member mem1 = new Member();
mem1.setName("마스터이");
mem1.setId("aaa");
mem1.setPassword("aa11");
mem1.setAge(20);
System.out.println(mem1);
Member mem2 = new Member();
mem2.setName("릴리야");
mem2.setId("bbb");
mem2.setPassword("aa22");
mem2.setAge(26);
System.out.println(mem2);
Member mem3 = new Member();
mem3.setName("티모");
mem3.setId("ccc");
mem3.setPassword("aa33");
mem3.setAge(1);
System.out.println(mem3);
list.add(mem1);
list.add(mem2);
list.add(mem3);
for(int i =0; i<list.size(); i++) {
System.out.println("이름 : " + (/* (Member) */list.get(i)).getName());
//list는 순서가 있으므로 (i)번째 객체 / (Member)list.get(i) list는 Member클래스에서 만든 객체다라고 선언
//Member를 주석처리한 이유 : 위에서 list를 이미 <Member>로 제네릭처리를 했기때문에
//굳이 여기서(Member)list 선언처리를 하지않아두된다
System.out.println("이름 : " + (/* (Member) */list.get(i)).getId());
//list는 순서가 있으므로 (i)번째 객체 / (Member)list.get(i) list는 Member클래스에서 만든 객체다라고 선언
System.out.println("이름 : " + (/* (Member) */list.get(i)).getPassword());
//list는 순서가 있으므로 (i)번째 객체 / (Member)list.get(i) list는 Member클래스에서 만든 객체다라고 선언
System.out.println("이름 : " + (/* (Member) */list.get(i)).getAge());
//list는 순서가 있으므로 (i)번째 객체 / (Member)list.get(i) list는 Member클래스에서 만든 객체다라고 선언
}
}
}
서브클래스
package 제네릭;
public class Member {
/**Main에서 갖다 쓰지 못함 프라이빗 접근자에서는**/
private String name;
private String id;
private String password;
private int age;
/** Member 안에 있는 값들을 리턴 **/
@Override
public String toString() {
return "Member [name=" + name + ", id=" + id + ", password=" + password + ", age=" + age + "]";
}
/** 게터 메서드로 받게 되면 Main으로 주고 받고 가능 **/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
예시2
메인클래스
package 제네릭;
public class Main02 {
public static void main(String[] args) {
Generic2<String,Integer> gen = new Generic2<>();
// 서브문의 K name(문자열),V id(정수)로 받기위해
gen.set("문자열",10);
//제네릭 설정 <String(문자열),Integer(정수)>으로 했기때문에
//해당 조건에 맞지않는 값을 넣을시 오류
System.out.println("이름"+gen.getName());
System.out.println("아이디"+gen.getId());
}
}
제네릭클래스
package 제네릭;
public class Generic2 <K,V> {
K name;
V id;
void set(K name,V id) {
this.name = name;
this.id = id;
}
K getName() {
return name;
}
V getId() {
return id;
}
}
List안에 Map을 넣기(제네릭사용)
package 제네릭;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
//Arraylist에 map을 넣기
public class Sample03 {
public static void main(String[] args) {
// list 안에 Map을 넣음
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
// <key,value> //뒤에 <Map<String, Object>>는 <>로 생략가능
Map<String, Object> hm = new HashMap<String, Object>();
// Object : 최상위객채이므로 (int,string..)상관없이 아무거나 넣어두 오류안뜸
hm.put("name", "티모");
hm.put("id", "Teemo");
hm.put("age", "10");
// map에 값을 넣음
list.add(hm);
// hm=Map 이므로 list에 Map을 넣음
System.out.println(hm);
// 값을 넣은 hm = Map 출력
hm = new HashMap<String, Object>();
System.out.println(hm);
// 새로운 hm을 만듬 그래서 출력하면 아무것도 안나옴
hm.put("name", "마스터이");
hm.put("id", "Master Lee");
hm.put("age", "30");
// map에 값을 넣음
list.add(hm);
// hm=Map 이므로 list에 Map을 넣음
hm = new HashMap<String, Object>();
hm.put("name", "강준석");
hm.put("id", "탑솔러 장인");
hm.put("age", "26");
// map에 값을 넣음
/* 총3개의 객체(hm)를 생성해서 list의 3개의 방(hm의 k,v를 저장한 방)이 생김 */
list.add(hm); /*Map(hm) 하나당 3가지 k,v(key,value)를 hm.put했기 때문에 Map(hm)에 3가지 (k,v)를 넣은 방이 3개 생김*/
/*결론적으로 list(Map방3개(Map의 k,v를 저장한 방3개)) */
// hm=Map 이므로 list에 Map을 넣음
for (int i = 0; i < list.size(); i++) {
System.out.println(" 이름 : " + list.get(i).get("name"));
//list.get(i): list(i)번방의 값을 가져온다 (hm의 i번방)
//list.get(i).get("name") list(i)번방의 값(value)"name"을 가져온다
System.out.println(" ID : " + list.get(i).get("id"));
System.out.println(" 나이 : " + list.get(i).get("age"));
}
}
}
결과
{name=티모, id=Teemo, age=10}
{}
이름 : 티모
ID : Teemo
나이 : 10
이름 : 마스터이
ID : Master Lee
나이 : 30
이름 : 강준석
ID : 탑솔러 장인
나이 : 26
728x90