자바에서 데이터 목록을 다루는 클래스를 말한다.
배열 : 데이터의 크기가 정해져 있고, 추가적인 삽입 삭제가 일어 나지 않으며 검색을 필요로 할 때 유리.
리스트 : 데이터의 크기가 정해져 있지 않고, 삽입 삭제가 많이 일어나며, 검색이 적은 경우 유리.
리스트명.add("값")
리스트명.remove("값");
리스트명.remove(인덱스);
리스트명.set(인덱스, "바꿀값");
리스트명.size();
리스트명.contains("값");
리스트명.isEmpty();
배열을 이용하여 객체 목록을 다룬다.
List<Object> list = new ArrayList<Object>();
ArrayList<Object> list = new ArrayList<>();
2번으로 안사용하고 1번으로 사용하는 이유?
⇒ 객체지향 프로그래밍의 일환으로, 다형성을 지원하기 위해서이다.
처음부터 변경이 유리한 구조로 미리 설계하는 방식이라고 할 수 있다.
예를 들자면, 2번으로 구현을 해버리면, 나중에 삽입/삭제가 유리한 LinkedList로 자료구조를 변경하고자 할 때 ArrayList로 선언된 모든 부분을 LinkedList로 다시 변경해주어야 한다.
⇒ 유지 보수가 어렵다.
public class Exam0210 {
public static void main(String[] args) {
class Member {
String name;
int age;
public Member(String name, int age) {
this.name = name;
this.age = age;
}
Member m1 = new Member("홍길동", 20);
Member m2 = new Member("임꺽정", 30);
Member m3 = new Member("유관순", 17);
ArrayList<Member> list = new ArrayList<>();
list.add(m1);
list.add(m2);
list.add(m3);
for (int i = 0; i < list.size(); i++) {
Member m = list.get(i);
System.out.printf("이름: %s, 나이: %d\n", m.name, m.age);
}
}
}
리스트 형태를 배열로 만들어주는 메소드
List<String> list = new ArrayList<String>();
String[] arr = new String[5];
arr = list.toArray(arr);
Object[] arr = list.toArray();
public class Exam0220 {
public static void main(String[] args) {
...
Member m1 = new Member("홍길동", 20);
Member m2 = new Member("임꺽정", 30);
Member m3 = new Member("유관순", 17);
ArrayList<Member> list = new ArrayList<>();
list.add(m1);
list.add(m2);
list.add(m3);
Object[] arr = list.toArray();
for (Object obj : arr) {
Member m = (Member) obj;
System.out.printf("이름: %s, 나이: %d\n", m.name, m.age);
}
}
}
( Member[] arr = list.toArray(new Member[0]
) 이 방법도 가능하지만, 위의 방법 추천
Member[] arr = list.toArray(new Member[list.size()]);
for (Member m : arr) {
System.out.printf("이름: %s, 나이: %d\n", m.name, m.age);
}
Iterator<Member> iterator = list.iterator();
while (iterator.hasNext()) {
Member m = iterator.next();
System.out.printf("이름: %s, 나이: %d\n", m.name, m.age);
}
public class Exam0240 {
public static void main(String[] args) {
Member m1 = new Member("홍길동", 20);
Member m2 = new Member("임꺽정", 30);
Member m3 = new Member("유관순", 17);
ArrayList<Member> list = new ArrayList<>();
list.add(m1);
list.add(m2);
list.add(m3);
class MyConsumer implements Consumer<Member> {
@Override
public void accept(Member m) {
// forEach() 에서 반복문을 돌릴 때
// Consumer 규칙에 따라
// 각 항목에 대해 이 메서드를 호출한다.
System.out.printf("이름: %s, 나이: %d\n", m.name, m.age);
}
}
// 의미:
// => 야 List!
// 너가 갖고 있는 목록에서 값을 한 개 꺼낼 때 마다
// 지금 내가 파라미터로 넘겨주는 객체 있지?
// MyConsumer 객체 말이야.
// 이 객체의 accept()를 호출해주렴.
list.forEach(new MyConsumer());
}
}
Consumer<Member> action = new Consumer<>() {
@Override
public void accept(Member m) {
System.out.printf("이름: %s, 나이: %d\n", m.name, m.age);
}
};
list.forEach(action);
}
list.forEach(new Consumer<>() { // list안에 들어있는 요소의 개수만큼 호출한다.
@Override
public void accept(Member m) {
System.out.printf("이름: %s, 나이: %d\n", m.name, m.age);
}
});
}
collection.forEach(변수 -> 반복처리(변수))
list.forEach(m -> System.out.printf("이름: %s, 나이: %d\n", m.name, m.age));
list.forEach(클래스A::클래스A에 있는 메소드)
단, 클래스A에 있는 메소드는 Consumer 클래스의 accpet()메소드와 같은 역할을 한다.
⇒ list안에 있는 요소들을 클래스 A에 있는 메소드의 형식에 맞추어 출력해줘!
list.forEach(Exam0244::printMember);
public class Exam0244 {
static class Member {
String name;
int age;
public Member(String name, int age) {
this.name = name;
this.age = age;
}
public static void main(String[] args) {
Member m1 = new Member("홍길동", 20);
Member m2 = new Member("임꺽정", 30);
Member m3 = new Member("유관순", 17);
ArrayList<Member> list = new ArrayList<>();
list.add(m1);
list.add(m2);
list.add(m3);
// 메서드 레퍼런스로 인터페이스 구현체 전달하기
list.forEach(Exam0244::printMember);
}
static void printMember(Member m) {
System.out.printf("이름: %s, 나이: %d\n", m.name, m.age);
}
}