ArrayList<String> list = new ArrayList<>();
//list.add(1);
list.add("1");
list.add("2");
for(String s : list) System.out.println(s);
ArrayList<Integer> listI = new ArrayList<>();
listI.add(3);
listI.add(4);
for(int s : listI) System.out.println(s);
제네릭 타입을 String으로 적어서 ArrayList를 문자로 채우겠다고 약속을 했는데 숫자를 넣으면 에러가 난다.
제네릭 타입을 Integer을 적고 안에 있는 값을 foreach int로 돌려도 값이 출력된다.
단점: 저장소의 용량을 늘리는 과정에서 많은 시간이 소요되고, 데이터의 삭제에 필요한 연산과정이 매우 길다. (잦은 삽입/삭제에 오버헤드가 걸린다.)
LinkedList<E>: 특징이 리스트의 자료구조의 특징과 일치
장점: 저장소의 용량을 늘리는 과정이 간단하고, 데이터의 삭제가 매우 간단하다.
단점: 데이터의 참조가 다소 불편하다.
ArrayList<Integer> list = new ArrayList<Integer>();
ArrayList<Integer> list2 = new ArrayList<>();
List<Integer> list3 = new ArrayList<>();
Collection<Integer> list4 = new ArrayList<>();
내가 만든 클래스를 타입으로 주고 저장하면, 중복값이 제거되지 않는다. (클래스 내에서 오버라이딩 해주어야 한다.)
Iterator을 통해 값을 출력한다.
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return name + "(" + age + "세)";
}
@Override
public boolean equals(Object obj) {
Person p = (Person)obj;
if(this.name.equals(p.name) && this.age == p.age) {
return true;
}
return false;
}
@Override
public int hashCode() {
// return age; // 나이가 같은 사람끼리 모아두기
// return name.hashCode(); // 이름이 같은 사람끼리 모아두기
return age%3 + name.hashCode();
// 나이가 같은 사람끼리(3그룹), 이름이 같은 사람끼리 모아두기
}
@Override
public int compareTo(Person p) {
// 이름 길이, 알파벳 순 정렬+같은 길이 스킵 안 함
if(name.length()>p.name.length()) return 1;
else if(name.length()<p.name.length()) return -1;
else {
if(name.compareTo(p.name)>0) return 1;
else if(name.compareTo(p.name)<0) return -1;
}
중복값을 제거하기 위해 equals와 hashCode를 오버라이딩했다.
equals 메소드 오버라이딩에서 받아올 변수가 Object로 받았기 때문에 (Person)을 통해 강제형변환을 해준다. 조건문에 같은 조건을 주고, 조건을 만족하면 true를 return하고 조건을 만족하지 못하면 false를 return한다.
Person 클래스에 implements Comparable했기 때문에 compareTo를 오버라이딩할 수 있다.
public class Main {
public static void main(String[] args) {
MemberArrayList mList = new MemberArrayList();
Member lee = new Member(1001, "이순신");
Member kim = new Member(1002, "김유신");
Member kang = new Member(1003, "강감찬");
Member hong = new Member(1004, "홍길동");
Member hong2 = new Member(1004, "홍길동");
mList.addMember(lee);
mList.addMember(kim);
mList.addMember(kang);
mList.addMember(hong);
mList.addMember(hong2);
mList.showAllMember();
mList.removeMember(kim.getId());
mList.showAllMember();
}
}
ArrayList를 이용한 멤버 목록
public class Member {
private int id;
private String name;
public Member(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return id+"\t"+name;
}
}
Member 클래스
public class MemberArrayList {
private ArrayList<Member> memberList;
public MemberArrayList() {
memberList = new ArrayList<>();
}
public MemberArrayList(int size) {
memberList = new ArrayList<>(size);
}
public void addMember(Member member) {
this.memberList.add(member);
}
public boolean removeMember(int id) {
Iterator<Member> ir = memberList.iterator();
while(ir.hasNext()) {
Member member = ir.next();
int tempId = member.getId();
if(tempId == id) {
memberList.remove(member);
return true;
}
}
System.out.println(id+"가 존재하지 않습니다.");
return false;
}
public void showAllMember() {
System.out.println("============");
System.out.println("id\tname");
System.out.println("-- ---- --");
for(Member m:memberList) {
System.out.println(m); // Member의 toString 생략
}
System.out.println("============");
System.out.println();
}
}
Member 클래스를 통해 만들어낸 객체들을 저장하고, 컨트롤타워에서 명령한 메소드가 담겨있는 ArrayList 클래스
삭제는 Iterator을 통해 메소드를 작성했다. (독해는 위의 4. Iterator에서 적어두었다.)
질문한 내용이나 어려웠던 점 메모
1. Iterator
보면 알겠는데 혼자 아무것도 없이 해보려고 하면 뭐였지..하면서 기억나지 않아서 여러번 예제를 만들거나 같은 예제를 계속 작성해보면서 연습해봐야할 것 같다.
전체 피드백
예제를 많이 해본 것과 안 해본 것의 차이겠지만 아직은 Iterator보다는 for문이 조금 더 편한 것 같다..