반응형

 

 

 김춘장이의 위키백과 - 나만의 공부 기록 Tistory ❤ 

 

 


 

 

실습 전 학습정리

# 상속 특징 
1개의 super class만 상속받을 수 있다 / 단일 상속 원칙
extends 키워드를 사용하여 상속한다
super class에서 private로 선언한 멤버변수나 메서드는 상속된 sub class에서 접근할 수 없다
super class에서 선언된 멤버변수나 메서드는 sub class에서 모두 상속받아 사용 가능하다
sub class에서 정의된 메서드는 super class에서 알지 못한다.
super class에서 사용을 희망할 경우 sub class의 메서드명을 선언해야 된다

- super class를 sub class로 확장하는 것 
- super , sub, extends
- 추상메서드, 추상 클래스
- 메서드 오버라이드 
- 단일 상속만 가능

# 인터페이스 특징

다중 상속이 가능하다
- Inf , implements 
- 기능을 정의하고 구현하는 것
- 인터페이스를 정의(기능정의 : 상수, 추상메서드, 디폴트메서드, 정적메서드)하고
- 기능을 구체적으로 설계하는 클래스다
- 구현을 받아서 인터페이스에서 정의한 메서드를 재정의 한다 : override

 


### 공부방법
- 특징을 이해한다
- 기능을 정리한다
- 설계를 생각해 본다


# 오늘의 공부목적
자바에서 지원하는 인터페이스나 메서드를 사용한다
객체는 추상화와 캡슐화에 이론으로 정의되는 것
캡슐화 : 독립적이고 은닉화 , 안에 내용을 모른다 , 매우 중요하다
getter setter oop의 기본이다
참조변수를 통해서 인자를 넘겨주고 매개변수로 받아서 리턴값으로 넘겨주는 것이다

 

 

 

 


 

 

 

 

Java의 GUI 수업 후 과제

 

 

 

 

수업에 배운 AWT 관련 포스팅은 시간여유가 될 때 ( 현재 프로젝트 준비 중 )으로 기회가 된다면 꼭 정리해서 올리겠습니다!

선생님께서 잠깐 오전시간에 GUI에 대해서 수업을 진행해 주셨다

(사실 집중 잘 못함)

그래도 셀프로 열심히 찾아보며 책 찾아보며 혼자 만들었는데 디자인이 깔끔하니 맘에 든다

 

 

 

 

 

 

 

 

 

하지만 나는 추가적인 작업을 하기 시작했다

지금 포스팅을 쓰는 이 시간까지 작업을 하다가

이제 포스팅을 올리는데 졸리지가 않았다 (며칠째 앉아서 코딩만 한 듯)

 

 

 

 

 

클래스 다이어그램 초기 시안

 

금요일 오후시간엔 GUI 구현에 하루를 뺏겼다

그리고 집에 와서 또 작업을 진행하였다

 

 

 

 

 


 

 

 

 

ClassDiagram

 

엑셀로 정리해야 되는데 시간이 너무 늦어서......... 인텔리제이의 기능을 활용했다 ㅠㅠ

 

 


 

 

소스코드

메인에서부터 시작해 보자

 

 

package main;
import controller.UserMenu;

public class Main {
    public static void main(String[] args) {
        new UserMenu();
    }
}
package resource;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class Access {

    private final static String url = "jdbc:oracle:thin:@localHost:1521:XE";
    private final static String username = "system";
    private final static String pass = "oracle";
    public static Connection connect;
    public static PreparedStatement psmt;
    public static ResultSet resultSet;
    public static String sql;

    // 커넥션 시도 리턴값 : 성공/실패
    public static boolean isConnect() {
        try {
            connect = DriverManager.getConnection(url, username, pass);
            System.out.println("Connections Success");
            return true;
        } catch (Exception e) {
            System.out.println("Connections Failed");
        }
        return false;
    }


    // 자원 반납 메서드정의
    public static void resourcesClose(){
        try {
            if ( psmt != null ) psmt.close();
            if ( connect != null ) connect.close();
            System.out.println("Resources return Success");
        }catch (Exception e){
            System.out.println("Resources return Failed");
        }
    }

}
package resource;

