일반적으로 DB에 있는 데이터는 데이터용 클래스에 작성하여 관리한다.
다음과 같은 회원 데이터 클래스가 있다고 해보자.
package ArrayList_test;
//회원데이터를 담을 용도의 클래스
public class Member_class {
//인스턴스 필드
//클래스 내부에서만 접근가능
private String name;
private String id;
private int age;
private String email;
//필드 접근 메소드 (Getter/Setter)
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
Member_class(){
}
Member_class(String name, String id, int age, String email){
this.name = name;
this.id = id;
this.age = age;
this.email = email;
}
}
이 회원 데이터 클래스를 ArrayList를 이용해서 담는다고 한다면 각 회원 객체마다 ArrayList의 인덱스에 넣어주면 된다.
package ArrayList_test;
import java.util.*;
public class Member_main {
public static void main(String[] args) {
//회원 객체 생성
Member_class mem = new Member_class();
//홍길동 회원객체
mem.setName("홍길동");
mem.setId("hong");
mem.setAge(15);
mem.setEmail("hong@naver.com");
// Array List 객체 생성
List mem_list = new ArrayList();
// 리스트에 추가
mem_list.add(mem);
System.out.println(mem_list.get(0));
}
}
같은 방법으로 홍길동 외에 3명을 더 추가하자면 다음과 같이 작성할 수 있다.
package ArrayList_test;
import java.util.*;
public class Member_main {
public static void main(String[] args) {
//회원 객체 생성
Member_class mem = new Member_class();
//홍길동 회원객체
mem.setName("홍길동");
mem.setId("hong");
mem.setAge(15);
mem.setEmail("hong@naver.com");
// Array List 객체 생성
List mem_list = new ArrayList();
// 리스트에 추가
mem_list.add(mem);
// 이순신
mem.setName("이순신");
mem.setId("lee");
mem.setAge(16);
mem.setEmail("lee@naver.com");
mem_list.add(mem);
// 김유신
mem.setName("김유신");
mem.setId("kim");
mem.setAge(17);
mem.setEmail("kim@naver.com");
mem_list.add(mem);
//유관순
mem.setName("유관순");
mem.setId("yu");
mem.setAge(18);
mem.setEmail("yu@naver.com");
mem_list.add(mem);
Member_class m1 =(Member_class) mem_list.get(0);
System.out.println(m1.getName());
m1 = (Member_class) mem_list.get(1);
System.out.println(m1.getName());
}
}
하지만 위와 같이작성해서 실행하면 다음과 같은 문제가 발생한다.
이처럼 0번 인덱스에는 홍길동, 1번 인덱스에는 이순신이 들어가야하는데 전부 유관순이 출력되는 문제가 발생한다. 이는 객체는 참조변수이기 때문이며 mem이라는 동일한 객체에 set() 메소드를 적용했기 때문이다.
따라서 set()하기전에 새로운 객체로 할당해줄 필요가 있다. 다음과 같이 작성한다.
package ArrayList_test;
import java.util.*;
public class Member_main {
public static void main(String[] args) {
//회원 객체 생성
Member_class mem = new Member_class();
//홍길동 회원객체
mem.setName("홍길동");
mem.setId("hong");
mem.setAge(15);
mem.setEmail("hong@naver.com");
// Array List 객체 생성
List mem_list = new ArrayList();
// 리스트에 추가
mem_list.add(mem);
// 이순신
mem = new Member_class(); <- 추가된 부분
mem.setName("이순신");
mem.setId("lee");
mem.setAge(16);
mem.setEmail("lee@naver.com");
mem_list.add(mem);
// 김유신
mem = new Member_class();<- 추가된 부분
mem.setName("김유신");
mem.setId("kim");
mem.setAge(17);
mem.setEmail("kim@naver.com");
mem_list.add(mem);
//유관순
mem = new Member_class();<- 추가된 부분
mem.setName("유관순");
mem.setId("yu");
mem.setAge(18);
mem.setEmail("yu@naver.com");
mem_list.add(mem);
Member_class m1 =(Member_class) mem_list.get(0);
System.out.println(m1.getName());
m1 = (Member_class) mem_list.get(1);
System.out.println(m1.getName());
}
}
그러면 원하는 대로 출력이 가능하다.
그런데 이렇게 각 회원객체에 접근하기위해서 m1 객체를 선언하는 것이 불편할 수 있다.
이럴 때는 다음과 같이 선언한 ArrayList의 데이터 타입을 커스터 마이징해서 만든 회원데이터 클래스 타입으로 선언해주면 객체를 만들지 않고도 바로 접근이 가능하다.
이것을 제네릭(Generic)이라고 한다.
이를 통해 반복문을 통해서 전체 회원정보를 출력하면 다음과 같이 출력할 수 있다.
(최종코드)
package ArrayList_test;
import java.util.*;
public class Member_main {
public static void main(String[] args) {
//회원 객체 생성
Member_class mem = new Member_class();
//홍길동 회원객체
mem.setName("홍길동");
mem.setId("hong");
mem.setAge(15);
mem.setEmail("hong@naver.com");
// Array List 객체 생성
List<Member_class> mem_list = new ArrayList<Member_class>();
// 리스트에 추가
mem_list.add(mem);
// 이순신
mem = new Member_class();
mem.setName("이순신");
mem.setId("lee");
mem.setAge(16);
mem.setEmail("lee@naver.com");
mem_list.add(mem);
// 김유신
mem = new Member_class();
mem.setName("김유신");
mem.setId("kim");
mem.setAge(17);
mem.setEmail("kim@naver.com");
mem_list.add(mem);
//유관순
mem = new Member_class();
mem.setName("유관순");
mem.setId("yu");
mem.setAge(18);
mem.setEmail("yu@naver.com");
mem_list.add(mem);
Member_class m1 =(Member_class) mem_list.get(0);
System.out.println(m1.getName());
m1 = (Member_class) mem_list.get(1);
System.out.println(m1.getName());
// 0번째는 이순신이 들어가있는데 유관순이 출력되는이유는?
m1 = (Member_class)mem_list.get(0);
System.out.println(m1.getName());
// 객체는 주소를 참조하기 때문이다.
// 이순신, 김유신, 유관순 모두 같은 객체에 있는것이고 객체에 있는 주소를 리턴하기 때문에
// 같은 값인 유관순이 출력된다
// 해결방법은 set하기전에 mem = new new Member_class(); 로 새객체를 할당해주는 것이다.
System.out.println("---반복문으로 전체출력---------");
for(int i =0; i<mem_list.size(); i++) {
m1 = (Member_class) mem_list.get(i);
System.out.println(m1.getName());
System.out.println(m1.getId());
System.out.println(m1.getAge());
System.out.println(m1.getEmail());
}
System.out.println("---제네릭을 사용해서 출력---------");
// List mem_list = new ArrayList(); 즉 리스트를 선언할 때
// List mem_list = new ArrayList<Member_class>(); 이렇게 Member_class라고 객체 생성시 타입을 지정해주면
// 형변환을 해주지않아도 된다.
for(int i=0; i<mem_list.size(); i++) {
System.out.println(mem_list.get(i).getName());
System.out.println(mem_list.get(i).getId());
System.out.println(mem_list.get(i).getAge());
System.out.println(mem_list.get(i).getEmail());
}
}
}
위 코드의 마지막부분을 보면 위에서 ArrayList를 커스터마이징해서 만든 Member_class 타입으로 제네릭 선언을 해주었기 때문에 따로 객체를 생성하지 않고도 메소드 체이닝(Method Chaining)이 가능해진다.
(출력결과)
'Java' 카테고리의 다른 글
[Java] - iterator(반복자) : 인덱스로 접근할 수 없을 때 사용 (0) | 2020.09.28 |
---|---|
[Java] - 객체비교 (eqauls)에 대해서 (0) | 2020.09.28 |
[Java] - 자바 인터페이스, 다중 인터페이스, 인터페이스의 사용방법 (0) | 2020.09.24 |
[Java] - 추상 메소드와 오버라이딩 ( 메소드 다형성) (0) | 2020.09.24 |
[Java] - 추상 클래스 (0) | 2020.09.24 |