study

(230511) Collection - List, set, map

hjkeeeem 2024. 7. 25. 20:26

컬렉션(Collection)

여러개의 자료를 넣을 수 있는 구조체

Array보다 향상된 편의 기능을 제공하는 자료 저장 객체

 

List (리스트 왜 써야하나요?)

- 길이가 자동 조정이 가능하다. array는 개수를 지정해야 함

- 목록을 다룰 때 List 사용

 

LinkedList -> 자료구조(알고리즘) 시간에 배울 예정

- 페이지가 없는 책이라 인덱스 접근이 불가능

- 순차 접근만 가능

- 중간에 데이터를 추가할 때 좋음 ( 다음 것의 주소를 알고 있기 때문에 )

 

ArrayList<String> 

- 탐색이 빠르다.

 

list -> 인터페이스

Arraylist -> 클래스

 

List 사용 예제

- 선언과 초기화

import java.util.ArrayList;
import java.util.List;

public class ListEx {
    public static void main(String[] args) {
        List l1 = new ArrayList(); //리스트 선언과 초기화
    }
}

- List의 메소드 연습

import java.util.ArrayList;
import java.util.List;

public class ListEx {
    public static void main(String[] args) {
        //리스트 선언과 초기화
        //Printer pt = new ConsolePrinter() 처럼 부모오브젝트 변수명 = new 자식오브젝트()로 표현
        List l1 = new ArrayList(); //collection을 extends(=상속을 받음) 컬렉션도 인터페이스
        l1.add("Hello");
        System.out.println("li.get(0) : "+l1.get(0));
        l1.add(1);
        System.out.println("li.get(1) : "+l1.get(1));
        System.out.println("l1.size() : "+l1.size()); //들어있는 값들의 개수
        System.out.println("l1.isEmpty() : "+l1.isEmpty());
        l1.remove(0); //0번을 지움
        l1.remove(0); //값이 밀려 1번에 있떤것이 0번으로 지정되고 0번 삭제 (=비었음)
        System.out.println("l1.isEmpty() : "+l1.isEmpty());
    }
}

add()

- 리스트에 값을 넣을 때 사용

 

.get() 

- 리스트에서 값을 뽑을 때 (인덱스를 이용)

 

.size()

- 리스트에 들어있는 값들의 개수

 

.isEmpty()

- 리스트가 비워져 있는지 확인

 

.iterator (이터레이터)

- for문을 쓸 수 있는 ( =반복할 수 있는(repeator) )

 

제네릭 ( Generic )

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

- List <타입 > 형태로 사용해야 한다. (=타입을 지정해줘야하는 이유)

- 타입을 붙여주지 않으면 효율적으로 관리할 수 없다.

- 제네릭 안쓰면 타입을 예측할 수 없음으로 인한 불편함이 생긴다.

- 반복을 하거나 컬렉션 사용시 예측성이 증가하여 복잡한 처리를 하는데 도움을 준다.

 

제네릭 추가설명

만약에 우리가 어떤 자료구조를 만들어 배포하려고 합니다.
그런데 String 타입도 지원하고 싶고 Integer타입도 지원하고 싶고 많은 타입을 지원하고 싶습니다.

그러면 String에 대한 클래스, Integer에 대한 클래스 등 하나하나 타입에 따라 만들 것인가요?
그건 너무 비효율적이게 됩니다. 이러한 문제를 해결하기 위해 우리는 Generic(제너릭)이라는 것을 사용합니다.
Generic은 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미합니다.
한마디로 특정 타입을 미리 지정해주는 것이 아닌 필요에 의해 지정할 수 있도록 하는 일반(Generic) 타입입니다.
즉, 저런 인스턴스의 형 변환을 통해 내부 디테일과 메모리 함축에서 이점과 성능을 개선시킬 수 있습니다.

 

제네릭을 쓰지 않으면 split이나 다른 메소드를 자유롭게 사용하지 못 함 ( = 타입 설정을 해주지 않았을 때 )

- ListEx.java 파일에서 실행

제네릭을 사용했을 때 ( = 타입 설정을 해주었을 때 ) 사용 가능함.

- GenericEx.java파일에서 실행

 

 

List에 User 넣기

 

Constructor, getter, setter

- 오브젝트에 값을 할당하고 받아오는 메소드들

- 오브젝트의 멤버변수에 직접 접근하는 방법을 피하기 위해서 사용

- 직접 접근을 거의 90% 이상 하지 않는다.

 

- 패스워드, 전화번호, 이메일같은 민감정보는 getter를 만들지 않는 방법으로 데이터를 보호

- getter를 만들어도 접근제어 로직을 만들어 한번 본인 확인 로직이나 보안 로직을 타고 사용할 수 있도록 사용

- 직접 접근할 시 저런 보안로직을 넣을 수 없음

 

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

- Getter, Setter는 데이터를 보호할 때 사용한다.

- getter 은 인스턴스 변수를 반환하고 setter 은 인스턴스 변수를 대입하거나 수정한다.

 

https://velog.io/@cksdnr066/getter-%EC%99%80-setter-%EB%8A%94-%EC%99%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%EA%B1%B8%EA%B9%8C

 

getter 와 setter 는 왜 사용하는걸까?

이 글은 Getters And Setters in Java Explained 를 번역한 글입니다.번역에 오류가 있을 수 있으니 주의바랍니다.무의식적으로 쓰던 getter 과 setter에 대한 궁금증이 생겼다. 암기만 하고 있었을 뿐 어떤 상

velog.io

게터세터 예제로 다시 정리하기

 

package com.example.javaproject2.codeup;

import java.util.ArrayList;
import java.util.List;

class Student {
    private String code;
    private String testId;
    private String name;

    public Student(String code, String testId, String name) {
        this.code = code;
        this.testId = testId;
        this.name = name;
    }

    public String getCode() {
        return code;
    }

    public String getTestId() {
        return testId;
    }

    public String getName() {
        return name;
    }

    public static class Codeup3108 {
        private List<Student> students = new ArrayList<>();

        public Student makeAStudent(String code, String testId, String name) {
            return new Student(code, testId, name);
        }
    }

    public boolean isDuplicated(Student pStudent) {
        // 중복 여부 check
        Student[] students = new Student[0];
        for (Student student : students) {
            if (pStudent.getCode().equals(student.getCode())) return false;
        }
        return true;
    }

    public static void main(String[] args) {
        int size = 1;
        String[] splitted = "I 1011 한라산".split(" ");

        Codeup3108 codeup3108 = new Codeup3108();
        Student student = codeup3108.makeAStudent(splitted[0], splitted[1], splitted[2]);
        System.out.println(student.getCode());
        System.out.println(student.getTestId());
        System.out.println(student.getName());
    }
}

return new ~ 물어보기