컬렉션, List, Codeup3108, 파싱

calis_ws·2023년 5월 11일
0
post-custom-banner

컬렉션(Collections)

여러개의 자료를 넣을 수 있는 자료구조의 Java 구현체
Array보다 향상된 편의 기능을 제공하는 자료 저장 객체

List

리스트 왜 써야 하나?

  1. List는 순서가 있는 데이터를 다룰 때 유용하다.

  2. List는 중복된 데이터를 저장할 수 있다.

  3. List는 인덱스를 사용하여 데이터에 빠르게 접근할 수 있다.

  4. 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
    }
}

.iterator(이터레이터)

== repeator(리피터) 반복할 수 있는
for문을 쓸 수 있는

for(var item : l1){ // for each
   System.out.println(item);
}

제네릭(Generic)

컬렉션에 타입을 지정 해주는 기능

  • List<타입> : 반, 학과
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()); 	// 사용가능
}
  • List와 Array는 다른 자료구조
int[] arr = new int[3]; 			   	  [Stack영역]		 
→ primitive type
List<Integer> list1 = new ArrayList<>();  [Heap영역]List에 타입을 지정 할 때는 Reference Type만 가능

Constructor, Getter, Setter

오브젝트에 값을 할당하고 받아오는 메소드들
오브젝트의 멤버변수에 직접 접근 하는 방법을 피하기 위해 쓴다.

오브젝트에 값을 할당 할 때는 Constructor를 주로 쓴다.
Alt + Insert

List에 User넣기

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<>();
    }
}

Constructor, Getter, Setter 추가

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());
    }
}

Getter, Setter는 필요한 것만 만든다.

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());
        }
    }
}


생성자 추가를 안하면 빨간줄이 뜬다.

LinkedList → 자료구조(알고리즘)

  • 페이지가 없는 책

  • 인덱스 접근 불가

  • 순차 접근만 가능

  • 장점은 데이터를 추가 할 때 좋다.

Codeup3108

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의 연산을 쓸 수 있다.

설계의 출발

  1. 데이터를 보여주는 기능을 만들겠다!

  2. 데이터를 → Object로

  3. 중복 check기능

  4. 문제가 있는 데이터의 skip

  5. 검색 기능을 넣을 것인지?

  6. 검색 조건은 어떻게 넣을 것인지?

  7. 없는 데이터는 어떻게 만들 것인지? (진료과목)

[콘솔에서 읽어오기]
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));

[파일에서 읽어오기]
BufferedReader bufferedReader = new BufferedReader(new FileReader("C:\\~...));

인사이트 타임

회고팀 챌린지 이벤트 계획하기

<아침에 하루 '각오'   적기>

챌린지스 앱으로 2주간 목표 달성하기

정렬함수 Collections.sort

  • 기본적으로 오름차순으로 정렬을 수행한다. 1 -> 2 -> 3 -> 4 ...

  • Comparator 객체를 이용하여 리스트를 정렬하는 경우, sort() 메서드의 두 번째 매개변수로 Comparator 객체를 전달한다.

  • Comparator 인터페이스는 정렬할 객체의 클래스와 별도로 정렬 기준을 정의하는 클래스로, compare() 메서드를 구현해야 한다.

  • compare() 메서드는 두 객체를 비교하여 양수, 음수, 0 중 하나를 반환하며, 이 값에 따라 정렬이 수행된다.

refactor inline

  • Ctrl + Alt + N

review

금일 배운 것은 컬렉션 List와 파싱 맛보기. List까지는 할만하다 싶었는데 강사님의 코드업 문제 풀이가 시작된 후로는 거의 키보드에 손을 놔버렸다. 어차피 지금 수준으로는 이해 불가의 코딩이었으니 차라리 마음이 편했다.
그나마 코드업 문제 제외하면 나머지 실습들은 따라하기에 충분했던 것 같다.

최근에 스트레스를 많이 받았는지 입안에 빵꾸가 세 개나 나버려서 밥먹거나 양치할 때 고통받고 있다. 복습도 복습이지만 항상 건강이 우선이라고 생각하기 때문에 오늘은 일찍 잠을 자야겠다.

profile
반갑습니다람지
post-custom-banner

0개의 댓글