유정잉

Java AWT [ eclipse JFrame UI 만들기 ] 본문

네이버 클라우드 부트캠프/정보

Java AWT [ eclipse JFrame UI 만들기 ]

유정♡ 2024. 3. 13. 18:08

Java (awt) - JFrame.pdf
1.65MB

 

 

 

JavaFX - Gluon (gluonhq.com)

 

JavaFX - Gluon

Roadmap Release GA Date Latest version Minimum JDK Long Term Support Extended or custom support Details 23 September 2024 early access 17 no 22 March 2024 22 (March 2024) 17 no upon request details 21 September 2023 21.0.2 (January 2024) 17 yes upon reques

gluonhq.com

 

[ JFrame 창 만들기 !! - UI 만들기 ]

   - 민트색 위에 타이틀이 Java 밑에 옅은회색 창이 컨텐트 팬

   - JFrame 창을 만드는 방법은 두가지가 있음 

   - ( 1 ) extends JFrame 상속 받아서 짜는 방법

   - ( 2 ) 상속받지 않고 짜는 방법 JFrame j = new JFrame(); 

             j.setLayout(new FlowLayout());  j.setLayout(new BorderLayout());

JFrame 창 만드는 작업 ( 2 ) : 상속받지 않고 짜는 방법
JFrame 창 만드는 작업 ( 1 ) : extends JFrame 상속 받아서 짜는 방법

 

 

[ JButton 만드는 작업 ]

버튼 추가 작업

 

one two 버튼 만들기

[ 객체 배열 버튼 JButton ]

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class Test1 {
	public static void main(String[] args) {

		Color c[] = { Color.RED, Color.orange, Color.yellow, Color.green, Color.blue }; // 객체 배열

		JFrame j = new JFrame();
		j.setLayout(new GridLayout(1, 5));

		JButton[] buttons = new JButton[5]; // 객체 배열

		for (int i = 0; i < buttons.length; i++) {
			buttons[i] = new JButton(String.valueOf(i));
			buttons[i].setBackground(c[i]);
			j.add(buttons[i]);
		}
		j.setVisible(true);

	}
}

 

 


[ MouseAdapter ]

   -  JButton 만들고 이벤트 처리까지 하는 작업 ( 이것보단 ActionListener가 더 주로 사용 됨 )

 

[ extends MouseAdapter - 버튼 만들기 ]

j1.addMouseListener(new Mouse()); : one 버튼 클릭 시 마우스클릭 출력되는 작업

// j1 one 버튼을 내가 마우스로 클릭했을 때에 대한 작업 처리하기 => 이벤트처리 동작을 추가해주는
// j1 one 버튼과 MouseListener 버튼 동작을 add 연결 / one버튼 눌렀을 때 Mouse 클래스 작동
j1.addMouseListener(new Mouse()); //MouseListener api참고 마우스조작에대한이벤트처리다있음

import java.awt.FlowLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JFrame;

class Mouse extends MouseAdapter {
     @Override
     public void mouseClicked(MouseEvent e) {
    	 System.out.println("마우스 클릭");
    	 
     }
}
public class Test1  {
	public static void main(String[] args) {
	
		// JFrame 상속 받지 않고 짜는 방법
		JFrame j = new JFrame();
		j.setLayout(new FlowLayout());

		JButton j1 = new JButton("one");
		JButton j2 = new JButton("two");
		
		j.add(j1);
		j.add(j2);
		
		// 실행
		j.setVisible(true);
		
		// j1 one 버튼을 내가 마우스로 클릭했을 때에 대한 작업 처리하기 => 이벤트처리 동작을 추가해주는
		// j1 one 버튼과 MouseListener 버튼 동작을 add 연결 / one버튼 눌렀을 때 Mouse 클래스 작동
		j1.addMouseListener(new Mouse()); //MouseListener api참고 마우스조작에대한이벤트처리다있음
		
	}
}

 

 

[ extends MouseAdapter implements MouseMotionListener - 마우스 클릭에 따른 배경색 바꾸기 ]

import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;

class Mouse extends MouseAdapter implements MouseMotionListener{
	@Override
	public void mouseDragged(MouseEvent e) {
		Container c = (Container)e.getSource();
		c.setBackground(Color.yellow);
	}
	@Override
	public void mouseReleased(MouseEvent e) {
		Container c = (Container)e.getSource();
		c.setBackground(Color.pink);
	}
}

