여러개의 자료를 넣을 수 있는 자료구조의 Java 구현체
Array보다 향상된 편의 기능을 제공하는 자료 저장 객체
리스트 왜 써야 하나?
List는 순서가 있는 데이터를 다룰 때 유용하다.
List는 중복된 데이터를 저장할 수 있다.
List는 인덱스를 사용하여 데이터에 빠르게 접근할 수 있다.
List는 다양한 구현체가 있어서, 프로그래머가 필요에 따라 적절한 구현체를 선택할 수 있다.
Spring에서 줄기차게 사용한다.
List l1 = new ArrayList();
부모오브젝트 변수명 = new 자식오브젝트();
ShapeDrawer sd = new DiamondShapeDrawer(); → 추상 클래스
Printer pt = new ConsolePrinter(); → 인터페이스
public interface List<E> extends Collection<E>
import java.util.ArrayList;
import java.util.List;
public class ListEx {
public static void main(String[] args) {
List l1 = new ArrayList(); // List 선언과 초기화
l1.add("Hello"); // List 에 값을 넣을 때
l1.add(1);
System.out.println(l1.get(0)); // List 에서 인덱스를 이용해 값을 뽑을 때
System.out.println(l1.get(1));
System.out.println(l1.size()); // 들어있는 값들의 개수
System.out.println(l1.isEmpty()); // 들어있나? false
l1.remove(0); // 인덱스 지우기
l1.remove(0);
System.out.println(l1.isEmpty()); // 들어있나? true
}
}
== repeator(리피터) 반복할 수 있는
for문을 쓸 수 있는
for(var item : l1){ // for each
System.out.println(item);
}
컬렉션에 타입을 지정 해주는 기능
import java.util.ArrayList;
import java.util.List;
public class GenericEx {
public static void main(String[] args) {
List<String> strList = new ArrayList<>(); // 문자형
strList.add("hello");
strList.add("bye");
strList.add("1");
List<Integer> intList = new ArrayList<>(); // 숫자형
intList.add(1);
intList.add(2);
for (String item : strList) {
System.out.println(item);
}
for (Integer item : intList) {
System.out.println(item);
}
}
}
List l1 = new List();
for(var item : l1){
System.out.println(item.split()); // 사용불가
}
List<String> list2 = new List<>();
for(String item : list2){
System.out.println(item.split()); // 사용가능
}
int[] arr = new int[3]; [Stack영역]
→ primitive type
List<Integer> list1 = new ArrayList<>(); [Heap영역]
→ List에 타입을 지정 할 때는 Reference Type만 가능
오브젝트에 값을 할당하고 받아오는 메소드들
오브젝트의 멤버변수에 직접 접근 하는 방법을 피하기 위해 쓴다.
오브젝트에 값을 할당 할 때는 Constructor를 주로 쓴다.
Alt + Insert
import com.example.javaproject2.week4.day1.User; -> User 클래스 추가
import java.util.ArrayList;
import java.util.List;
public class ListUser {
public static void main(String[] args) {
List<User> users = new ArrayList<>();
}
}
public class User { -> private
private String name;
private String phoneNumber; // 010~ -> 0 안나옴
private int age;
public User(String name, String phoneNumber, int age) {
this.name = name; -> 생성자 추가
this.phoneNumber = phoneNumber;
this.age = age;
}
public User() { -> 파라미터 없는 생성자 추가
}
public User(String name) {
this.name = name;
}
public String getName() { -> getter
return name;
}
public String getPhoneNumber() {
return phoneNumber;
}
public int getAge() {
return age;
}
public void setName(String name) { -> setter
this.name = name;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public void setAge(int age) {
this.age = age;
}
boolean isAdult() {
return age >= 18;
}
}
class UserTest {
public static void main(String[] args) {
User user1 = new User(); -> 생성자 추가 시 오류 해결
user1.setName("김미미"); -> set 변경
user1.setAge(14);
User user2 = new User();
user2.setName("김나나");
user2.setAge(37);
System.out.printf("%s는 어른인지? %b\n", user1.getName(), user1.isAdult()); -> get 변경
System.out.printf("%s는 어른인지? %b\n", user2.getName(), user2.isAdult());
}
}
age가 구체적으로 필요 없는 경우는 다음과 같이 비즈니스 로직을 태운 메소드만 만들고
getAge()
와 같은 Getter는 만드는 것을 '지양' 한다.
public class ListUser {
public static void main(String[] args) {
List<User> users = new ArrayList<>();
User user1 = new User("김미미", "010-1234-1234", 37);
users.add(user1);
User user2 = new User("김나나", "010-1234-1235", 14);
users.add(user2);
for (User user : users) {
System.out.printf("%s님의 전화번호는 %s입니다.\n", user.getName(), user.getPhoneNumber());
}
}
}
생성자 추가를 안하면 빨간줄이 뜬다.
페이지가 없는 책
인덱스 접근 불가
순차 접근만 가능
장점은 데이터를 추가 할 때 좋다.
https://codeup.kr/problem.php?id=3108
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
class Student {
private String code;
private int testId;
private String name;
public Student(String code, int testId, String name) {
this.code = code;
this.testId = testId;
this.name = name;
}
public String getCode() {
return code;
}
public int getTestId() {
return testId;
}
public String getName() {
return name;
}
}
public class Codeup3108 {
private List<Student> students = new ArrayList<>();
public Student makeAStudent(String code, int testId, String name) {
return new Student(code, testId, name);
} // makeAStudent → code, testId, name을 입력 받아서 Student Object로 만들어주는 기능
private boolean isExist(Student pStudent) {
//중복 여부 check
for (Student student : students) {
if (pStudent.getTestId() == student.getTestId()) return true;
}
return false;
} // isExist → students에 입력받은 학생의 code가 중복되는지 여부를 확인해줌
private Student getExistStudent(Student pStudent) {
return new Student("", 0, "");
}
private void deleteStudent(Student pStudent) {
// pStudent가 students에 몇번째에 있는지 알아야 함
for (int i = 0; i < students.size(); i++) {
if (students.get(i).getTestId() == pStudent.getTestId()) students.remove(i);
}
}
private void process(String line) {
String[] splitted = line.split(" ");
Student student = makeAStudent(splitted[0], Integer.parseInt(splitted[1]), splitted[2]);
switch (student.getCode()) {
case "I" -> addAStudent(student);
case "D" -> deleteStudent(student);
}
} // I 가 입력되면 addAStudent 메소드
private void addAStudent(Student student) {
if (!isExist(student)) {
students.add(student);
}
} // addAStudent → students에 중복된 학생이 있는지 check한 후 없다면 add, 아니면 넘어감
private void printStudents() {
for (Student student : students) {
System.out.printf("%s %s %s\n", student.getCode(), student.getTestId(), student.getName());
}
} // printStudents → students에 있는 모든 학생을 출력함
private void printSpecificStudents(int[] arr) {
// 정렬
Collections.sort(students, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getTestId() - o2.getTestId();
}
});
// 출력
for (int i = 0; i < arr.length; i++) {
Student student = students.get(arr[i] - 1);
System.out.printf("%s %s %s\n", student.getCode(), student.getTestId(), student.getName());
}
}
public static void main(String[] args) {
int size = 1;
Codeup3108 codeup3108 = new Codeup3108();
codeup3108.process("I 1011 한라산");
codeup3108.process("I 999 백두산");
codeup3108.process("I 999 오대산");
codeup3108.process("D 999 백두산");
codeup3108.process("I 800 백두산");
codeup3108.process("D 500 한라산");
codeup3108.process("I 900 남산");
codeup3108.process("I 950 금강산");
codeup3108.process("I 1205 지리산");
codeup3108.process("I 700 북한산");
codeup3108.printSpecificStudents(new int[]{1, 2, 4, 5, 6});
}
}
파싱 → String "I 1011 한라산"
를 Java의 Student로 만드는 것.
Console을 통해 입력되는 데이터를 '파싱' 해야겠다
I 1011 한라산
I 999 백두산
I 999 오대산
...
String[] splitted = line.split(" ");
Student student = makeAStudent(splitted[0], Integer.parseInt(splitted[1]), splitted[2]);
for (Student student : students)
pStudent.getTestId() == student.getTestId()
와 같이 java의 연산을 쓸 수 있다.데이터를 보여주는 기능을 만들겠다!
데이터를 → Object로
중복 check기능
문제가 있는 데이터의 skip
검색 기능을 넣을 것인지?
검색 조건은 어떻게 넣을 것인지?
없는 데이터는 어떻게 만들 것인지? (진료과목)
[콘솔에서 읽어오기]
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
[파일에서 읽어오기]
BufferedReader bufferedReader = new BufferedReader(new FileReader("C:\\~...));
<아침에 하루 '각오' 한 줄 적기>
챌린지스 앱으로 2주간 목표 달성하기
기본적으로 오름차순으로 정렬을 수행한다. 1 -> 2 -> 3 -> 4 ...
Comparator
객체를 이용하여 리스트를 정렬하는 경우, sort()
메서드의 두 번째 매개변수로 Comparator
객체를 전달한다.
Comparator
인터페이스는 정렬할 객체의 클래스와 별도로 정렬 기준을 정의하는 클래스로, compare()
메서드를 구현해야 한다.
compare()
메서드는 두 객체를 비교하여 양수, 음수, 0 중 하나를 반환하며, 이 값에 따라 정렬이 수행된다.
금일 배운 것은 컬렉션 List와 파싱 맛보기. List까지는 할만하다 싶었는데 강사님의 코드업 문제 풀이가 시작된 후로는 거의 키보드에 손을 놔버렸다. 어차피 지금 수준으로는 이해 불가의 코딩이었으니 차라리 마음이 편했다.
그나마 코드업 문제 제외하면 나머지 실습들은 따라하기에 충분했던 것 같다.
최근에 스트레스를 많이 받았는지 입안에 빵꾸가 세 개나 나버려서 밥먹거나 양치할 때 고통받고 있다. 복습도 복습이지만 항상 건강이 우선이라고 생각하기 때문에 오늘은 일찍 잠을 자야겠다.