컬렉션 프레임워크 - ArrayList

컬렉션 프레임워크 - ArrayList

Algorithmday_3 정리 (2021.11.30 화요일)

컬렉션 프레임워크(Collection Framework)

컬렉션 사전적 의미로 요소(객체)를 수집해 저장한 것

프레임워크 라이브러리 프로그래밍 방식 표준화, 정형화된 체계적인 프로그래밍 방식 미리 정해진 방식대로 개발 누가 작성하든 프로그램이 표준화되기 때문에 프로그램 유지보수하기 쉬워진다.

컬렉션 프레임워크 컬렉션(다수의 객체)를 다루기 위한 표준화된 프로그래밍 방식 많은 양의 데이터를 저장, 삭제, 검색, 비교, 정렬 작업 등을 편리하게 쉽게 수행 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 제공되는 컬렉션 라이브러리 인터페이스를 통해서 정형화된 방법으로 다양한 컬렉션 클래스 이용 인터페이스와 다형성을 이용한 객체지향적 설계를 통해 표준화 되어 있기 때문에 사용법 편하고 재사용성이 높은 코드 작성 가능 프로그래머의 프로그래밍 부담을 많이 덜어 줌 java.util. * 패키지에 포함

자바 컬렉션 객체를 수집해서 저장하는 역할

프레임워크 사용법을 미리 정해 놓은 라이브러리

컬렉션 클래스 다수의 데이터를 저장할 수 있는 클래스 예 : ArrayList, Linked List, Vector, HashSet, TreeSet

컬렉션 프레임워크의 주요 인터페이스 List 순서가 있는 데이터의 집합, 데이터의 중복을 허용한다. ArrayList, Linked List, Vector Set 순서를 유지하지 않는 데이터의 집합, 데이터의 중복을 허용하지 않는다. HashSet TreeSet Map Key-Value 쌍으로 이루어진 데이터의 집합, 순서는 유지되지 않으며 키는 중복을 허용하지 않고, 값은 중복을 허용한다. HashMap HashTable TreeMap Properties List와 Set의 공통된 부분을 뽑아서 새로운 인터페이스 Collection이 추가로 정의되었음 Map은 List/Set과 전혀 다른 형태로 컬렉션을 다루기 때문에 같은 상속 계층에 포함되지 못했음

컬렉션 프레임워크 특징 List, Set, Map 인터페이스 이름이 클래스 이름에 포함되어 있음 이름만으로도 클래스의 특징을 쉽게 알 수 있다. Vector, Stack, HashTable, Properties와 같은 클래스들은 컬렉션 프레임워크가 만들어지기 전부터 존재했기 때문에 컬렉션 프레임워크 명명법을 따르지 않음 Vector나 HashTable 등 기존 컬렉션 클래스들은 이전에 작성된 프로그램들과 호환을 위해 설계를 변경해서 남겨둔 것임 가능하면 ArrayList와 HashMap 사용 추천

List 인터페이스의 특징 및 주요 메소드

특징 순서가 있는 집합 인덱스로 관리 중복해서 객체 저장 가능

구현 클래스 ArrayList LinkedList Vector

주요 메소드 add(), get(), inEmpty(), size(), remove(), clear()

ArrayList

List 인터페이스의 구현 클래스

크기가 가변적으로 변하는 선형 리스트

배열과 유사(순차리스트, 인덱스 사용)

배열과 차이점 배열 : 크기 고정 ArrayList : 객체 추가 가능, 저장 용량 초과 시 자동으로 저장 용량 증가

단점 데이터를 읽어오고 저장하는데는 효율적이지만, 용량을 변경해야 할 때는 새로운 배열을 생성한 후 기존 배열로부터 새로운 배열로 복사해야 하기 때문에 상당히 비효율적 따라서 처음에 생성할 때 저장할 데이터의 개수를 잘 고려하여 충분한 용량으로 생성하는 것이 좋다.

사용법 객체 추가 인덱스 0부터 차례로 저장 객체 제거 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 이동 따라서 빈번한 객체 삭제와 삽입이 일어나는 경우 ArrayList를 사용하는 것이 바람직하지 않음 -> Linked List

