### : 목차 구분 기호
--- : 목차 내에 항목 구분 기호

목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드
4. 과제

###################################
1. 이론 및 정보
-----------------------------------
UDP
DatagramPacket
DatagramSocket
 서버에게 요청을 하는 것 - request 
서버가 요청에 응답하는 것 - response

UDP 방식은 서버와 클라이언트가 코드가 매우 비슷함

TCP 방식은 소켓을 만드는 순간, 이미 연결 된다고 보면됨

UDP 방식은 소켓만 만듬, 대신 DATA 보낼때 DATA에
어디로 보낼지를 넣어서 보냄
그래서 별도의 클래스가 필요함
목적지에 대한 정보를 넣어 주는 게 필요
----------------------------------- 
Database - 데이터를 많이 모아 놓은것, 필요한 정보들을 =>DBMS
추가, 삭제, 수정, 검색 => 기본 연산자

oracle
mysql
mssql
db2
infomix


1.데이터 저장형태
     1) 계층형 DB : 초창기모델, Tree ,쉽게 만들 수 있다, 검색 속도 느림
     2) 네트워크형 DB : 트리구조에 링크를 전부 달아줌, 순환 Graph 형태, 이론적으로만 존재, 너무 복잡함, 유지보수 힘듬
     3) 관계형 DB : Table  모양으로 저장
     4) 객체지향형 DB
     5) 객체관계형 DB
2.Oracle version
Oracle 8i/9i -> 10g -> 11g -> 12c
3. 관리자, 개발자 -우리는 개발자
4. 설치 제대로 되었는지 확인 방법
cmd - services.msc
제어판 - 시스템 및 보안 - 관리도구 - 서비스 

반드시 실행 되어야 하는 서비스 
~Listener
~ServiceORCL 




~\app\jhta\oradata\orcl
안에 내용이 orcl의 핵심 내용임

5. DB제품 : 로컬DB -> Access, 네트워크DB->서버, 클라이언트
클라이언트 프로그램 - sql plus, sql developer, 
cmd에서 sqlplus 실행
system
1111
exit
quit

6. SQL(Structured Query Language)
     1) DDL(Data Definition Language) - 데이터를 저장 할 수 있는 준비를 해줌
                    CREATE 객체 - 생성
                    ALTER 객체 - 수정
                    DROP 객체 - 삭제
     2) DML(Data Manipulation Language) - 실제 데이터를 사용할 수 있게 해줌
                    INSERT
                    UPDATE
                    DELETE
     3) DCL(Data Control Language) - 관리자 영역
                    보안,백업,복원 기타관리
                    GRANT
                    REVOKE
     4) QL(Query Language) - 검색을 위한 언어
                    SELECT

7. 외부 접속을 위한 방법
          1) sqlplus - DOS
          2) sqlDeveloper - Window
          3) Eclipse
          4) Toad
          ...

8. splplus
          splplus
                    아이디:
                    패스워드:

          splplus   아이디
                    패스워드:

          splplus   아이디/패스워드

          splplus   아이디/패스워드@아이피/서비스 이름(DB명과 동일)
          
orcl이라는 데이터 베이스가 oracle 설치 할때 설치 됨
orcl안에는 여러가지가 있는데 실제 데이터를 담고 있는 Table이 있음
-----------------------------------
select tname from tab; // 현재 소유자가 소유한 테이블명 조회
show user; // 현재 접속자 확인
connect scott/1111 -> conn scott/1111 // 다른 계정 접속
conn hr/1111
conn system/1111

// 잠긴 계정 풀기
alter user scott account unlock;
alter user hr account unlock;

// 패스워드 변경
alter user scott identified by 1111;
alter user hr identified by 1111;

conn scott/1111
select tname from tab;

conn hr/1111
select tname from tab;

// 테이블의 구조 확인
conn scott/1111
desc 테이블명;

// 새로운 사용자 추가
conn system/1111;
create user 사용자 아이디 identified by 패스워드
create user test1 identified by 1111;

// 사용자 권한 부여
grant connect to test1;

conn test1/1111;
create table tblTest(id number, name varchar(10));
// 생성 안됨

// 자원 권한을 한번에 여러 권한을 줌
conn system/1111;
grant resource to test1;

conn test1/1111;
create table tblTest(id number, name varchar(10));
// 생성 됨, 위 자원 권한 때문에 됨
select tname from tab;