public class Driver {
    // todo : driver class
    // 싱글톤 구성
    private Driver(){
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            System.out.println("Driver Load Succese");
        } catch (Exception e){
            System.out.println("Driver Load Failed");
        }
    }
    private static Driver self = null;
    public static Driver getInstance(){
        if ( self == null ) self = new Driver();
        return self;
    }
}
package dto;

public class WordDTO {
    private String engWord;
    private String korWord;
    private static WordDTO self;

    public static WordDTO getInstance(){
        if (self == null) self = new WordDTO();
        return self;
    }
    public String getEngWord() {
        return engWord;
    }

    public void setEngWord(String engWord) {
        if (engWord != null && engWord.length() >= 1) {
            this.engWord = engWord;
        }
    }

    public String getKorWord() {
        return korWord;
    }

    public void setKorWord(String korWord) {
        if (korWord.length() >= 1 ) this.korWord = korWord;
    }
}
package dao;

import dto.WordDTO;

public interface daoInterface {
    public WordDTO daoTransper(WordDTO tmp);
}
package dao;

import resource.Access;
import dto.WordDTO;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;


public class FindDao extends Access implements daoInterface {
    // todo : 클릭한 글자를 가지고 Oracle DB에서 가져오기
    private FindDao() {}

    // 싱글톤
    private static FindDao self;
    public static synchronized FindDao getInstance() {
        if (self == null) self = new FindDao();
        return self;
    }

    public static List<String> getAllWordsDB(){
        List<String> words = new ArrayList<>();
        if (isConnect()) {
            try {
                sql = "SELECT * FROM Word";
                PreparedStatement pstmt = connect.prepareStatement(sql);
                ResultSet resultSet = pstmt.executeQuery();
                while (resultSet.next()) {
                    words.add(resultSet.getString("engWord"));
                }
            } catch (Exception e){
                e.printStackTrace();
            } finally {
                resourcesClose();
            }
        }
        return words;
    }
    @Override
    public WordDTO daoTransper(WordDTO tmp) {
        if (isConnect()) {
            try {
                sql = "SELECT * FROM Word WHERE engWord = ?";
                PreparedStatement pstmt = connect.prepareStatement(sql);
                pstmt.setString(1, tmp.getEngWord());
                ResultSet resultSet = pstmt.executeQuery();
                if (resultSet.isBeforeFirst()) {
                    resultSet.next();
                    WordDTO nowDto = WordDTO.getInstance();
                    nowDto.setEngWord(resultSet.getString("engWord"));
                    nowDto.setKorWord(resultSet.getString("korWord"));
                    return nowDto;
                }
            } catch (Exception e) {
                e.printStackTrace(); // Print the full stack trace for debugging
            } finally {
                resourcesClose();
            }
        }
        return null;
    }
}
package dao;

import dto.WordDTO;
import resource.Access;

public class SaveDao extends Access implements daoInterface {
    // todo : 버튼을 눌렀을때 입력한 문자를 Oracle DB에 저장하기
    private SaveDao(){}
    private static SaveDao self = null;
    public static SaveDao getInstance(){
        if (self == null) self = new SaveDao();
        return self;
    }

    @Override
    public WordDTO daoTransper(WordDTO tmp) {
        boolean trueConn = isConnect();
        if (trueConn){
            try{
                sql = "INSERT INTO Word VALUES(?,?)";
                psmt = connect.prepareStatement(sql);
                psmt.setString(1, tmp.getEngWord());
                psmt.setString(2, tmp.getKorWord());
                psmt.executeQuery();
                return tmp;
            } catch (Exception e){
            } finally {
                resourcesClose();
            }
        }
        return null;
    }
}
package controller;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import static dao.FindDao.getAllWordsDB;