public class Test1 extends JFrame {
	Test1() { // 기본생성자 생성
		Container c = getContentPane();
		c.setLayout(new FlowLayout()); // 순서대로 배치하는 배치관리자
		c.setBackground(Color.pink); // 배경색 지정
		
		setVisible(true); // 출력

		c.addMouseListener(new Mouse());
		c.addMouseMotionListener(new Mouse());
	}

	public static void main(String[] args) {

		new Test1(); // Test1 호출
	}
}

 

[ mouseEntered와 mouseExited 마우스를 올려놓으면 바뀌고 다시 내려놓으면 바뀌는 작업 ]

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;

class My extends MouseAdapter {
	@Override
	public void mouseEntered(MouseEvent e) {
		JLabel j = (JLabel)e.getSource();
		j.setText("재밌어");
	}
	@Override
	public void mouseExited(MouseEvent e) {
		JLabel j = (JLabel)e.getSource();
		j.setText("자바는");
	}
	
}

public class Test1 extends JFrame {
	Test1() { 
		Container c = getContentPane();
		c.setLayout(new FlowLayout()); // 순서대로 배치하는 배치관리자

		setVisible(true); // 출력

		JLabel j = new JLabel("자바는"); //글자, 이미지
		c.add(j);
		
		j.addMouseListener(new My());
	}

	public static void main(String[] args) {

		new Test1(); 
	}
}

 

 

 


 

[ ActionListener ]

      -  JButton 만들고 이벤트 처리까지 하는 작업 ( 주로 사용 됨 )

 

[ implements ActionListener 방법 - 버튼클릭하면 버튼이름이 바뀌는 작업 ]

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;

class My implements ActionListener { // 추상메서드여서 implements 함
	@Override
	public void actionPerformed(ActionEvent e) {
		JButton b = (JButton)e.getSource(); //강제형변환 = getSource함수의 반환형은 Object
		                                    //이벤트가 어디에서 발생했냐
		if(b.getText().equals("클릭")) { //getText() 이벤트가 발생한 버튼명 알아내는 코드
			b.setText("click"); //버튼명을 영어로 세팅함
		}
		else
			b.setText("클릭");
	}
}
public class Test1  extends JFrame {
	Test1() { // 기본생성자 생성
		Container c = getContentPane();
		
		c.setLayout(new FlowLayout()); // 순서대로 배치하는 배치관리자
		
		JButton j1 = new JButton("클릭");
		
		c.add(j1); // Container에 j1버튼 부착
		
		setVisible(true); // 출력
		
		j1.addActionListener(new My()); // j1과 ActionLister와 add 연결 하겠단 의미
		                                // My 클래스의 객체와 연결
		
	}
	public static void main(String[] args) {
	
		new Test1(); // Test1 호출
	}
}

 

 

[ addActionListener(new ActionListener() { } 방법 - 버튼클릭하면 원하는 문구가 출력되는 작업 ]

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;

public class Test1 extends JFrame {
	Test1() { // 기본생성자 생성
		Container c = getContentPane();

		c.setLayout(new FlowLayout()); // 순서대로 배치하는 배치관리자

		JButton j1 = new JButton("ok");
		JButton j2 = new JButton("canel");

		c.add(j1); // Container에 j1버튼 부착
		c.add(j2);

		setVisible(true); // 출력

		j1.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("ok");
			}
		});
		
		j2.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println(false); //버튼 비활성화
			}
		});
	}

	public static void main(String[] args) {

		new Test1(); // Test1 호출
	}
}

 

 


[ ItemListener ]

[ itemStateChanged ItemEvent.SELECTED 체크 박스 만들기 ]

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.JCheckBox;
import javax.swing.JFrame;


public class Test1 extends JFrame {
	Test1() {
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		setVisible(true);

		JCheckBox j = new JCheckBox("자바");
		c.add(j);

		j.addItemListener(new ItemListener() {
			@Override
			public void itemStateChanged(ItemEvent e) {
				if (e.getStateChange() == ItemEvent.SELECTED) {
					System.out.println("자바 재밌당");
				}
			}
		});
	}

	public static void main(String[] args) {
		new Test1();
	}
}

[ JCheckBox ] - 네모 버튼 중복 체크 가능

 객체 생성해서 배열에 저장해서 체크 박스 버튼 만들기 중복 체크 가능  

import java.awt.Container;
import java.awt.GridLayout;

import javax.swing.JCheckBox;
import javax.swing.JFrame;


