Backend/JAVA

[JAVA] 특강 20일차 : 코딩 훈련! 문제 풀이 (상속&인터페이스&추상&다형성&파일)

JOKUN 2022. 7. 19. 17:32

 

 

Ani

📑문제

강아지/고양이 동물 정보 프로그램 (문제 문서 저장 못함 TT)

 

 

🔍풀이

ani.zip
0.00MB

 

AnimalManager

package com.kh.practice.ani.controller;

import com.kh.practice.ani.model.vo.Animal;
import com.kh.practice.ani.model.vo.Cat;
import com.kh.practice.ani.model.vo.Dog;

public class AnimalManager {
    public static void main(String[] args) {
        // Animal 타입의 객체배열 크기 5로 생성
        Animal[] aniArr = new Animal[5];
        // 각 인덱스에 무작위로 Dog객체 또는 Cat객체로 생성
        // (이때, 매개변수 생성자를 이용하여 생성)
        aniArr[0] = new Dog("망고", "리트리버", 45);
        aniArr[1] = new Cat("노랭이", "코숏", "길", "노란색");
        aniArr[2] = new Dog("쿤", "포메라니안", 4);
        aniArr[3] = new Cat("느림보", "스핑크스", "홈", "그레이");
        aniArr[4] = new Dog("살구", "보더콜리", 20);

        // 반복문을 통해서 해당 배열의 0번 인덱스부터 마지막 인덱스까지의
        // 객체의 speak() 메소드 호출
        for(Animal ani : aniArr){
            System.out.println(ani instanceof Dog ? ((Dog)ani).speak() : ((Cat)ani).speak());
        }

    }
}

 

 

Dog

package com.kh.practice.ani.model.vo;

public class Dog extends Animal{
    private int weight;

    public Dog() {
    }

    public Dog(String name, String kinds, int weight) {
        super(name, kinds);
        this.weight = weight;
    }

    public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }

    @Override
    public String speak(){
        return super.toString() + "몸무게는 " + weight + "kg입니다.";
    }
}

 

 

Cat

package com.kh.practice.ani.model.vo;

public class Cat extends Animal{
    private String location;
    private String color;

    public Cat() {
    }

    public Cat(String name, String kinds, String location, String color) {
        super(name, kinds);
        this.location = location;
        this.color = color;
    }

    public String getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    @Override
    public String speak() {
        return super.toString() + location + "에 서식하며, 색상은 " + color + "입니다.";
    }
}

 

 

Animal

package com.kh.practice.ani.model.vo;

public abstract class Animal {
    private String name;
    private String kinds;

    public Animal() {
    }

    public Animal(String name, String kinds) {
        this.name = name;
        this.kinds = kinds;
    }

    public String getName() {
        return name;
    }

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

    public String getKinds() {
        return kinds;
    }

    public void setKinds(String kinds) {
        this.kinds = kinds;
    }

    /**
     * "저의 이름은” + name + "이고, 종류는 " + kinds + "입니다."의 형식으로 문자열 만들어 리턴 처리
     * @return
     */
    @Override
    public String toString(){
        return "저의 이름은 " + name + "이고, 종류는 " + kinds + "입니다.";
    }

    public abstract String speak();
}

 

 

 

 

 

File

📑문제

노트 파일 만들고 열어서 수정하는 프로그램 만들기

 

🔍풀이

file.zip
0.00MB

 

Run

package com.kh.practice.file.run;

import com.kh.practice.file.view.FileMenu;

public class Run {
    public static void main(String[] args) {
        new FileMenu().mainMenu();
    }
}

 

 

 

FileMenu

package com.kh.practice.file.view;

import com.kh.practice.file.controller.FileController;

import java.util.Scanner;

public class FileMenu {
    private FileController fc;
    private Scanner sc;

    public FileMenu(){
        fc = new FileController();
        sc = new Scanner(System.in);
    }
    // 필드
    public void mainMenu(){
        while (true){
            System.out.println("***** My Note *****");
            System.out.println("1. 노트 새로 만들기");
            System.out.println("2. 노트 열기");
            System.out.println("3. 노트 열어서 수정하기");
            System.out.println("9. 끝내기");
            System.out.print("메뉴 번호 : ");
            int menuNUm = sc.nextInt();
            sc.nextLine();
            switch (menuNUm){
                case 1:
                    fileSave(null);
                    break;
                case 2:
                    fileOpen();
                    break;
                case 3:
                    fileEdit();
                    break;
                case 9:
                    System.out.println("프로그램을 종료합니다");
                    return;
                default:
                    System.out.println("잘못 입력하셨습니다. 다시 입력해주세요.");
                    return;
            }

        }
    }