// 권한 한꺼번에 주기
grant connect, resource to 사용자 아이디;

// 사용자 지우기
drop user test1;
// 강제로 내용까지 삭제
drop user test1 cascade;

// 관리자 패스워드를 잊어버렸을 경우, DB 서버에 직접 접근 할 때만 가능
sqlplus system as sysdba;




- 데이터의 갯수는 레코드의 갯수
- 가장 작은 단위 -> 필드, 필드가 모여서 -> 레코드 , 레코드가 모여서 -> 테이블(file, 저장할 수 있는 단위) , 
테이블이 모여서 -> DB, DB가 여러개 모여서 -> Data Bank
- 데이터가 중복되서 저장되지 않도록 해야함 -> 모든 테이블은 기본키를 가지고 있음(primary key)

- tab -> oracle에서만 사용하는 소유자의 테이블
9. SQL의 시작
          1) SELECT
                    a) 데이터를 검색(조회)
                    b) 기본 문법
                              SELECT 필드명 FROM 테이블명
                              SELECT 필드명, 필드명.... FROM 테이블명
                              SELECT * FROM 테이블명

-----------------------------------
- 자바에서 NULL -> 주소가 없다, Oracle에서 NULL-> 값이 없다

conn scott/1111;
select tname from tab;
desc emp;
// Data Type은 182쪽 참조
select ename,sal from emp;

-----------------------------------
Oracle 도움말


http://docs.oracle.com/cd/E11882_01/index.htm


----------------------------------- 
###################################
2. 설정 및 그 밖에
-----------------------------------
아래 두 파일을 선택 후 우클릭 - 여기에 풀기
win32_11gR2_database_2of1.zip
win32_11gR2_database_2of2.zip

setup.exe 실행

다음



다음


다음


D:\app\jhta
F드라이브에서 다시 함
전역 데이터베이스 이름 : orcl
관리 비밀번호 : 1111

비밀번호 확인 : 1111





완료




비밀번호 관리



HR 체크 풀고 비번 입력

HR  비번 1111 

SCOTT 체크 풀고 비번 입력

SCOTT 비번 1111








----------------------------------- 
----------------------------------- 
###################################
3. 소스코드
-----------------------------------
3-1
/day19/src/network/UdpServer1.java
 
package network;
 
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.Random;
 
class Fortune{
     private static final String[] unse = {
          "주방에 가면 김샐 수",
          "기차보면 기찰 수",
          "학교가면 종칠 수",
          "강보면 물만날 수",
          "병원가면 피볼 수",
          "게임방가면 게임 끝날 수",
          "0자보면 공짜 얻을 수",
          "당구장가면 공칠 수",
          "대머리보면 빛볼 수 ",
          "도박하면 패가망실할 수"
     };
 
     public static String choice() {
          int num = new Random().nextInt(10);
          return unse[num];
     }    
}
public class UdpServer1 {
     private DatagramSocket socket;
     private final static int PORT = 9999;
     private DatagramPacket packet;
     public UdpServer1() {
          try{
               socket = new DatagramSocket(PORT);
               for(;;){
                    byte[] buf = new byte[512];
                    packet = new DatagramPacket(
                              buf,
                              buf.length
                              );
                    socket.receive(packet);
                    System.out.println(
                              "클라이언트 접속 : "
                              +packet.getAddress()
                              );
                    String reply = Fortune.choice();
                    buf = reply.getBytes();
                    packet = new DatagramPacket(
                              buf,
                              buf.length,
                              packet.getAddress(),
                              packet.getPort()
                              );
                    socket.send(packet);
               }
          }catch(Exception e){
               e.getStackTrace();
          }         
     }
     public static void main(String[] args) {
          // TODO UDP 방식의 서버 프로그램1
          new UdpServer1();         
     }
}
----------------------------------- 
3-2
/day19/src/network/UdpClient1.java
 
package network;
 
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
 
