❤ 김춘장이의 위키백과 - 나만의 공부 기록 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);
}
}
'👩🏻💻 𝐋𝐚𝐧𝐠𝐮𝐚𝐠𝐞 > ⠀⠀⠀⠀ Jᴀᴠᴀ' 카테고리의 다른 글
2023/11/27 ~ 2023/11/29🤘 JAVA GUI Swing (0) | 2023.12.04 |
---|---|
2023/11/20 👌 JAVA 프로젝트 - 시작과 분석, 그리고 설계 (0) | 2023.12.03 |
2023/11/16 🫶 인터페이스와 상속 (0) | 2023.11.20 |
2023/11/15 ⛳️ 추상클래스/메서드/상속 과제 - 마무리 (0) | 2023.11.15 |
2023/11/14 📌 추상클래스/메서드/상속 과제 (1) | 2023.11.15 |