    public void fileSave(String fileName){
        System.out.println("파일에 저장할 내용을 입력하세요.");
        System.out.println("ex끝it 이라고 입력하면 종료됩니다.");
        System.out.println("내용 : ");
        StringBuilder sb = new StringBuilder();
        while (true){
            String inputText = sc.nextLine();
            if(inputText.equals("ex끝it")){
                break;
            }
            sb.append(inputText + "\n");
        }

        if(fileName != null){
            fc.fileEdit(fileName, sb.toString());
            return;
        }

        while (true){
            System.out.print("저장할 파일 명을 입력해주세요(ex. myFile.txt) :");
            fileName = sc.nextLine();
            if(fc.checkName(fileName)){ //해당파일이 있음
                System.out.print("이미 존재하는 파일입니다. 덮어쓰시겠습니까?(y/n) : ");
                String yn = sc.nextLine();
                yn = yn.toLowerCase();
                if(yn.equals("y")){
                    fc.fileSave(fileName, sb.toString());
                    break;
                }
            } else { //해당파일 없음
                fc.fileSave(fileName, sb.toString());
                break;
            }

        }
    }


    public void fileOpen(){
        System.out.print("열 파일 명 : ");
        String fileName = sc.nextLine();
        if(fc.checkName(fileName)){
            System.out.print(fc.fileOpen(fileName));
        } else {
            System.out.println("없는 파일입니다.");
        }
    }


    public void fileEdit(){
        System.out.print("수정할 파일 명 : ");
        String fileName = sc.nextLine();
        if(fc.checkName(fileName)){
            fileSave(fileName);
        } else {
            System.out.println("없는 파일입니다.");
        }
    }
}



FileDAO

package com.kh.practice.file.model.dao;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Scanner;

public class FileDAO {
    private static String PATH = "C:\\Users\\user\\OneDrive\\바탕 화면\\KH정보교육원\\특강\\";


    public boolean checkName(String file){
    // File 객체를 생성하는 매개변수 있는 생성자에 file을 매개변수로 넘겨줌
    // 해당 파일이 있는지 없는지에 대한 boolean 값을 반환
        return new File(PATH + file).exists();
    }

    public void fileSave(String file, String data, boolean append){
    // 매개변수로 들어온 file을 파일 명으로 이용하여 파일을 만들어주고
    // String에 써서 저장
        try (FileWriter fw = new FileWriter(new File(PATH + file), append)){
            fw.write(data);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    /**
     *
     * @param file
     * @return 데이터를 읽지 못한 경우 null 반환, 아니면 String
     */
    public String fileOpen(String file){
    // 매개변수로 들어온 file로 파일을 찾아 StringBuilder에 값들 저장하여 반환
        try (Scanner sc = new Scanner(new File(PATH + file))){
            StringBuilder sb = new StringBuilder();
            while(sc.hasNextLine()){
                sb.append(sc.nextLine());
            }
            return sb.toString();
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    public void fileEdit(String file, String data){
    // 매개변수로 들어온 file을 파일 명으로 이용하여 파일을 찾고
    // String에 써서 저장하되 이어서 저장될 수 있도록 함
        fileSave(file, data, true);
    }
}

 

 

FileController

package com.kh.practice.file.controller;

import com.kh.practice.file.model.dao.FileDAO;

public class FileController {
    private FileDAO fd;

    public FileController() {
        fd = new FileDAO();
    }

    // 필드
    public boolean checkName(String file){
        // FileDAO(fd)의 checkName() 매개변수로 file을 넘겨주고
        // 그리고 그 반환 값을 그대로 받아 또 반환해줌
        return fd.checkName(file);
    }

    public void fileSave(String file, String data){
        // 매개변수로 넘어온 sb를 String으로 바꿔 fd의 fileSave()메소드 매개변수로
        // file과 String을 넘김
        fd.fileSave(file, data, false);
    }

    public String fileOpen(String file){
        // fd의 fileOpen() 매개변수로 file을 넘겨주고 그 반환 값을 그대로 받아 또 반환
        return fd.fileOpen(file);
    }

    public void fileEdit(String file, String data){
        // 매개변수로 넘어온 sb를 String으로 바꿔 fd의 fileEdit()메소드 매개변수로
        // file과 String을 넘김
        fd.fileEdit(file, data);
    }
}