JavaSciprt
... 변수명
<script>
const names = ["유재석", "박명수", "정준하"];
const names2 = [...names, "노홍철"];
const mem1 = {num:1, name:"유재석"};
const mem2 = {...mem1, addr:"압구정"};
const mem3 = {
...mem1,
addr:"압구정",
isMan:true
};
const mem4 = {
...mem3,
name:"하하"
};
</script>
(3) ['유재석', '박명수', '정준하']
(4) ['유재석', '박명수', '정준하', '노홍철']
{num: 1, name: '유재석'}
{num: 1, name: '유재석', addr: '압구정'}
{num: 1, name: '유재석', addr: '압구정', isMan: true}
{num: 1, name: '하하', addr: '압구정', isMan: true}
배열과 Object의 구조를 분해해서 할당
⤷ 배열에 저장된 아이템을 변수 혹은 상수로 분해해서 할당
⭐ 할당 시 배열은 순서가 중요하며 Object는 순서가 중요하지 않고 key값이 중요하다
<script>
const [a,b,c] = [10,20, ()=>{}, 40];
const {num, name} = {num:1, name:"유재석", addr:"압구정", isMan:true};
</script>
a 10
b 20
c ()=>{}
num 1
name '유재석'
function useMem(arg){
// arg는 Obejct type 이 된다 (아래에서 useMem()을 호출하게 된다면)
// arg = {num:2, name:"박명수", addr:"이태원"}
const num = arg.num;
const name = arg.name;
}
function useMem2(num, name){
// num은 number type, name은 string type 이 된다
// (아래에서 useMem2() 을 호출하게 된다면)
}
useMem({num:2, name:"박명수", addr:"이태원"});
useMem2({num:3, name:"정준하", addr:"서래마을"});
JAVA
// 필요한 필드 정의하기
JTextField inputName, inputAddr;
public MemberFrame() {
// 레이아웃 설정
setLayout(new BorderLayout());
// JLable 2개
JLabel label1 = new JLabel("이름");
JLabel label2 = new JLabel("주소");
// JTextField 1개
inputName = new JTextField(10);
inputAddr = new JTextField(10);
// 패녈에 UI 배치
JPanel panel = new JPanel();
panel.add(label1);
panel.add(inputName);
panel.add(label2);
panel.add(inputAddr);
// 패널의 배경색 설정
panel.setBackground(Color.orange);
// 패널을 프레임의 위쪽에 배치
add(panel, BorderLayout.NORTH);
}
public static void main(String[] args) {
MemberFrame f = new MemberFrame();
f.setTitle("회원 정보");
f.setBounds(100,100,800,500);
f.setDefaultCloseOperation(EXIT_ON_CLOSE);
f.setVisible(true);
}
.showMessageDialog : 화면에 알림창
if(isSuccess) {
// this 는 나의 참조값 ( 나 => MemberFrame 객체 => Component type 이기도 하다)
JOptionPane.showMessageDialog(this, "추가 성공");
} else {
JOptionPane.showMessageDialog(this, "추가 실패");
}
⭐ this 는 나의 참조값
나 ➜ MemberFrame 객체 ➜ Component
// 표현식으로 정보를 출력할 UI
JTable table;
// JTable 에 출력할 data 를 공급해줄 모델 객체
DefaultTableModel model;
// 회원 목록을 출력할 테이블
table = new JTable();
// 테이블의 컬럼명을 배열로 미리 준비한다
String[] colNames = {"번호", "이름", "주소"};
// 테이블에 연결할 모델 객체
model = new DefaultTableModel();
// 보델에 컬러명을 전달한다
model.setColumnIdentifiers(colNames);
model.setRowCount(0); // 처음에는 row 가 없도록
// 모델을 테이블에 연결
table.setModel(model);
// 테이블의 글자 크기와 행의 높이 조절
table.getTableHeader().setFont(new Font("Sans-serif", Font.BOLD, 18));
table.setFont(new Font("Sans-serif", Font.PLAIN, 16)); // 데이터 글자 크기 14
table.setRowHeight(25); // 각 행의 높이를 조정
// row 가 많은 경우 스크롤리 가능하도록 테이블에 scroll 기능을 부여한다
JScrollPane scroll = new JScrollPane(table);
// 테이블을 품고 있는 JScrollPane 을 프레임의 가운데에 배치시키기
add(scroll, BorderLayout.CENTER);
public void printMember() {
// 기존에 출력된 내용을 모두 삭제하고
model.setRowCount(0);
// MeberDao 객체를 이용해서 회원 목록을 얻어온 다음 실제 회원 목록을 table 에 반복문 돌면서 출력
List<MemberDto> list = dao.selectAll();
// 반복문 돌면서
for (MemberDto tmp : list) {
// MemberDto 객체 하나당 하나의 Object[] 를 만들어서
Object[] row = {tmp.getNum(), tmp.getName(), tmp.getAddr()};
// 모델에 추가하기
model.addRow(row);
}
}
MemberDao 와 MemberDto 사용JButton insertBtn = new JButton("저장");
panel.add(insertBtn);
//버튼의 동작
insertBtn.addActionListener((e)->{
// 입력한 이름과 주소를 읽어와서
var name = inputName.getText();
var addr = inputAddr.getText();
// MemberDto 객체에 이름과 주소를 담는다
var dto = new MemberDto();
dto.setName(name);
dto.setAddr(addr);
// MemberDao 객체를 이용해서 DB에 저장
var dao = new MemberDao();
var isSuccess = dao.insert(dto);
if(isSuccess) {
// this 는 나의 참조값 ( 나 => MemberFrame 객체 => Component type 이기도 하다)
JOptionPane.showMessageDialog(this, "추가 성공");
} else {
JOptionPane.showMessageDialog(this, "추가 실패");
}
printMember();
});
JButton deleteBtn = new JButton("삭제");
panel.add(deleteBtn);
deleteBtn.addActionListener((e)->{
// 선택된 row 의 index 값을 읽어온다
int selectedRow = table.getSelectedRow();
// 만일 선택된 row 가 없다면
if(selectedRow == -1) {
JOptionPane.showMessageDialog(this,"삭제할 행을 선택해 주세요!");
return; // 메소드(함수)를 여기서 끝내기(리턴하기)
}
// 삭제할 회원의 Primary key 값(번호) 를 읽어와서
int num = (int)model.getValueAt(selectedRow, 0);
// DB 에서 삭제한다
dao.deleteByNum(num);
printMember();
});
var updateBtn = new JButton("수정");
panel.add(updateBtn);
updateBtn.addActionListener((e)->{
// 선택된 row 의 index 값을 읽어온다
int selectedRow = table.getSelectedRow();
// 만일 선택된 row 가 없다면
if(selectedRow == -1) {
JOptionPane.showMessageDialog(this,"수정할 행을 선택해 주세요!");
return; // 메소드(함수)를 여기서 끝내기(리턴하기)
}
// 선택한 row 에서 수정할 회원의 번호를 얻어낸다
int num = (int)model.getValueAt(selectedRow, 0);
// 수정할 회원의 전체 정보를 DB 에서 읽어온다
MemberDto dto = dao.getByNum(num);
// 수정양식 UI 를 JPanel 로 구성한다
var inputName = new JTextField(10);
var inputAddr = new JTextField(10);
JPanel editPanel = new JPanel();
editPanel.add(new JLabel("이름:"));
editPanel.add(inputName);
editPanel.add(new JLabel("주소:"));
editPanel.add(inputAddr);
// MemberDto 에 있는 정보를 JTextField 에 출력
inputName.setText(dto.getName());
inputAddr.setText(dto.getAddr());
// JPanel 을 전달하면서 ConfirmDialog 를 띄운다
int result = JOptionPane.showConfirmDialog(
this,
editPanel,
num+" 번 회원 수정",
// 확인 과 취소 버튼만
JOptionPane.OK_CANCEL_OPTION
);
// 리턴되는 숫자값을 테스트로 콘솔창에 출력
System.out.println(result);
// 만일 확인 버튼을 누르면...
if(result == JOptionPane.OK_OPTION) {
// 입력한 이름과 주소를 읽어와서
String name = inputName.getText();
String addr = inputAddr.getText();
// 수정을 반영
MemberDto newDto = new MemberDto();
newDto.setNum(num);
newDto.setName(name);
newDto.setAddr(addr);
boolean isSuccess = dao.update(newDto);
if(isSuccess) {
JOptionPane.showMessageDialog(this, "수정 성공!");
}else {
JOptionPane.showMessageDialog(this, "수정 실패!");
}
}
printMember();
});