public class UserMenu extends JFrame implements ActionListener, MouseListener {
    private final GuiFuntions fn = new GuiFuntions();
    private final Button commit = fn.commit();
    private final JLabel engTitle = fn.semiTitle(" 영문 입력 >> ");
    private final JLabel korTitle = fn.semiTitle(" 설명 입력 >> ");
    protected final JTextField engField = new JTextField(15);
    protected final JTextField korField = new JTextField(15);
    protected static final List engList = new List(15);
    protected final JTextArea korArea = fn.newTextArea();
    private static java.util.List<String> allWords;

    // 생성자
    public UserMenu() {
        super("Word Note __ by.yuuri");
        settingUI();
        setLayout();
        // 기존 DB에 있는 단어들을 List에 추가
        databaseAppendList();
        addListeners();
    }

    // Frame UI 설정
    private void settingUI() {
        setSize(800, 500);
        setLocationRelativeTo(null);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    // Frame Layout 설정
    private void setLayout() {
        JPanel mainPanel = new JPanel();
        JPanel northPanel = new JPanel();
        JPanel centerPanel = new JPanel();
        JPanel southPanel = new JPanel();

        mainPanel.setLayout(new BorderLayout());
        mainPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));

        mainPanel.add(northPanel, BorderLayout.NORTH);
        mainPanel.add(centerPanel, BorderLayout.CENTER);
        mainPanel.add(southPanel, BorderLayout.SOUTH);

        northPanel.setLayout(new GridLayout());
        northPanel.add(createTitlePanel(" 단어 입력 "), BorderLayout.WEST);
        northPanel.add(createTitlePanel(" 단어 전체 보기 "), BorderLayout.EAST);

        centerPanel.setLayout(new GridLayout());
        centerPanel.add(centerWestPanel());
        centerPanel.add(centerEastPanel());

        southPanel.add(createTitlePanel("개발자 : 김가율"));

        add(mainPanel, BorderLayout.CENTER);
        setVisible(true);
    }

    // Title Panel 생성
    private JPanel createTitlePanel(String titleText) {
        JPanel titlePanel = new JPanel();
        titlePanel.add(fn.titleFont(titleText));
        return titlePanel;
    }

    // Center East Panel 생성
    private JPanel centerEastPanel() {
        JPanel centerEastPanel = new JPanel();
        centerEastPanel.setLayout(new GridLayout(0, 2));
        centerEastPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
        JScrollPane scrollPane = new JScrollPane(korArea);
        centerEastPanel.add(engList);
        centerEastPanel.add(scrollPane);
        return centerEastPanel;
    }

    // Center West Panel 생성
    private JPanel centerWestPanel() {
        JPanel westCenterPanel = new JPanel();
        westCenterPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
        westCenterPanel.add(engTitle);
        westCenterPanel.add(engField);
        westCenterPanel.add(korTitle);
        westCenterPanel.add(korField);
        westCenterPanel.add(commit);
        return westCenterPanel;
    }

    // Listener 추가
    private void addListeners() {
        commit.addActionListener(this);
        engField.addActionListener(this);
        korField.addActionListener(this);
        engList.addActionListener(this);
        korArea.addMouseListener(this);
    }


    @Override
    public void mouseClicked(MouseEvent e) {
        // Handle mouse click if needed
    }

    @Override
    public void mousePressed(MouseEvent e) {
        // Handle mouse press if needed
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        // Handle mouse release if needed
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // Handle mouse enter if needed
    }

    @Override
    public void mouseExited(MouseEvent e) {
        // Handle mouse exit if needed
    }

    // Action Listener 처리
    @Override
    public void actionPerformed(ActionEvent e) {
        ActionHandle actionHandle = ActionHandle.getInstance();
        if (e.getSource() == commit) {
            actionHandle.saveButtonAction();
        } else if (e.getSource() == engList) {
            actionHandle.engListAction();
        }
    }

    // DB에 있는 단어들을 List에 추가
    private void databaseAppendList(){
        allWords = getAllWordsDB();
        for (String word : allWords) {
            engList.add(word);
        }
    }
}
package controller;