public class UdpClient1 {
     private DatagramSocket socket;
     private final static int PORT = 9999;
     private final static String SERVER = "127.0.0.1";
     private DatagramPacket packet;
     public UdpClient1() {
          try{
               socket = new DatagramSocket();
               byte[] buf = new byte[512]; //크기 임의 지정, 패킷크기
               /*
               * DatagramPacket() 생성자에서 인자 2개는 받을때
               * 인자 4개는 보낼 때
               */
               packet = new DatagramPacket(
                         buf,
                         buf.length,
                         InetAddress.getByName(SERVER),
                         PORT
                         );
               socket.send(packet);
               packet = new DatagramPacket(
                         buf,
                         buf.length
                         );
               socket.receive(packet);
               String str = new String(packet.getData());
               System.out.println("오늘의 운세 : "+str);
               socket.close();
          }catch(Exception e){
               e.getStackTrace();
          }
     }
 
     public static void main(String[] args) {
          // TODO UDP 방식의 클라이언트 프로그램1
          new UdpClient1();
     }
}

----------------------------------- 
3-3
----------------------------------- 
3-4
----------------------------------- 
3-5 
-----------------------------------  
###################################
4. 과제
-----------------------------------
4-1
----------------------------------- 
4-2
----------------------------------- 
4-3
----------------------------------- 
4-4
----------------------------------- 
4-5
###################################
5. 과제 해결
-----------------------------------
5-1
-----------------------------------
5-2
----------------------------------- 
5-3
-----------------------------------
5-4
###################################
6. 기타
----------------------------------- 
package tictactoe;

public class Tictactoe {
private final int AI_NUM = 2;
private final int USER_NUM = 1;
private final int INIT = 0;
private boolean isOddRow = true; // 홀수 - true, 짝수 - false
private int[][] tictactoe;
private int win_cnt = 0, lose_cnt = 0, draw_cnt = 0;
private boolean isEnd = false;

public Tictactoe(int row_col) {
tictactoe = new int[row_col][row_col];
if ((row_col % 2) == 0)
isOddRow = false;

for (int i = 0; i < tictactoe.length; i++) {
for (int j = 0; j < tictactoe[i].length; j++) {
tictactoe[i][j] = INIT;
}
}
}

public int[][] getTictactoe() {
return tictactoe;
}

// 성공적으로 tictactoe 배열에 값을 저장했으면 true를 리턴, 아니면 false
public boolean setTictactoe(int x, int y, int z) {
boolean ret = false;
if (z == AI_NUM || z == USER_NUM) {
if ((x >= 0 && x < tictactoe.length) && (y >= 0 && y < tictactoe.length)) {
tictactoe[x][y] = z;
ret = true;
}
}
return ret;
}
}
----------------------------------- 

package tictactoe;

import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class UI extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
JPanel west, east;
JButton reset, end_game;
JLabel lb_win, lb_lose, lb_draw;
JLabel lb_win_num, lb_lose_num, lb_draw_num;
Random random;
final int AI_NUM = 2;
final int USER_NUM = 1;
final int INIT = 0;
int win_cnt = 0, lose_cnt = 0, draw_cnt = 0;
boolean isUserFirst = true;// true면 user 먼저
boolean isEnd = false;
int row_col = 3;
JButton button[][];
int[][] tictactoe;
ImageIcon icon_user, icon_ai;
ButtonListener bl;

public UI(int num) {
setTitle("TicTacToe");
if (num > 0)
row_col = num;
button = new JButton[row_col][row_col];
tictactoe = new int[row_col][row_col];
west = new JPanel();
east = new JPanel();
random = new Random();
bl = new ButtonListener();
west.setLayout(new GridLayout(row_col, row_col));

for (int i = 0; i < button.length; i++) {
for (int j = 0; j < button[i].length; j++) {
button[i][j] = new JButton();
button[i][j].setForeground(Color.lightGray);
button[i][j].setBackground(Color.lightGray);
button[i][j].addActionListener(bl);
tictactoe[i][j] = INIT;
west.add(button[i][j]);
}
}

reset = new JButton("다시하기");
reset.setFont(new Font("", Font.BOLD, 30));
end_game = new JButton("종료");
end_game.setFont(new Font("", Font.BOLD, 30));
lb_win = new JLabel("Win(승)", JLabel.CENTER);
lb_lose = new JLabel("Lose(패)", JLabel.CENTER);
lb_draw = new JLabel("Draw(비김)", JLabel.CENTER);
lb_win_num = new JLabel();
lb_lose_num = new JLabel();
lb_draw_num = new JLabel();
lb_win_num.setHorizontalAlignment(JLabel.CENTER);
lb_lose_num.setHorizontalAlignment(JLabel.CENTER);
lb_draw_num.setHorizontalAlignment(JLabel.CENTER);

ButtonListener bl = new ButtonListener();
reset.addActionListener(bl);
end_game.addActionListener(bl);

east.setLayout(new GridLayout(4, 2, 2, 2));
east.add(reset);
east.add(end_game);
east.add(lb_win);
east.add(lb_win_num);
east.add(lb_lose);
east.add(lb_lose_num);
east.add(lb_draw);
east.add(lb_draw_num);

setLayout(new GridLayout(1, 2, 5, 5));
add(west);
add(east);
if(row_col <= 5){
setBounds(200, 100, 700, 400);
}else if(row_col == 6){
setBounds(200, 100, 800, 400);
}else if(row_col >= 7){
setBounds(200, 100, 1000, 500);
}
setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}