public class Test1 extends JFrame {
	Test1() {
		Container c = getContentPane();
		setVisible(true);
	
		JCheckBox j[] = new JCheckBox[15]; //객체배열
		c.setLayout(new GridLayout(3,5));  //행열구조
		
		//객체를 생성해서 배열에 저장 !!!
		for(int i=0;i<j.length;i++) {
			j[i]=new JCheckBox("check"+(i+1));
			c.add(j[i]);
		}
		
	}


	public static void main(String[] args) {
		new Test1();
	}
}

 

[ JRadioButton ] - 동그라미 버튼 중복 선택 불가

체크 박스와 달리 중복 선택 불가능 

import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JRadioButton;

public class Test1 extends JFrame {
	JRadioButton j1 = new JRadioButton("짜장면");
	JRadioButton j2 = new JRadioButton("짬뽕");
	
	Test1() {
		Container c = getContentPane();
		setVisible(true);
		c.setLayout(new FlowLayout());
		
		ButtonGroup b1 = new ButtonGroup();
		b1.add(j1);
		b1.add(j2);
		
		c.add(j1);
		c.add(j2);
		
		A a = new A();
		j1.addItemListener(a);
		j2.addItemListener(a);
	}
    
	class A implements ItemListener {
		@Override
		public void itemStateChanged(ItemEvent e) {
			if(e.getStateChange()!=ItemEvent.SELECTED) {
				return; // 내가 라디오 버튼을 아무것도 선택을 안 하면
			}
			if(e.getItem()==j1) {
				System.out.println("짜장면");
			}
			else if(e.getItem()==j2) {
				getContentPane().setBackground(Color.pink);
				System.out.println("짬뽕");
			}
		}
	}
    
	public static void main(String[] args) {
		new Test1();
	}
}

 

 

[ 라디오 버튼과 체크 버튼 응용 ]

setEnabled, itemStateChanged, ItemEvent

"공부선택" 체크박스를 선택했을 때 라디오버튼 비활성화를 풀어줌 라디오버튼 활성화 됨으로서 java, pyton,c++중 선택 가능 "공부선택" 체크박스를 다시 선택을 풀면 라디오버튼 비활성화로 돌아감 -> 버튼 클릭 못 

import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JRadioButton;
import javax.swing.SwingConstants;
class Check implements ItemListener{
	
	JRadioButton b1,b2,b3;
	
	Check(JRadioButton b1, JRadioButton b2, JRadioButton b3){
		this.b1=b1; this.b2=b2; this.b3=b3;
	}

	@Override
	public void itemStateChanged(ItemEvent e) {
		if(e.getStateChange() == ItemEvent.SELECTED) {
			//체크박스 선택했을 때 
			//라디오버튼 활성화
			b1.setEnabled(true);
			b2.setEnabled(true);
			b3.setEnabled(true);
		}
		else {  //체크박스 선택 안했을 시
			b1.setEnabled(false);
			b2.setEnabled(false);
			b3.setEnabled(false);
		}
	}
}
public class Test1{
	public static void main(String[] args) {
		
		JFrame j=new JFrame();
		j.setLayout(new GridLayout(0,1));
		
		JCheckBox jc=new JCheckBox("공부선택");
		
		JRadioButton b1=new JRadioButton("java");
		JRadioButton b2=new JRadioButton("python");
		JRadioButton b3=new JRadioButton("c++");
		
		//라디오버튼이기때문 하나만 선택가능
		ButtonGroup g1=new ButtonGroup();
		g1.add(b1); 
		g1.add(b2); 
		g1.add(b3);
		
		j.add(jc);
		j.add(b1); 
		j.add(b2); 
		j.add(b3);
		//라디오버튼 비활성화
		b1.setEnabled(false);
		b2.setEnabled(false);
		b3.setEnabled(false);
		
		jc.addItemListener(new Check(b1,b2,b3));
		
		j.setVisible(true);
		
		b1.addItemListener(new ItemListener() {	
			public void itemStateChanged(ItemEvent e) {
				if(e.getStateChange() == ItemEvent.SELECTED) {
					System.out.println("자바!!!!");
				}
			}
		});
		
		b2.addItemListener(new ItemListener() {	
			public void itemStateChanged(ItemEvent e) {
				if(e.getStateChange() == ItemEvent.SELECTED) {
					System.out.println("파이썬!!!!");
				}
			}
		});
		
		b3.addItemListener(new ItemListener() {	
			public void itemStateChanged(ItemEvent e) {
				if(e.getStateChange() == ItemEvent.SELECTED) {
					System.out.println("c++!!!!");
				}
			}
		});
		
		
	}
}