import javax.swing.*;
import java.awt.*;

public class GuiFuntions {
    public JTextArea newTextArea() {
        JTextArea addArea = new JTextArea();
        addArea.setLineWrap(true);
        addArea.append("     << 단어를 클릭하세요\n ");
        addArea.append("     단어 설명 출력됩니다\n");
        addArea.append("------------------\n");
        return addArea;
    }


    public JLabel titleFont(String text) {
        Font font = new Font("맑은 고딕", Font.BOLD, 20);
        JLabel jLabel = new JLabel(text);
        jLabel.setFont(font);
        return jLabel;
    }

    public JLabel semiTitle(String text) {
        Font font = new Font("맑은 고딕", Font.PLAIN, 13);
        JLabel jLabel = new JLabel(text);
        jLabel.setForeground(Color.BLUE);
        jLabel.setFont(font);
        return jLabel;
    }

    public Button commit() {
        Font commitFont = new Font("맑은 고딕", Font.PLAIN, 30);
        Button commit = new Button("COMMIT");
        commit.setFont(commitFont);
        return commit;
    }
}
package controller;

import dao.FindDao;
import dao.SaveDao;
import dto.WordDTO;
import resource.Driver;

public class AdminSection {

    private static Driver driver = Driver.getInstance();

    public AdminSection() {}

    protected static void saveTransfer(WordDTO nowDto) {
        if (driver != null) SaveDao.getInstance().daoTransper(nowDto);
    }

    protected static WordDTO findTransfer(WordDTO nowDto) {
        FindDao findDao = FindDao.getInstance();
        WordDTO tmpDto = null;
        if (driver != null) {
            tmpDto = findDao.daoTransper(nowDto);
        }
        return tmpDto;
    }
}
package controller;

import dto.WordDTO;

import javax.swing.*;

public class ActionHandle extends UserMenu{
    // Singleton
    private static ActionHandle self = null;
    private ActionHandle(){}
    public static ActionHandle getInstance(){
        if(self == null){
            self = new ActionHandle();
        }
        return self;
    }

    // commit 버튼 Action 처리
    protected void saveButtonAction() {
        String eng = engField.getText();
        String kor = korField.getText();
        if (isFieldEmpty(eng) || isFieldEmpty(kor)) {
            showErrorMessage("영어 단어와 설명을 모두 입력해주세요", "Input Error");
            return;
        }
        WordDTO actionWdto = WordDTO.getInstance();
        actionWdto.setEngWord(eng);
        actionWdto.setKorWord(kor);
        AdminSection.saveTransfer(actionWdto);
        engList.add(eng);
    }

    // engList Action 처리
    protected void engListAction() {
        WordDTO tmpDto = WordDTO.getInstance();
        String choiceEngWord = UserMenu.engList.getSelectedItem();
        if (choiceEngWord != null){
            tmpDto.setEngWord(choiceEngWord);
            WordDTO actionWdto = AdminSection.findTransfer(tmpDto);
            String tmp = actionWdto.getKorWord();
            appendTextToKorArea(tmpDto.getEngWord(),tmp);
        }
    }

    // korArea에 Text 추가
    private void appendTextToKorArea(String engWord, String korWord) {
        String indentedText = korArea.getText() + "\n" + engWord + ": " + korWord;
        super.korArea.setText(indentedText);
    }

    // Field가 비어있는지 확인
    private boolean isFieldEmpty(String fieldText) {
        return fieldText.isEmpty();
    }

    // Error Message 출력
    private void showErrorMessage(String message, String title) {
        JOptionPane.showMessageDialog(this, message, title, JOptionPane.ERROR_MESSAGE);
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
유리쯔의일상