/*
* 방침
* row_col이 홀,짝 인지 판별, 홀 - 가운데에 관련된 시나리오 필요, 홀 - 최대 수가 다르고, 짝 - 같음
* 이 게임은 한 사람이 둘 수 있는 최대수가 홀수-(row_col * row_col + 1)/2 = 먼저 둘때,1개 빼면 수는 두번째 둘때
* 1.내꺼-내꺼중에 행, 열, 대, 각선 중에서 row_col-1 개 만큼 내것이 채워져 있고 남은 공간이 비어 있으면 내가 둠
* 2.상대-1이 없으면 상대편 행, 열, 대, 각선 중에서 row_col-1 개 만큼 상대편 것이 채워져 있고 남은 공간이 비어 있으면 내가 둬서 막음
* 3.상대-2가 없으면 상대편이 둔 곳 중에 다음 수를 두면 행,열,대,각선 중에 row_col-1이 되는 곳이 두군 데 이상인 곳을 찾아서 막는다
* 4.내꺼-3이 없으면 내가 둘 수 중에 다음에 두면 행,열,대,각선 중에 row_col-1이 되는 곳이 두군 데 이상인 곳을 찾아서 둔다
* 5.내꺼-4가 없으면 이길 수 있는 경우의 수가 많은 곳에 둔다
* 이길 수 있는 경우의 수
* 1. 내가 둘 수 있는 곳이 여러개의 경우의 수로 이길 수 있는 경우
* 2. 1번을 충족하면서 상대편 말이 없는 경우
* 3. 가운데에서 가까운데 먼저 둔다
* 4. 나머지 빈 곳에 둔다
*/
void ai_up() {
int user_cnt = 0;
int ai_cnt = 0;
int init_cnt = 0;

//1.
for (int i = 0; i < tictactoe.length; i++) {
for (int j = 0; j < tictactoe[i].length; j++) {
if (tictactoe[i][j] == AI_NUM) {
}
}
if (ai_cnt == row_col) {
}
ai_cnt = 0;
user_cnt = 0;
}
user_cnt = 0;
ai_cnt = 0;
for (int i = 0; i < tictactoe.length; i++) {
for (int j = 0; j < tictactoe[i].length; j++) {
if (tictactoe[j][i] == AI_NUM) {
ai_cnt++;
}
}
if (ai_cnt == row_col) {
}
ai_cnt = 0;
user_cnt = 0;
}
user_cnt = 0;
ai_cnt = 0;
}

void ai_random() {
for (;;) {
win_check();
if (isEnd)
break;
else {
int i = random.nextInt(row_col);
int k = random.nextInt(row_col);
if (tictactoe[i][k] == INIT) {
// button[i][k].setIcon(icon_ai);
button[i][k].setBackground(Color.blue);
tictactoe[i][k] = AI_NUM;
win_check();
break;
}
}
}
}