[ ImageIcon 와 SwingConstants.CENTER 를 활용한 사진 넣기 이미지 넣기 ]

사진의 확장자가 .jpg 또는 .png 여야함 !!

사진 오른쪽 클릭 경로 복사 후 "" 붙여넣기 역슬래쉬 \ => 슬래쉬로 바꿔주기 /

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

public class Test1 extends JFrame {
	Test1() {
		Container c = getContentPane();
		setVisible(true);
		c.setLayout(new FlowLayout());
		
		JLabel j = new JLabel("안녕하세요");
		
		ImageIcon i = new ImageIcon("/C://Users//bitcamp//Desktop//다운로드.jpg/");
		JLabel j1 = new JLabel(i);
		
		JLabel j2 = new JLabel("월요일이네요",SwingConstants.CENTER);

	    c.add(j);
		c.add(j1);
		c.add(j2);
	}

	public static void main(String[] args) {
		new Test1();
	}
}

[ JTextField 입력하는 창 즉, 검색 창 만드는 작업  , JTextArea ]

JTextField(20); // 입력하는 창

JTextArea(10,20); // 10행 20열

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
public class Test1 extends JFrame{
	JTextField j = new JTextField(20);
	JTextArea j1 = new JTextArea(10,20);
	
	Test1(){
		Container c=getContentPane();
		setVisible(true);
		c.setLayout(new FlowLayout());
		
		JLabel jl=new JLabel("enter키 입력");
		c.add(j);
		c.add(jl);
		c.add(new JScrollPane(j1));
		
		j.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				JTextField jt=(JTextField)e.getSource();
				j1.append(jt.getText());  //텍스트필드에 입력한 문자를 text
				                          //area에 삽입
				jt.setText("");  //공백으로 초기화
				
			}
		});
		
	}
	public static void main(String[] args) {
		new Test1();
		
		
	}
}

[ 다이얼로그 showMessageDialog, showConfirmDialog, showInputDialog ]

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
public class Test3 extends JFrame{
	Test3(){
		Container c=getContentPane();
		setVisible(true);
		c.add(new Dia(),BorderLayout.NORTH);  
	}
	class Dia extends Panel{
		JButton j=new JButton("이름 입력");
		JTextField j1=new JTextField(10);
		JButton j2=new JButton("확인");
		JButton j3=new JButton("메세지");
		
		Dia(){
			setBackground(Color.pink);
			add(j);
			add(j1);
			add(j2);
			add(j3);
			
			j.addActionListener(new ActionListener() {	
				public void actionPerformed(ActionEvent e) {
					String name=JOptionPane.showInputDialog("이름 입력");
					if(name!=null) {
						j1.setText(name);
					}
				}
			});
			
			j2.addActionListener(new ActionListener() {	
				public void actionPerformed(ActionEvent e) {
					int r=JOptionPane.showConfirmDialog(null, "계속?",
							                           "확인", JOptionPane.YES_NO_OPTION);
					
					if(r==JOptionPane.CLOSED_OPTION) {
						j1.setText("선택안했다");
					}
					else if(r==JOptionPane.YES_OPTION) {
						j1.setText("네");
					}
					else {
						j1.setText("아니오");
					}
			}
		});
			
			j3.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					JOptionPane.showMessageDialog(null, "경고","메시지",
							                       JOptionPane.WARNING_MESSAGE);
				}
			});
			
			
			
		}
	}
	
	public static void main(String[] args) {
		new Test3();
	}
}

 

 


[ 쓰레드와 연결 Thread와 awt 연결 ]

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
class Th extends Thread{
	JLabel j;
	
	Th(JLabel j){
		this.j=j;
	}
	@Override
	public void run() {
		int n=0;
		while(true) {
			j.setText(Integer.toString(n));
			n++;
			try {
				sleep(1000);
			}catch(Exception e) {
				return;
			}
		}
	}
}
public class Test3 extends JFrame{
	Test3(){
		Container c=getContentPane();
		c.setLayout(new FlowLayout());
		JLabel j=new JLabel();
		c.add(j);
		
		Th t=new Th(j);  //쓰레드 객체 생성
		t.start();  //쓰레드 실행
		
		setVisible(true);
	}
	
	public static void main(String[] args) {
		
		new Test3();
		
	
	}
}

 


 

