작업 순서는 DTO -> DAO -> MainClass

 

 

지금 해놓은 코드에서 더 할 만한 것은

1. MainClass 의 while 문 종료 조건 추가

2. DAO 클래스에서 코드가 겹치는 작업이 있음 (select, update, delete)

- 일단 '삭제/수정/검색'할 항목이 존재하는지 검증해야 하는 루틴

3. 검색 루틴에서 검색 조건을 구체화 할 수 있음

4. 업데이트 루틴에서 업데이트 할 항목을 구체화 할 수 있음

5. 삭제 루틴에서 배열을 앞으로 옮겨줘야 함, 그 이후에 삭제하는 것으로 중간에 비는 항목 처리 가능

- 이것은 ArrayList를 사용하면 의미가 없는 작업이기는 함.


DTO 클래스

package dto;

// Data Transform Object : DTO
public class StudentDTO {
    private int number;
    private String name;
    private double height;
    private String address;

    public StudentDTO() { }

    public StudentDTO(int number, String name, double height, String address) {
        this.number = number;
        this.name = name;
        this.height = height;
        this.address = address;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "StudentDTO{" +
                "number=" + number +
                ", name='" + name + '\'' +
                ", height=" + height +
                ", address='" + address + '\'' +
                '}';
    }
}

 

DAO 클래스

- CRUD 메소드의 이름을 insert, delete, select, update로 변경함

- print, search 메소드 추가

package dao;

import dto.StudentDto;

import java.util.Scanner;

// Data Access Object : DAO (CRUD) -> insert, delete, select, update로 변경
public class StudentDao {
    private Scanner sc;
    private StudentDto[] students = new StudentDto[10];
    private int count;  // 배열 크기 관리를 위한 저장용 변수

    public StudentDao() {
        sc = new Scanner(System.in);
        count = 0;  // 초기화

        // 테스트용 데이터
        students[0] = new StudentDto(1, "김일성", 169, "평양시");
        students[1] = new StudentDto(2, "김정일", 170, "평양시");
        students[2] = new StudentDto(3, "김정은", 175, "평양시");
        students[3] = new StudentDto(4, "김여정", 160, "평양시");
        students[4] = new StudentDto(5, "리설주", 164, "평양시");
    }

    // 함수 4개 만들어야 함
    public void insert() {  // 추가
        System.out.println("학생 추가");
        System.out.print("번호 >>> ");
        int number = sc.nextInt();

        System.out.print("이름 >>> ");
        String name = sc.next();

        System.out.print("신장 >>> ");
        double height = sc.nextDouble();

        System.out.print("주소 >>> ");
        String address = sc.next();

        students[count] = new StudentDto(number, name, height, address);
/*        // 객체 생성 후 배열에 삽입 (같은 내용)
        StudentDTO dto = new StudentDTO(number, name, height, address);
        students[count] = dto;*/
        count++;
    }

    public int search(String name) {
        int index = -1;
        for (int i=0; i<students.length; i++) {
            StudentDto dto = students[i];
            if (dto != null && name.equals(dto.getName())) {
                index = i;
                break;
            }
        }
        return index;
    }

    public void delete() {  // 삭제
        System.out.println("학생 삭제");
        System.out.print("삭제할 학생 이름 >>> ");
        String name = sc.next();

        // 방법1 - 인덱스 번호로 삭제하기
        // 검색
        int index = -1;
        for (int i=0; i<students.length; i++) {
            StudentDto dto = students[i];
            if (dto != null && name.equals(dto.getName())) {
                index = i;
                break;
            }
        }

        // 삭제
        if (index == -1) {
            System.out.println("학생정보를 찾을 수 없습니다!");
            return;
        }
        students[index] = null;
        System.out.println("학생이 삭제되었습니다");

        // 방법2 - 배열이 아니고 컬렉션을 사용한다면, 이렇게
/*        StudentDto dto = null;
        for (StudentDto st : students) {
            if (st != null && name.equals(st.getName())) {
                dto = st;   // 이 부분에 주목
            }
        }

        if (dto == null) {
            System.out.println("학생정보를 찾을 수 없습니다");
            return;
        }

        // 배열이기 때문에 이 부분 추가
        for (int i=0; i<students.length; i++) {
            if (dto == students[i]) {
                students[i] = null;
            }
        }

        dto = null;
        System.out.println("학생 데이터가 삭제되었습니다");*/
    }