void win_check() {
if (!isEnd) {
int user_cnt = 0;
int ai_cnt = 0;
int init_cnt = 0;
//
for (int i = 0; i < tictactoe.length; i++) {
for (int j = 0; j < tictactoe[i].length; j++) {
if (tictactoe[i][j] == USER_NUM) {
user_cnt++;
} else if (tictactoe[i][j] == AI_NUM) {
ai_cnt++;
} else if (tictactoe[i][j] == INIT) {
init_cnt++;
}
}
if (user_cnt == row_col) {
end_game(USER_NUM);
return;
}
if (ai_cnt == row_col) {
end_game(AI_NUM);
return;
}
ai_cnt = 0;
user_cnt = 0;
}
user_cnt = 0;
ai_cnt = 0;
//
for (int i = 0; i < tictactoe.length; i++) {
for (int j = 0; j < tictactoe[i].length; j++) {
if (tictactoe[j][i] == USER_NUM) {
user_cnt++;
} else if (tictactoe[j][i] == AI_NUM) {
ai_cnt++;
}
}
if (user_cnt == row_col) {
end_game(USER_NUM);
return;
}
if (ai_cnt == row_col) {
end_game(AI_NUM);
return;
}
ai_cnt = 0;
user_cnt = 0;
}
user_cnt = 0;
ai_cnt = 0;
//
for (int i = 0; i < tictactoe.length; i++) {
int j = i;
if (tictactoe[j][i] == USER_NUM) {
user_cnt++;
} else if (tictactoe[j][i] == AI_NUM) {
ai_cnt++;
}
}
if (user_cnt == row_col) {
end_game(USER_NUM);
return;
}
if (ai_cnt == row_col) {
end_game(AI_NUM);
return;
}
user_cnt = 0;
ai_cnt = 0;
//
for (int i = 0; i < tictactoe.length; i++) {
int j = tictactoe.length - 1 - i;
if (tictactoe[j][i] == USER_NUM) {
user_cnt++;
} else if (tictactoe[j][i] == AI_NUM) {
ai_cnt++;
}
}
if (user_cnt == row_col) {
end_game(USER_NUM);
return;
}
if (ai_cnt == row_col) {
end_game(AI_NUM);
return;
}
// result
if (init_cnt == 0) {
isUserFirst = !isUserFirst;
isEnd = true;
draw_cnt++;
showMessage("비겼습니다.");
lb_draw_num.setText(String.valueOf(draw_cnt));
for (int i = 0; i < tictactoe.length; i++) {
for (int j = 0; j < tictactoe[i].length; j++) {
button[i][j].setEnabled(false);
}
}
}
}
}

void end_game(int num) {
if (!isEnd) {
if (num == USER_NUM) {
win_cnt++;
isUserFirst = false;
showMessage("이겼습니다.");
lb_win_num.setText(String.valueOf(win_cnt));
} else if (num == AI_NUM) {
lose_cnt++;
isUserFirst = true;
showMessage("졌습니다.");
lb_lose_num.setText(String.valueOf(lose_cnt));
}
for (int i = 0; i < tictactoe.length; i++) {
for (int j = 0; j < tictactoe[i].length; j++) {
button[i][j].setEnabled(false);
}
}
}
isEnd = true;
}

void showMessage(String mes) {
JOptionPane.showMessageDialog(this, mes);
}

private class ButtonListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
JButton button1 = (JButton) e.getSource();
// 배열과 Button에 값 및 색상변화, 특정 tictactoe 버튼을 눌렀을때
for (int i = 0; i < button.length; i++) {
for (int k = 0; k < button[i].length; k++) {
if (button1 == button[i][k]) {
if (tictactoe[i][k] == INIT) {
// button[i][k].setIcon(icon_user);
button1.setBackground(Color.red);
button1.setForeground(Color.black);
button1.setText("USER");
tictactoe[i][k] = USER_NUM;
ai_random();
}
}
}
}

// reset
if (button1 == reset) {
for (int i = 0; i < button.length; i++) {
for (int k = 0; k < button[i].length; k++) {
button[i][k].setEnabled(true);
button[i][k].setBackground(Color.lightGray);
button[i][k].setForeground(Color.lightGray);
button[i][k].setText("");
tictactoe[i][k] = INIT;
}
}
isEnd = false;
if (!isUserFirst) {
ai_random();
}
} else if (button1 == end_game) {
dispose();
}
}
}

public static void main(String[] args) {
if (args.length > 0) {
int num = Integer.parseInt(args[0]);
} else
new UI(3);
}
}


'OpenFrameWork' 카테고리의 다른 글

오픈프레임워크_Day22  (0) 2015.04.20
오픈프레임워크_Day21  (0) 2015.04.20
오픈프레임워크_Day19  (0) 2015.04.20
오픈프레임워크_Day18  (0) 2015.04.20
오픈프레임워크_Day17  (0) 2015.04.20
,