본문 바로가기
프로그래밍 언어/Java 프로그래밍

컬렉션 프레임워크(2) List 인터페이스- ArrayList 연습문제

by Hyeon_ 2021. 11. 30.

ArrayList 연습문제 -1

  • 4개의 단어를 입력받고 가장 긴 단어와 단어의 길이를 출력하는 프로그램 작성
ArrayListTest1.java
package list;

import java.util.ArrayList;
import java.util.Scanner;

public class ArrayListTest1 {
    public static void main(String[] args) {
        ArrayList<String> a = new ArrayList<String>();
        Scanner scanner = new Scanner(System.in);

        for (int i = 0; i < 4; i++) {
            System.out.print("단어 입력: : ");
            String s = scanner.next();
            a.add(s);
        }

        System.out.println("-----------------------------");

        int longestIndex = 0;
        System.out.print("단어 리스트: ");
        for (int i = 0; i < a.size(); i++) {
            String name = a.get(i);
            System.out.print(name + " ");
            if (a.get(longestIndex).length() < a.get(i).length())
                longestIndex = i;
        }

        System.out.println("\n가장 긴 단어 : " + a.get(longestIndex));
        System.out.println("가장 긴 단어길이 : " + a.get(longestIndex).length());

    }
}

ArrayList 연습문제 -2

  • 제네릭 타입이 클래스인 경우
Employee.java
package list;

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;
    }
}
ArrayListEmployMain.java
package list;

import java.util.ArrayList;

public class ArrayListEmployMain {
    public static void main(String[] args) {
        ArrayList<Employee> list = new ArrayList<Employee>(5);

        Employee e1 = new Employee(100, "김사원", 3000.55);
        Employee e2 = new Employee(100, "박대리", 4000.55);
        Employee e3 = new Employee(100, "최과장", 6000.55);

        list.add(e1);
        list.add(e2);
        list.add(e3);

        System.out.println("리스트 출력");

        System.out.println(list);

        for(int i = 0; i<list.size(); i++){
            Employee emp = list.get(i);
            System.out.println(emp); // System.out.println(list.get(i)); 로 해도 출력값 동일
        }

    }
}

ArrayList 연습문제 -3

  • ArrayList에 StudentDTO 객체 저장
  • db5 패키지 복사해서 다음과 같이 변경
  • DAO 클래스의 selectStudent() 메서드에서 한 행씩 출력
  • 모든 행을 ArrayList에 담아서 StudentSelect 클래스의 select() 메서드에게 반환
  • select() 메서드에서 출력
StudentDAO.java
  • selectStudent() 메서드의 반환형을 ArrayList변경
    • DTO를 담을 ArrayList<StringDTO> 객체 생성: dataSet
    • resultSet에서 하나씩 가져와서 DTO 생성하고 DTO를 ArrayList에 add()
    • return dataSet;
public class StudentDAO {

    // ...

    public ArrayList<StudentDTO> selectStudent() {
        ArrayList<StudentDTO> dataSet = null; // try 안과 밖에서 사용

        try {
            // sql 직성
            String sql = "select * from student order by stdNo";
            pstmt = con.prepareStatement(sql);
            rs = pstmt.executeQuery(sql);

            dataSet = new ArrayList<StudentDTO>();

            while(rs.next()) {
                dataSet.add(new StudentDTO(rs.getString(1),
                                           rs.getString(2),
                                           rs.getInt(3),
                                           rs.getString(4),
                                           rs.getDate(5).toString(),
                                           rs.getString(6)
                        )); // DTO 1개가 1행에 해당당
           }

        } catch (Exception e) {
            System.out.println("오류 발생");
            e.printStackTrace();
        }
        return dataSet; // ArrayList<StudentDTO> 반환
    }

    // ...
}
StudentSelect.java
  • 반환된 dataSet 출력
package db5;

import java.util.ArrayList;

public class StudentSelect {
    public void studentSelect(){
        StudentDAO stdDAO = new StudentDAO();


        ArrayList<StudentDTO> dataSet = new ArrayList<StudentDTO>();
        dataSet = stdDAO.selectStudent();

        System.out.println("제목 출력 알아서,,,");

        for(StudentDTO dto : dataSet) {
            System.out.println(dto);
        }
    }
}
StudentDTO.java
  • toString() 추가 : StringBuilder 사용
public class StudentDTO {

    // ...

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append(stdNo);
        builder.append("\t");

        builder.append(stdName);
        builder.append("\t");

        builder.append(stdYear);
        builder.append("\t");

        builder.append(stdAddress);
        builder.append("\t");

        builder.append(stdBirthday);
        builder.append("\t");
        builder.append("\t");

        builder.append(dptNo);

        return builder.toString();
    }
}

ArrayList 연습문제 -4

  • ArrayList에 Product객체 저장
  • db4 패키지 복사해서 다음과 같이 변경
  • DAO 클래스의 selectProduct() 메서드에서 한 행씩 출력
  • 모든 행을 ArrayList에 담아서 ProductSelect 클래스의 select() 메서드에게 반환
  • select() 메서드에서 출력
ProductDAO.java
public class ProductDAO {
    // ...

    public ArrayList<ProductDTO> selectProduct() {

        ArrayList<ProductDTO> dataSet = null;

        try {
            String sql = "select * from product order by prdNo";
            pstmt = con.prepareStatement(sql);
            rs = pstmt.executeQuery(sql);

            dataSet = new ArrayList<ProductDTO>();

            while(rs.next()) {
                dataSet.add(new ProductDTO(rs.getString(1),
                                           rs.getString(2),
                                           rs.getInt(3),
                                           rs.getString(4),
                                           rs.getString(5),
                                           rs.getInt(6)
                        ));
            }

        } catch (Exception e) {
            System.out.println("오류 발생");
            e.printStackTrace();
        }
        return dataSet;
    }