    public void select() {  // 검색
        System.out.println("학생 검색");
        System.out.print("검색할 학생 이름 >>> ");
        String name = sc.next();

        int index = search(name);

        if (index == -1) {
            System.out.println("학생정보를 찾을 수 없습니다!");
            return;
        }
        System.out.println("학생정보입니다.");
        System.out.println(students[index]);
    }

    public void update() {  // 수정
        System.out.println("학생 수정");
        System.out.print("수정할 학생 이름 >>> ");
        String name = sc.next();

        int index = search(name);

        System.out.println("학생정보입니다.");
        System.out.println(students[index]);

        System.out.println("수정할 주소 입력");
        String address = sc.next();

        students[index].setAddress(address);
        System.out.println("수정이 완료되었습니다.");
    }

    public void print() {
        for (int i=0; i< students.length; i++) {
            StudentDto st = students[i];
            if (st != null) {
                System.out.println(st.toString());
            }
        }
    }
}

MainClass 코드

package main;

import dao.StudentDAO;

import java.util.Scanner;

public class MainClass {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // menu
        StudentDAO dao = new StudentDAO();

        while (true) {
            System.out.println("<  행복관리 프로그램  >");
            System.out.println("1. 학생추가");
            System.out.println("2. 학생삭제");
            System.out.println("3. 학생검색");
            System.out.println("4. 학생수정");
            System.out.println("5. 모두출력");

            System.out.print("메뉴번호를 입력 >>> ");
            int menu = sc.nextInt();

            switch (menu) {
                case 1:
                    dao.insert();
                    break;
                case 2:
                    dao.delete();
                    break;
                case 3:
                    dao.select();
                    break;
                case 4:
                    dao.update();
                    break;
                case 5:
                    dao.print();
                    break;
            }

        }

    }
}
Game game = new Game();
game.play();

 

class Game {
    int randNum;
    int guessNum;
    boolean result;
    int win = 0;
    int lose = 0;

    Scanner sc = new Scanner(System.in);    // 멤버 변수 -> heap 영역에 올라가 있음

    // 주사위의 랜덤 숫자 결정
    void init() {   // initialize (초기화)
        result = false;
        randNum = (int)(Math.random() * 6) + 1;
    }

    // 유저 인풋 받기
    void userInput() {
        // Scanner sc = new Scanner(System.in);     // --> Stack에 올라가 있음
        System.out.print("예측 숫자 입력 >>> ");
        guessNum = sc.nextInt();
    }

    // 판정
    void finding() {
        if (randNum == guessNum) {
            result = true;
            win++;
        } else {
            lose++;
        }
    }
    // 판정 결과
    void result() {
        System.out.println("주사위 수 = " + randNum);
        if (result) {
            System.out.println("정답입니다!");
            System.out.println("승률: " + win + "승" + lose + "패");
        } else {
            System.out.println("틀렸습니다.");
            System.out.println("승률: " + win + "승" + lose + "패");
        }
    }

    void play() {
        while (true) {
            init();
            userInput();
            finding();
            result();

            System.out.print("play again? (y/n) >>> ");
            String msg = sc.next();
            if (msg.equals("n") || msg.equals("N")) {
                System.out.println("안녕히 가십시오.");
                break;
            }
        }
    }
}

실행결과

 

MyTv2 t = new MyTv2();

t.setChannel(10);
System.out.println("CH:"+ t.getChannel());

