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 클래스를 사용한다는 것도 생각해볼 수 있다.
<코드 및 자료 참조>
'Java > Java Concept' 카테고리의 다른 글
[Java] 객체지향 사실과 오해 1- 협력하는 객체들의 공동체 (0) | 2023.03.10 |
---|---|
[Java] HashMap, HashSet 개념정리 (2) | 2022.10.31 |
메소드 오버라이딩(Method Overriding) 개념 (0) | 2022.08.09 |
상속(inheritance) (0) | 2022.08.09 |
메소드의 구분(클래스 메소드, 인스턴스 메소드) (0) | 2022.08.09 |