Java/Java Concept

ArrayList<E> 클래스 및 제네릭 함수 개념

SeungbeomKim 2022. 8. 13. 15:25

ArrayList<>는 컬렉션 클래스 중 가장 많이 사용하는 함수이다.

컬렉션 프레임워크 ?

  • 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미한다.
  • 데이터르 저장하는 자료구조와 데이터를 처리하는 알고리즘을 구조화해 클래스로 구현해 놓은 것이다.

List 클래스의 특징

  • 중복 저장을 허용한다.
  • 저장 순서가 유지된다.

ArrayList 클래스는 배열을 이용하기 때문에 인덱스를 활용해 요소 접근이 편리하다.

ArrayList<Integer> arrList = new ArrayList<Integer>;

arrList.add(40);

arrList.add(20);

arrList.add(30);

arrList.add(10);

 

// for 문과 get() 메소드를 이용한 요소의 출력

for (int i = 0; i < arrList.size(); i++) {

    System.out.print(arrList.get(i) + " ");

}

 

// remove() 메소드를 이용한 요소의 제거

arrList.remove(1);

 

// Enhanced for 문과 get() 메소드를 이용한 요소의 출력

for (int e : arrList) {

    System.out.print(e + " ");

}

제네릭(generic)

=> 데이터의 타입을 일반화하는 것을 의미하다.

=> 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시 미리 지정해 놓는 것을 의미한다.

=> 클래스나 메소드에만 선언할 수 있다.

 

컴파일 시 미리 타입 검사를 진행할 때의 장점

  • 클래스나 메소드 내부에서 사용되는 객체의 타입 안정성을 높여준다.
  • 반환 값에 대한 타입 변환 및 타입 검사에 들어가는 시간을 줄여준다.

예시)

class MyArray<T> {

    T element;

    void setElement(T element) { this.element = element; }

    T getElement() { return element; }

}

다음과 같이 T는 Type변수라고 하는데 어떤 타입 변수(ex)Integer String 등)가 들어와도 상관없다는 의미이다.

MyArray<Integer> myArr = new MyArray<>();  		//가능
MyArray<Integer> myArr = new MyArray<Integer>();//가능
mport java.util.*;

 

class LandAnimal { public void crying() { System.out.println("육지동물"); } }

class Cat extends LandAnimal { public void crying() { System.out.println("냐옹냐옹"); } }

class Dog extends LandAnimal { public void crying() { System.out.println("멍멍"); } }

class Sparrow { public void crying() { System.out.println("짹짹"); } }
//이는 상속받는 자식 클래스가 아니므로 다른 클래스에서 적용 불가능

 
// T는 타입 변수(임의의 참조 변수)
class AnimalList<T> {

    ArrayList<T> al = new ArrayList<T>();

 

    void add(T animal) { al.add(animal); }

    T get(int index) { return al.get(index); }

    boolean remove(T animal) { return al.remove(animal); }

    int size() { return al.size(); }

}

 

public class Generic01 {

    public static void main(String[] args) {

        AnimalList<LandAnimal> landAnimal = new AnimalList<>(); // Java SE 7부터 생략가능함.

 

        landAnimal.add(new LandAnimal());

        landAnimal.add(new Cat());

        landAnimal.add(new Dog());

        // landAnimal.add(new Sparrow()); // 오류가 발생함.

 

        for (int i = 0; i < landAnimal.size() ; i++) {

            landAnimal.get(i).crying();

        }

    }

출력 결과물

육지동물

냐옹냐옹

멍멍

제네릭 개념은 스프링에서 자주 쓰이므로 잘 참고 하는 것이 좋다.

왜냐하면 스프링에서 List클래스를 주로 사용하고, 데이터 타입(T)에 다른 클래스를 참조하는 경우가 많기 때문이다.

public class Board {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 인스턴스를 생성하면, 자동으로 인덱스를 붙여라
    private Long id; //1,2,3,4,5 테이블에서 구별하기 위한 Index id

    @Column(nullable = false, length = 30)
    private String title;   // null값 허용 안됨, 길이 제한 30자 이내
    @Column(nullable = false)
    private String content;

    @Column(nullable = false)
    private String writer;

    public Board(String title, String content, String writer)
    {
        this.title = title;
        this.content = content;
        this.writer = writer;
    }
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BoardResponseDto {
    private String titleDto;
    private String contentDto;
    private String writerDto;

    public static BoardResponseDto toDto(Board board){
        return new BoardResponseDto(
                board.getTitle(),
                board.getContent(),
                board.getWriter()
        );
    }
}
 @Transactional(readOnly = true)
    public List<BoardResponseDto> getBoards() {

        List<Board> boards = boardRepository.findAll();
        List<BoardResponseDto> boardResponseDtoList = new ArrayList<>();

//        for(Board board : boards) {
//            boardResponseDtoList.add(new BoardResponseDto().toDto(board));
//        }

        boards.stream().forEach(i -> boardResponseDtoList.add(new BoardResponseDto().toDto(i)));

        return boardResponseDtoList;
    }

데이터의 타입을 내부 클래스 및 메소드에서 저장해 둔다면, 다음과 같이 객체의 타입 안정성을 유지할 수 있음과 더불어, 타입 check에 대한 시간을 줄일 수 있게 된다. 스프링에서 Entity(테이블)에 있는 데이터를 감싸기 위해 새로운 배열리스트만들어 Entity의 모든 데이터들을 담아야 한다. 그 데이터들을 담기 위해서 ArrayList 클래스를 사용한다는 것도 생각해볼 수 있다.

<코드 및 자료 참조>

http://www.tcpschool.com/

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com