[ JFrame 창 두개 띄어서 연동 부착하는 법 ]

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class Test4 extends JFrame {		
	JButton j = new JButton("Cal");
	JLabel jl = new JLabel("계산 결과");
		
	Test4() {
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		c.add(j);
		c.add(jl);
			
		setVisible(true);
		
		//Cal 버튼을 눌렀을 때 이벤트 처리
		j.addActionListener(new ActionListener() {	
			@Override
			public void actionPerformed(ActionEvent e) {
				Aa a = new Aa(); // JDialog
				a.setVisible(true); 
			}
		});
	}
	class Aa extends JDialog{ // 새로운 창
		JTextField f1=new JTextField(15); //15컬럼 왼쪽 숫자 입력창
		JTextField f2=new JTextField(15); // 오른쪽 숫자 입력창
		
		JButton j2=new JButton("ADD");
		
		Aa() {
			setLayout(new FlowLayout());
			add(new JLabel("두 수를 더합니다"));
			add(f1);
			add(f2);
			add(j2);
			
			j2.addActionListener(new ActionListener() {	
				@Override
				public void actionPerformed(ActionEvent e) {
					setVisible(false); //다이어로그창 종료됨
					//텍스트필드에 들어가는 건 문자열이기 때문에 정수로 parseInt
					int sum=Integer.parseInt(f1.getText())+ 
							Integer.parseInt(f2.getText());
					jl.setText(Integer.toString(sum));
				}
			});
		}
	}
	
	
	public static void main(String[] args) {
		new Test4();
		
	}
}

 

 

 


[ ImageIcon JComboBox 이미지 아이콘 넣는 작업 ]

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

public class Test4 extends JFrame {

	String s[] = { "마이멜로디", "헬로키티" };

	ImageIcon[] im = { new ImageIcon("C:/Users/bitcamp/Desktop/마이멜로디.jpg"),
			new ImageIcon("C:/Users/bitcamp/Desktop/헬로키티.jpg") };

	JLabel j = new JLabel(im[0]);

	Test4() {
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		setVisible(true);

		JComboBox com = new JComboBox(s);
		c.add(j);
		c.add(com);
		// 여기까지는 마이멜로디 사진만 나오고 헬로키티 버튼을 선택해도 사진이 바뀌지 않음
		// 아래부터는 사진이 바뀌는 이벤트 처리 작업 !!!
		com.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				JComboBox c = (JComboBox) e.getSource();
				int i = c.getSelectedIndex();
				// 콤보박스의 선택된 아이템 인덱스 알아내기
				j.setIcon(im[i]);
			}
		});

	}

	public static void main(String[] args) {
		new Test4();

	}
}

 

 


 

[ Math.random 난수 발생시켜 사칙연산 하는 계산 JButton ]

 

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

public class Test4 {
	public static void main(String[] args) {

		JFrame j = new JFrame();
		j.setLayout(new FlowLayout());

		int n = (int) (Math.random() * 50) + 1; // 1~50까지 난수 발생
		JLabel num = new JLabel(String.valueOf(n)); // JFrame에 난수 입력
		j.add(num);

		j.setVisible(true); // 출력

		JButton plus = new JButton("+5");
		JButton minus = new JButton("-5");

		plus.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				plus.setEnabled(false);
				// 문자열 num을 정수로 바꿈
				int n = Integer.valueOf(num.getText());
				// 정수를 다시 문자열로 변경해서 띄움
				num.setText(Integer.toString(n + 5));
			}
		});
		j.add(plus);
		j.add(minus);
	}
}

 


[ JTable, getColumn, setPreferredWidth ]

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class jTable extends JFrame {
	private JTable jTable;

	jTable() {

		this.getContentPane().add(new JScrollPane(gt()), BorderLayout.CENTER);
		setVisible(true);
	}

	public JTable gt() {
		if (jTable == null) {
			String[] str = { "아이디", "이름" };
			Object[][] ob = { { "11", "aa" }, { "22", "bb" }, { "33", "cc" } };

			jTable = new JTable(ob, str);
			jTable.getColumn("아이디").setPreferredWidth(100);
			jTable.getColumn("이름").setPreferredWidth(50);
		}
		return jTable;
	}

	public static void main(String[] args) {
		new jTable();

	}
}

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90

'네이버 클라우드 부트캠프 > 정보' 카테고리의 다른 글

MySQL API 사이트  (0) 2024.03.14
프로젝트 모델링 작업 !!!  (0) 2024.03.14
[ MySQL 다운로드 ]  (0) 2024.03.12
eclipse [ export 하는 법 ]  (0) 2024.02.27
코딩테스트 문제 사이트  (0) 2024.02.20