    // ...
}
ProductEx.java
public class ProductEx {
    // ...

    ArrayList<ProductDTO> dataSet = new ArrayList<ProductDTO>();
        dataSet = prdDAO.selectProduct();

        System.out.println("상품 정보 출력");

        for(ProductDTO dto: dataSet) {
            System.out.println(dto);
        }
}
ProductDTO.java
public class ProductDTO {

    // ...

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append(prdNo);
        builder.append("\t");

        builder.append(prdName);
        builder.append("\t");

        builder.append(prdPrice);
        builder.append("\t");

        builder.append(prdMaker);
        builder.append("\t");

        builder.append(prdColor);
        builder.append("\t");

        builder.append(ctgNo);

        return builder.toString();
    }
}

ArrayList 연습문제 -5 (Interface 사용)

  • 기존의 StudentDAO 클래스를 인터페이스 IStudentDAO를 구현한 클래스로 변경
    1. 인터페이스 생성: IStudentDAO
      • 추상 메서드(바디 없이 선언된 메서드. 바디는 인터페이스를 구현한 클래스에서 작성)만 선언
      • public ArrayList<StudentDTO> selectStudetn();
      • pubilc void insertStudent(StudentDTO dto);
    2. IStudentDAO를 구현한 클래스 StudentDAO 생성
    3. 나머지 파일들은 변동 없음
IStudentDAO.java
package interface_student;

import java.util.ArrayList;

// 인터페이스: 표준 규격을 정해놓은 것
// 인터페이스를 구현하는 클래스에서 정의된 메서드를 반드시 구현해야 함
// @Override 오버라이드 해야 함

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

import java.sql.*;
import java.util.ArrayList;

public class StudentDAO implements IStudentDAO{

    Connection con = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;

    public StudentDAO() {
        try {
            //JDBC Driver 클래스의 객체 생성 런타임시 로드
            //Class.forName("com.mysql.cj.jdbc.Driver");

            // 연결 주소, 사용자 계정, 패스워드 문자열 설정
            String url = "jdbc:mysql://localhost:3306/sqldb2?serverTimezone=UTC";
            String user = "root";
            String pwd = "1234";

            // DB 연결하기 위한 객체 생성
            // DriverManager를 통해 Connection 객체 생성
            // MySQL 서버 연결 : 주소, 사용자 계정, 패스워드 전송
            con = DriverManager.getConnection(url, user, pwd);

            // Connection 객체가 생성되면 DB 연결 성공
            if(con != null) {
                System.out.println("DB 연결 성공!");
            }

        } catch (Exception e) {
            System.out.println("오류 발생!");
            e.printStackTrace();
        }
    }

    //(2) selectStudent() 메서드
    @Override
    public ArrayList<interface_student.StudentDTO> selectStudent() {
        ArrayList<interface_student.StudentDTO> dataSet = null; // try 안과 밖에서 사용

        try {
            // sql 작성
            String sql = "select * from student order by stdNo";
            pstmt = con.prepareStatement(sql);
            rs = pstmt.executeQuery(sql);

            dataSet = new ArrayList<interface_student.StudentDTO>();

            while(rs.next()) {
                dataSet.add(new interface_student.StudentDTO(rs.getString(1),
                        rs.getString(2),
                        rs.getInt(3),
                        rs.getString(4),
                        rs.getDate(5).toString(),
                        rs.getString(6)
                )); // DTO 1개가 1행에 해당당
            }

        } catch (Exception e) {
            System.out.println("오류 발생");
            e.printStackTrace();
        }
        return dataSet; // ArrayList<StudentDTO> 반환
    }

    //(3) insertStudent(StudentDTO dto)
    @Override
    public void insertStudent(interface_student.StudentDTO dto) {
        try {
            // sql문 작성
            String sql = "insert into student values(?,?,?,?,?,?)";

            pstmt = con.prepareStatement(sql);
            pstmt.setString(1,dto.getStdNo());
            pstmt.setString(2,dto.getStdName());
            pstmt.setInt(3,dto.getStdYear());
            pstmt.setString(4,dto.getStdAddress());
            pstmt.setString(5,dto.getStdBirthday());
            pstmt.setString(6,dto.getDptNo());

            int result = pstmt.executeUpdate();

            if(result > 0) System.out.println("데이터 입력 성공");

        } catch (Exception e) {
            System.out.println("오류 발생");
            e.printStackTrace();
        }
    }

    public void updateStudent(interface_student.StudentDTO dto){
        try {
            // sql문 작성
            String sql = "update student set stdName=?, stdYear=?, stdAddress=?, stdBirthday=?, dptNo=? where stdNo=?";

            pstmt = con.prepareStatement(sql);
            pstmt.setString(1,dto.getStdName());
            pstmt.setInt(2,dto.getStdYear());
            pstmt.setString(3,dto.getStdAddress());
            pstmt.setString(4,dto.getStdBirthday());
            pstmt.setString(5,dto.getDptNo());
            pstmt.setString(6,dto.getStdNo());

            int result = pstmt.executeUpdate();

            if(result > 0) System.out.println("데이터 수정 성공");

        } catch (Exception e) {
            System.out.println("오류 발생");
            e.printStackTrace();
        }
    }
}