t.setVolume(20);
System.out.println("VOL:"+ t.getVolume());

 

class MyTv2 {
    int ch;
    int vol;

    // setter
    void setChannel (int n) {
        ch = n;
    }

    void setVolume (int n) {
        vol = n;
    }

    // getter
    int getChannel() {
        return ch;
    }

    int getVolume() {
        return vol;
    }
}

 

실행결과

수행할 내용:

1. 파일명 ?을 입력 받아서 파일을 생성하고

2. 회원 ?명의 이름을 입력받아 작성한다

3. 파일로부터 모든 회원을 읽어들여 String 배열에 저장하고, 출력하기

 

import java.io.*;
import java.util.Arrays;
import java.util.Scanner;

public class Work1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        /*
            파일명을 입력 받아 작성하고
            파일에 회원 ?명을 입력받아 작성한다
            파일로부터 모든 회원을 읽어 들여 String 배열에 저장한다
         */

        // 파일명을 입력 받아 작성
        System.out.print("생성할 파일명 입력 >>> ");
        String user_input = sc.next();
        String fileDir = "e:\\" + user_input + ".txt";
        File newFile = new File(fileDir);

        // 파일에 회원 ?명을 입력받아 작성
        System.out.print("입력할 회원수 입력 >>> ");
        int user_input_num = sc.nextInt();

        for (int i=0; i<user_input_num; i++) {
            System.out.print("회원명 입력 >>> ");
            String st = sc.next();
            try {
                FileWriter fw = new FileWriter(newFile, true); // append 모드로 열기
                fw.write(st + "\n");
                fw.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }

        // 파일로부터 모든 회원을 읽어 들여 String 배열에 저장
        try {
            FileReader fr = new FileReader(newFile);
            BufferedReader br = new BufferedReader(fr);

            // 데이터 읽어오기
            String names = "";
            String str = "";

            while ((str = br.readLine()) != null){
                names = names + str + "-";
            }
            br.close();

            names = names.substring(0, names.length()-1);   // 맨 끝에 붙은 토큰 제거 => .substring(시작 인덱스, 끝 인덱스)

            String[] nameArr = names.split("-");

            System.out.println(names);
            System.out.println(Arrays.toString(nameArr));

        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }
}
static int[] shuffle(int[] arr) {
    /*
        셔플 로직: for문을 돌면서 배열의 각 요소에 대하여 새로운 자리(=인덱스 번호)를 지정해줌.
                   >> Math.random()로 배열의 길이 범위 내의 랜덤 숫자를 생성해주고
                   >> Swap으로 자리 교환해줌.
     */
    for (int i=0; i<arr.length; i++) {
        // random 인덱스 번호 생성
        int r = (int)(Math.random() * arr.length);

        // Swap
        int temp = arr[r];
        arr[r] = arr[i];
        arr[i] = temp;
    }
    return arr;
}

실행 결과

static int[] arrayTwoOfArrayOne(int[][] arr) {
    // return 할 일차원 배열 선언
    int[] nArray = null;
    
    // 순환을 돌면서 파라미터 배열의 길이(전체 요소 수)를 구하고,
    int total_length = 0;
    for (int i=0; i<arr.length; i++) { // 행의 개수만큼 반복
        total_length += arr[i].length; // 각 행의 길이를 합산
    }
    
    // return 할 일차원 배열 크기 초기화
    nArray = new int[total_length];

    // 다시 순환을 돌면서 배열을 넣는다.
    int w = 0; // 인덱스 번호 추적을 위한 변수
    for (int i=0; i<arr.length; i++) { // 행의 개수만큼
        for (int j=0; j<arr[i].length; j++) { // 열의 개수만큼
            int temp = arr[i][j];
            nArray[w] = temp;
            w++;
        }
    }
    return nArray;
}

 

함수 호출부

 

 

실행결과

+ Recent posts