본문 바로가기
Code/GUI

[Java Code] 윤년 계산기 구현

by 스응 2023. 2. 18.
728x90
728x90

  - 4의 배수인 해는 윤년임

  - 4의 배수이면서 100의 배수인 해는 윤년이 아님

      → 4의 배수이면서 100의 배수가 아니어야 윤년임

  - 100의 배수이면서 400의 배수인 해는 윤년임

 

코드

#  윤년 계산 기능 파일

public class LeapYear {

    // 메서드
    public boolean isLeapYear(int year) {
        // 아래 if 문의 조건에 걸리지 않는다면 false로 유지됨
        boolean result = false;
        if (year % 4 == 0) {
            if (year % 100 != 0) { 
                result = true;
            // year % 4 == 0이고 year % 100 == 0인 값은 else로 빠짐
            } else {
                if (year % 400 == 0) {
                    result = true;
                }
            }
        } // end of if
        System.out.println(year + "년은 윤년인가? : " + result);
        return result;
    } 

    // 코드 테스트
    public static void main(String[] args) {
        LeapYear leapYear = new LeapYear();
        int x = 2000;
        leapYear.isLeapYear(x);
    } // end of main

} // end of class

#  GUI 구현 파일

public class LeapYearFrame extends JFrame implements ActionListener, KeyListener {

    private JPanel panel1;
    private JLabel label; // 항목이름
    private JTextField textField; // 입력
    private JButton button; // 실행 버튼 
    private JPanel panel2;
    private boolean isStart; // 이벤트 실행 여부
    private LeapYear leapYear; // 윤년 계산 클래스

    public LeapYearFrame() {
        initData();
        setInitLayout();
        addEventListener();
    }

    private void initData() {
        setTitle("윤년 계산기");
        setSize(300, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false); // 창 크기 조정 불가

        panel1 = new JPanel();
        panel1.setBackground(Color.cyan);
        panel2 = new JPanel();

        label= new JLabel("연도 입력 ");
        textField = new JTextField("", 8);
        button = new JButton("실행");
    }

    private void setInitLayout() {
        add(panel1, BorderLayout.NORTH);
        add(panel2, BorderLayout.CENTER);

        panel1.add(label);
        panel1.add(textField);
        panel1.add(button);

        setVisible(true);	
    }

    private void addEventListener() {
        // 버튼을 누르거나 엔터를 누르면 실행
        button.addActionListener(this);
        textField.addKeyListener(this);
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        // 폰트 설정
        Font f = new Font("맑은 고딕", Font.BOLD, 18);
        g.setFont(f);
        // 실행 이전
        if (isStart == false) {
            g.drawString("공백 없이 숫자를 입력해주세요.", 20, 180);
            return;  // if 문에 걸리면 밑 코드 실행 X
        }
        // 기능 클래스 인스턴스화
        LeapYear leapYear = new LeapYear();

        // 입력 값이 잘못되었을 때를 대비한 예외 처리
        try {
            // 입력한 연도를 가져와서 정수로 변환
            int targetYear = Integer.parseInt(textField.getText());
            // 메서드를 사용해서 결과 boolean 값을 받아옴
            boolean result = leapYear.isLeapYear(targetYear);

            if (result == true) {
                g.drawString(targetYear + "년은 윤년입니다.", 20, 180);
            } else {
                g.drawString(targetYear + "년은 윤년이 아닙니다.", 20, 180);			
            }
            // 텍스트 필드에 입력한 값을 초기화함
            textField.setText("");
            
        } catch (Exception e) {
            // 숫자가 아닌 문자를 입력해서 오류가 발생한 경우
            g.drawString("공백 없이 숫자를 입력해주세요.", 20, 180);
            // 텍스트 필드에 입력한 값을 초기화함
            textField.setText("");
        }
    } // end of paint

    @Override
    public void actionPerformed(ActionEvent e) {
        // 버튼을 누르면 실행되도록 하기
        isStart = true;
        repaint();
    }

    @Override
    public void keyPressed(KeyEvent e) {
        // 엔터를 눌렀을 때 실행되도록 하기 (엔터 키의 키 코드 = 10)
        if (e.getKeyCode() == 10) {
            isStart = true;
            repaint();
        }		
    }

    @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void keyReleased(KeyEvent e) {
    }
    
    // 코드 실행
    public static void main(String[] args) {
        new LeapYearFrame();
    } // end of main
    
} // end of class

 

실행

 

320x100
반응형

댓글