// 제네릭을 사용하지 않을 경우 형변환 필요 List list = new ArrayList(); list.add("abc"); String str = (String)list.get(0);

// 제네릭을 사용할 경우 형변환이 필요 없음. List list = new ArrayList(); list.add("abc"); String str = list.get(0);

ArrayListEx1(제네릭 사용하지 않는 경우 예제)

public class ArrayListEx1 { public static void main(String[] args) { List list = new ArrayList(5); list.add(100); list.add(2.55); list.add(300); list.add(9.9); list.add("자바 프로그래밍"); list.add(1, "데이터베이스"); // 1번 index부터 뒤로 한 칸씩 밀고 1번에 삽입 System.out.println("리스트 내용 출력"); for(int i = 0; i

ArrayListEx1(제네릭 사용하는 경우 예제)

public class ArrayListEx2 { public static void main(String[] args) { List list = new ArrayList(); list.add("Java"); list.add("JDBC"); list.add("Servlet/JSP"); list.add("고병채 만세"); System.out.println(); System.out.println("전체 내용 출력"); for(int i = 0; i < list.size(); i++) { System.out.println(i + " : " + list.get(i)); } System.out.println(); System.out.println("전체 내용 출력 2"); for(String item : list) { System.out.println(item); } System.out.println(); System.out.println("네 번째 요소 출력 : " + list.get(3)); System.out.println("네 번째 요소 길이 : " + list.get(3).length()); // 한글도 한 글자당 1개 취급(공백도 1개 취급) // 2번 인덱스 위치(세 번째)에 삽입 list.add(2,"Spring"); // 총 객체 수 출력 System.out.println(); System.out.println("총 객체 수 : " + list.size()); // 전체 내용 출력 System.out.println(); System.out.println("전체 내용 출력 3"); for(String item : list) { System.out.println(item); } // JDBC 제거 System.out.println(); System.out.println("JDBC 제거"); list.remove("JDBC"); // Java포함 여부 System.out.println(); System.out.println("Java 포함 여부"); System.out.println(list.contains("Java")); } }

ArrayList 연습문제

ArrayListEx3

public class ArrayListEx3 { public static void main(String[] args) { ArrayList list = new ArrayList(); Scanner scan = new Scanner(System.in); int temp = 0; String str = ""; for(int i = 0; i < 4; i++) { System.out.print("단어 입력 : "); list.add(scan.nextLine()); } System.out.println("---------------------------------------------"); System.out.print("단어 리스트 : "); for (int i = 0; i < list.size(); i++) { System.out.print(list.get(i) + " "); if (temp < list.get(i).length()) { temp = list.get(i).length(); str = list.get(i); } } System.out.println("

가장 긴 단어 : " + str); System.out.println("가장 긴 단어 길이 : " + temp); } }

Employee.java

public class Employee { int id; String name; double salary; public Employee(int id, String name, double salary) { this.id = id; this.name = name; this.salary = salary; } @Override public String toString() { return id + " - " + name + " - " + salary; } }

EmployeeMain.java

public class EmployeeMain { public static void main(String[] args) { ArrayList list = new ArrayList(5); Employee employee1 = new Employee(100, "김사원", 3300.55); Employee employee2 = new Employee(101, "박대리", 4100.20); Employee employee3 = new Employee(102, "최과장", 5100.55); list.add(employee1); list.add(employee2); list.add(employee3); System.out.println("리스트 사이즈 : " + list.size()); System.out.println(); System.out.println("리스트 내부 목록 : " + list); System.out.println(); System.out.println("출력 1"); for(int i = 0; i < list.size(); i++) { Employee emp = list.get(i); System.out.println(emp); } System.out.println(); System.out.println("출력 2"); for(int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } } }

ArrayList에 ProductDTO 객체 저장

productDB5 복사해서 다음과 같이 변경 -> productDB6ArrayListVer 패키지(ProductSelect, ProductDTO, ProductDAO.... etc) 모든 행을 ArrayList에 담아, DAO 클래스의 selectProduct() 메서드에서 한 행씩 출력 ProductSelect 클래스의 productSelect() 메서드에게 반환 productSelect() 메서드에서 출력 모든 클래스 복사해서 수정 DAO 클래스의 selectProduct() 메서드의 반환형을 ArrayList 변경 DTO를 담을 ArrayList 객체 생성 : dataSet resultSet에서 하나씩 가져와서 DTO 생성하고 DTO를 ArrayList에 add() return dataSet; ProductSelect 클래스의 productSelect() 반환된 dataSet 출력 StudentDTO 클래스에 toString() 추가 : StringBuilder 사용

ProductDTO.java

public class ProductDTO { // ... @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(prdNo); sb.append("\t"); sb.append(prdName); sb.append("\t"); sb.append(prdPrice); sb.append("\t"); sb.append(prdMaker); sb.append("\t"); sb.append(prdColor); sb.append("\t"); sb.append(ctgNo); return sb.toString(); } }

ProductDAO.java

public class ProductDAO { // ... // select Method public ArrayList selectProduct() { ArrayList dataSet = null; try { String sql = "select * from product order by prdNo"; preparedStatement = connection.prepareStatement(sql); resultset = preparedStatement.executeQuery(sql); dataSet = new ArrayList(); while (resultset.next()) { dataSet.add(new ProductDTO(resultset.getString(1), resultset.getString(2), resultset.getInt(3), resultset.getString(4), resultset.getString(5), resultset.getString(6))); // DTO 1개가 1행에 해당 } } catch (Exception e) { System.out.println("select 오류 발생!"); e.printStackTrace(); } return dataSet; // ArrayList 타입 } // ...

ProductSelect.java

public class ProductSelect { public void productSelect() { ProductDAO productDAO = new ProductDAO(); ArrayList dataSet = new ArrayList(); dataSet = productDAO.selectProduct(); for (ProductDTO dto : dataSet) { System.out.println(dto); } } }

Interface를 통한 구현

기존의 StudentDAO 클래스를 인터페이스 IStudentDAO를 구현한 클래스 변경

IStudentDAO.java(interface)

public interface IStudentDAO { // 추상 메소드(바디 없음) // IStudentDAO 인터페이스를 구현하는 클래스에서 반드시 구현해야 함. public ArrayList selectStudent(); public void insertStudent(StudentDTO studentDTO); }

StudentDAO.java(인터페이스 구현 부분)

public class StudentDAO implements IStudentDAO { Connection connection; PreparedStatement preparedStatement; ResultSet resultset; // DB연결 생성자 public StudentDAO() { try { String url = "jdbc:mysql://localhost:3306/sqldb6?serverTimezone=UTC"; String user = "root"; String pwd = ""; connection = DriverManager.getConnection(url, user, pwd); if (connection != null) { System.out.println("연결 성공"); } } catch (Exception e) { System.out.println("연결 오류 발생!"); e.printStackTrace(); } } @Override public ArrayList selectStudent() { ArrayList dataSet = null; try { String sql = "select * from student order by stdNo"; preparedStatement = connection.prepareStatement(sql); resultset = preparedStatement.executeQuery(sql); dataSet = new ArrayList(); while (resultset.next()) { dataSet.add(new StudentDTO(resultset.getString(1), resultset.getString(2), resultset.getInt(3), resultset.getString(4), resultset.getDate(5).toString(), resultset.getString(6))); // DTO 1개가 1행에 해당 } } catch (Exception e) { System.out.println("select 오류 발생!"); e.printStackTrace(); } return dataSet; // ArrayList 타입 } @Override public void insertStudent(StudentDTO studentDTO) { try { String sql = "insert into student values(?, ?, ?, ?, ?, ?)"; PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setString(1, studentDTO.getStdNo()); preparedStatement.setString(2, studentDTO.getStdName()); preparedStatement.setInt(3, studentDTO.getStdYear()); preparedStatement.setString(4, studentDTO.getStdAddress()); preparedStatement.setString(5, studentDTO.getStdBirthday()); preparedStatement.setString(6, studentDTO.getDptNo()); int result = preparedStatement.executeUpdate(); if (result > 0) { System.out.println("성공"); } } catch (Exception e) { System.out.println("insert 오류 발생!"); e.printStackTrace(); } } }

from http://5bong2-develop.tistory.com/46 by ccl(A) rewrite - 2021-11-30 14:01:26