'개발'에 해당되는 글 10건

  1. 2013.10.24 진주고용센터 실업자용 c/c++프로그래밍 훈련 by 성큰굿
  2. 2013.10.22 class 란...무엇인가... by 성큰굿
  3. 2013.10.22 걍 뻘짓. by 성큰굿
  4. 2013.10.18 [JSP]getContextPath()와 getRequestURI(), request.getRealPath("/")의 차이 by 성큰굿
  5. 2013.10.18 http 와 https 의 차이 by 성큰굿
  6. 2013.10.17 innerHTML 에 관해 by 성큰굿
  7. 2013.10.17 쓰레드를 이용한 채팅 프로그램 예제문 by 성큰굿
  8. 2013.10.17 다중 소켓 관리(접속자인원 멀티로) by 성큰굿 1
  9. 2013.10.17 elementAt(); 메소드 사용법 by 성큰굿
  10. 2013.10.16 이클립스정보 [불펌] by 성큰굿

 

c 수업 관련.xls

 

 

 

C++수업관련 정보는 hrd.net 에 있고, 시간표는 첨부파일로 붙여놓음.

 

'개발' 카테고리의 다른 글

이클립스정보 [불펌]  (0) 2013.10.16
Posted by 성큰굿
l

Class.class에 대한 나의 생각.

Class 클래스가 있습니다.
저 처음에 자바 공부 할 때 이 클래스는 도대체 뭔가???? 했었습니다.
String.class 라는 것이 코드 속에 나오는 것도 엄청 신기했습니다.
String.class는 파일로만 존재하는 것인 줄 알았었습니다.

Class 클래스는 무엇일까요.

Java의 OOP를 얘기 할 때 나오는 얘기 중 가장 많이 나오는 것이..
클래스를 만들어 틀을 만들어 놓고 , 이 틀을 사용해 인스턴스를 찍어낸다(?)라는 것입니다.

 

 

public class User {
		private String name;
		private int regstNum;
		
		public void setName(String name) {
			this.name = name;
		}
		
		public String getName() {
			return name;
		}

		public void setRegstNum(int regstNum) {
			this.regstNum = regstNum;
		}
		
		public int getRegstNum() {
			return regstNum;
		}
		
		@Override
		public boolean equals(Object o) {
			User u2 = (User)o;
			if(regstNum == u2.getRegstNum()) return true;
			else return false;
		}
	}




 

위 처럼 User 클래스를 만들어서 틀을 만들고

 

 

User jang = new User();
jang.setName("장");

User kim = new User();
kim.setName("김");

 



이렇게 인스턴스를 만들어냅니다. 이때 생성 된 User 클래스의 인스턴스들은
모두 이름,주민번호라는 필드와 getName, setName등의 메서드들을 가지고 있게 됩니다.
데이터와 행동을 가지고 있는 것이지요.
이처럼 User에서 만들어지는 객체들이 가져야 할 것들을 정의 하고 있는 것이 User 라는 클래스입니다.

그러면 한단계만 더 위로 올라가보면..
User라는 클래스는 필드와 메서드를 가지고 있습니다.
물론 클래스에는 더 많은 속성들이 존재하지만 일단 논외로 두고요..

일단 필드와 메서드만을 놓고 봤을 때
이렇게 만든 User라는 클래스 즉, User.class도 필드와 메서드를 가지고 있고
java의 기본 클래스인 String.class도 필드와 메서드를 가지고 있는 것이지요.

즉, Java에서 사용되는 Class들에 대한 정의를 하고 있는 틀이 Class.class 입니다.

Java Api 문서에는

 

Instances of the class Class represent classes and interfaces in a running Java application. Every array also belongs to a class that is reflected as a Class object that is shared by all arrays with the same element type and number of dimensions.

Class 클래스의 객체는 자바 프로그램에서 사용되는 클래스들과 인터페이스들을 나타낸다고 되어 있습니다.

Class.class가 가지고 있는 메서드를 조금 보면 이해가 더 되시리라 생각됩니다.

일단, static으로 되어 있는 forName 메서드가 있습니다.
jdbc 예제에서 많이 나오는 메서드로... Class.forName("java.lang.String"); 으로 실행하면
해당 이름을 갖는 클래스(String)의 정보를 담은 Class instance를 리턴해줍니다.

public class ClassTest { private Log logger = LogFactory.getLog(ClassTest.class); public static void main(String[] args) throws ClassNotFoundException { Class clazz = Class.forName("java.lang.String"); System.out.println("class name : " + clazz.getName()); Method[] methods = clazz.getDeclaredMethods(); for(Method method : methods) { System.out.println("method : " + method.getName() + "modifier : " + method.getModifiers() +

"return type : " + method.getReturnType()); } } }



java.lang.String 클래스의 정보를 가지고 있는 클래스 인스턴스를 얻어서
이름과 메서드에 대한 정보를 출력하는 예제입니다.
이러한 것이 가능한 이유는 자바에서 사용되는 모든 클래스들은 공통된 속성을 가지고 있고 (필드, 메서드등.)
그 속성을 정의하고 있는 것이 Class 클래스이기 때문입니다.

Class 클래스의 객체는 많은 메서드들을 가지고 있습니다. 모두 클래스에 대한 메서드들입니다.

어노테이션,생성자,필드등도 가져 올 수 있고
이것을 사용하여 리플렉트로 객체를 생성 할 수도 있고 상위 클래스들을 가져 올 수도 있습니다.
메서드를 실행 할 수도 있습니다.

new String(); 을 하지 않아도 위 처럼 그 String 클래스가 가진 메서들을 가지고 올 수도 있고
객체도 얻을 수 있고, 메서드를 실행 할 수도 있습니다.

우리가 만든 User 클래스의 객체들은 모두 이름과 주민번호를 갖는다. 라는 것과 비교해보면
좋을 것 같습니다.

결국 Class 클래스를 이용해서 우리가 다루는 모든 클래스에 대한 정보들을 얻어 올 수 있습니다.

 

'개발 > java' 카테고리의 다른 글

걍 뻘짓.  (0) 2013.10.22
쓰레드를 이용한 채팅 프로그램 예제문  (0) 2013.10.17
다중 소켓 관리(접속자인원 멀티로)  (1) 2013.10.17
elementAt(); 메소드 사용법  (0) 2013.10.17
Posted by 성큰굿
l

걍 뻘짓.

개발/java 2013. 10. 22. 20:46

class Ralf{
  String Clark;
  Ralf(String Clark){this.Clark=Clark;}}
  class Guise extends Ralf{Guise(){super("떢을내뿜케");}}
  class Mai extends Ralf{Mai(){super("몽고리안!");}}
  class kof{public static void main(String[] args)
  {  Ralf r=new Guise();
    System.out.println(r.Clark);
    Class aClark=r.getClass();
    System.out.println(aClark.getName());    
    System.out.println("==========================");    
    Ralf r1=new Mai();
    System.out.println(r1.Clark);
    Class bClark=r1.getClass();
    System.out.println(bClark.getName());}}

 

음?!

Posted by 성큰굿
l

[JSP]getContextPath()와 getRequestURI(), request.getRealPath("/")의 차이 JSP 2009/12/16 20:33


request.getContextPath(); 
request.getRequestURI(); 
request.getHeader("REFERER"); 
request.getRealPath("/")


request.getContextPath()는 프로젝트의 Context path명을 반환한다.

요청 : http://localhost:8080/example/test.jsp 

리턴값 : /example




request.getRequestURI()는 웹전체 경로(프로젝트명+ 파일 경로)까지 반환한다.

요청 : http://localhost:8080/example/test.jsp

리턴값 : /example/test.jsp 




request.getHeader("REFERER")는 요청을 한 부모요청의 URL주소를 반환한다.

현재 페이지:  http://localhost:8080/example/test1.do

요청 페이지 :  http://localhost:8080/example/test.do

리턴값 : http://localhost:8080/example/test.do




request.getRealPath("/")는 서버 또는 로컬의 웹애플리케애션 서버의 docBase 설정값을 반환한다.

요청 : http://localhost:8080/example/test.jsp

리턴값 : D:\Project\webapps\example\

 

 

---퍼옴, ->  http://finewoo.tistory.com/18 

'개발 > jsp' 카테고리의 다른 글

http 와 https 의 차이  (0) 2013.10.18
Posted by 성큰굿
l
 
 

 

 

웹 서핑없는 PC생활은 상상하기 어려운 시대,

알툴즈 웹 개발팀장이 들려주는

인터넷과 개인정보 보호 이야기

 한번 들어보시겠어요? 

 

함께 알아보는 https

 

 

안녕하세요? 알툴즈 웹개발팀장 덩지니입니다.

 

(Web)이라는 말

1994년 미국의 MIT 대학에서

W3C (World Wide Web Consortium: http://www.w3.org/ 월드와이드웹 컨소시움)

출범하면서 사용되었답니다.

 

인터넷(Internet)이라는 용어는

전세계를 망라하는 거대한 통신망의 집합체, 즉 하드웨어 구성을 말하며,

웹은 이러한 인터넷을 이용하는 하나의 방법이죠.

 

우리는 이러한 인터넷 덕분에 이전엔 상상도 못할만큼 엄청난 정보를 얻고 있답니다.

검색이라던지, 데이터의 보관, 친구들과의 놀이터로도 이용이 되죠 ^-^

 

예를 들어 여러분께서 인터넷 익스플로어 또는 파이어 폭스와 같은 브라우져에

www.altools.com 이라는 주소를 입력하면,

브라우져는 인터넷이라는 온세계를 망라하는 거대한 기계 집합체에

접근하게 된답니다.

 

인터넷을 거쳐 서버에 데이터를 요청하는데요.

서버는 www.altools.com에 대한 데이터를 실제로 제공해주는 기계에요.

 

그럼, 이 요청을 받은 서버에서 역시 인터넷을 통해 응답을 해 줍니다.

 

이렇게 여러분의 PC에 데이터가 오면 

브라우져 화면에 나오는 거죠.

 

내 PC 브라우저에서 요청 > 인터넷 > 서버 > 인터넷 > 내 PC 브라우저에 출력

 

이렇게 통신하자고 정한 약속을 http 프로토콜이라고 부르고 있습니다.

 

 

그런데...

 

실상 우리는 인터넷을 너무나 안일하게 사용하고 있어요.

 

 

한마디로 개인 정보가 무방비로 노출되는 무서운 세상인데 

전혀 인지를 못하고 있습니다.  

  

악의적인 의도를 가진 크랙커(쉽게 설명하면 나쁜 해커) 들이 마음만 먹으면

인터넷이라는 거대한 하드웨어의 집합체에 숨어서

지나가는 데이터의 요청을 몰래 훔쳐보거나 바꾸거나 복제할 수 있는 상황이예요.

 

, 일반적인 http 웹사이트에서 아이디와 비밀번호를 입력하는 것은

내 아이디와 비밀번호를 세상 모두에게 공개하는 것과 다를 것이 없다는 이야기죠 ^^;

 

특히 노트북에서 로그인 등을 하는 경우에는 인터넷이라는 숲에 숨지 않아도

옆에서 공중에 있는 데이터를 몰래 볼 수 있기 때문에 더욱 위험하답니다.

 

그래서 https 라는 것이 등장했어요.

 

https에서는 데이터를 전달할 때

공개키와 비밀키에 기반한 암호화를 거치므로

사용자의 데이터를 안전하게 숨겨준답니다.

인터넷에서 해커가 데이터를 몰래 훔쳐볼 수 없으니 

자신의 정보를 안전하게 지킬 수 있게 되는 것이죠.

 

일반적으로 아이디와 패스워드를 전달해주는 로그인 같은 경우

https로 보호해주는 사이트들은 많지만,

로그인과 같은 경우는 대부분 https로 데이터를 던지고

즉시 http로 돌아오기 때문에,

https로 가는지 어떻게 아는지 궁금하실 것 같아요 ^^

 

주소창에 https라고 뜨거나 로그인창 아래에 보안접속과 같은 메뉴가 있다면 

" 정보가 보호되고 있구나라고 생각하시면 돼요. ^^

 

그래서 이번에 알툴즈 웹사이트 개편하면서

개인정보에 관련한 모든 부분을 https로 바꾸었답니다 ^-^

 

  

 

알씨 온라인 사이트도 마찬가지구요.

 

 

 

 

이 무서운 세상, 본인의 소중한 정보는 아무도 지켜주지 않는답니다.

 

민주주의를 투쟁의 역사에서 쟁취한 것처럼

 

누가 보호해주겠거니 생각하지 마시고,

 

자신의 정보는 스스로 지켜주세요 ^_^

 

지키는 방법!

 

 

인터넷에 연결할 때 보안/백신 프로그램 꼭 실행하시고

 

검증 안된 사이트에 회원가입이나 로그인하지 마시구요.

 

윈도우 업데이트나 백신 프로그램 업데이트도 빼먹지 말고

 

꼬박 꼬박 해주시면 됩니다.

 

 

 

Posted by 성큰굿
l
innerHTML 은 특정 객체안에 HTML 코드를 추가하는 경우에 사용됩니다.

비슷한 유형의로는 innerText 가 있고 기타 jQuery 를 용한 html / text 등 있을 수 있습니다.


<!DOCTYPE html>
<html>
    <head>
        <title> sjisbmoc </title>
<script type='text/javascript' src='C:\Users\KSJ\JavaScript\jquery-1.9.0.min.js'></script>
<script type='text/javascript'>
//<![CDATA[

$(document).ready(function()
{
alert('document.body.innerHTML용하여 HTML 문서내에 HTML 형식의 123 라는 문구를 추가 합니다.\nHTML 을 지원하므로 문자아 함께 Tag 도 사용 가능 합니다.');
    document.body.innerHTML = '<font color="red">123</font>';

alert('document.body.innerText 를 용하여 문자 형식의 456 라는 문구를 추가 합니다.\nTAG 를 함께사용할 수 없으며 사용시 문자로 인식 됩니다.');
    document.body.innerText += ' 456';

alert('TextNode 로 문자열 객체를 만들어서 HTML 안에 추가 합니다.\nTAG 를 함께사용할 수 없으며 사용시 문자로 인식 됩니다.');
    var txt = document.createTextNode(' ABC');
    document.body.appendChild(txt);

alert('jQuery 를 용한 HTML 문서 내부에 HTML 코드를 추가해 줍니다.');
    $('body').html($('body').html()+' <font color="blue">DEF</font>');
});

//]]>
</script>
<style type='text/css'>
body { margin:0; }
</style>
    </head>
    <body topmargin='0' leftmargin='0'>
<form name='frm' method='post'>

</form>
    </body>
</html>
Posted by 성큰굿
l

클래스

ClientThread - 클라이언트 측 사용자 정의 스레드 클래스. 서버에서 전송한 문자열을 읽는 역할을 한다.

ServerThread - 서버 측 사용자 정의 스레드 클래스. 클라이언트에서 전송한 문자열을 다시 전송하는 역할을 한다.

SimpleClient - 클라이언트 클래스. ClientThread를 Start 시키고, 사용자로부터 문자열을 입력받아 서버로 전송하는 역할을 한다.

SimpleServer - 서버 클래스. ServerThread를 Start 시키고, 클라이언트의 접속을 기다리는 역할을 한다.

 

 

 

 


소스

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

public class ServerThread implements Runnable{
    private String clientID = null;
    private Socket socket = null;
    private BufferedReader br = null;
    private PrintWriter out = null;
    public ServerThread(Socket socket){
        this.socket = socket;
    }
    public void joinClient() {
        try{
            clientID = br.readLine();
            if(clientID==null||clientID.equals(" ")) {
                clientID = "손님_" + Math.random();
            }
        }catch(IOException ioe) {
        }finally{
            SimpleServer.addClient(this);

            String msg = SimpleServer.msgKey + clientID + "님이 입장하셨습니다.";
            SimpleServer.broadCasting(msg);
            System.out.println(msg);
        }
    }
    public void exitClient() {
        SimpleServer.removeClient(this);

        String msg = SimpleServer.msgKey + clientID + "님이 퇴장하셨습니다.";
        SimpleServer.broadCasting(msg);
        System.out.println(msg);
    }
    //클라이언트와 연결된 출력스트림을 통해 출력하는 메소드
    public void sendMessage(String message){
        out.println(message);
    }
    public void run(){        
        try{
            //1. 소켓을 통해 스트림 생성(Input, Output)
            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out = new PrintWriter(socket.getOutputStream(), true);

            joinClient();

            //2. 클라이언트가 보낸 글을 읽어 들인다.
            String str = br.readLine();
            String strResult = null;
            while(str!=null) {
                //3. 클라이언트가 보낸 글이 있는 동안 SimpleServer의 broadCasting()메소드를 통해 연결된 모든 클라이언트들에게 글을 전송한다.
                strResult = SimpleServer.broadCasting(clientID, str);
                System.out.println(strResult);
                str = br.readLine();
            }
        }catch (IOException e) {
//                e.printStackTrace();
        }finally{
            //4. io, socket 연결을 종료한다.
            if(br!=null) {
                try{br.close();}catch(IOException ioe){}
            }
            if(out!=null) {
                out.close();
            }
            if(socket!=null) {
                try{socket.close();}catch(IOException ioe){}
            }

            //5. SimpleServer의 removeClient() 를 통해 자기 자신을 대화대상에서 제거 한다.
            exitClient();

        }//end of finally
    }
}

--------------------------------------------------------------------------------import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class SimpleServer{
    public static final String msgKey = "알림) ";
    //연결된 클라이언트들의 정보를 저장하는 ArrayList - 대화대상목록(List)
    private static ArrayList<ServerThread> list = new ArrayList<ServerThread>();
    //private static HashMap<String, ServerThread> map = new HashMap<String, ServerThread>();
    //클라이언트를 대화대상목록에서 제거하는 메소드
    //ServerThread에서 클라이언트와 연결이 종료될 때 호출한다.
    public static void removeClient(ServerThread st){
        list.remove(st);
    }
    //연결한 클라이언트를 대화대상목록에 추가하는 메소드
    //클라이언트와 연결될때 호출된다.
    public static void addClient(ServerThread st){
        list.add(st);
    }
    //대화대상목록의 모든 클라이언트들에게 인수로 받은 글을 전송하는 메소드
    //클라이언트가 보낸 메세지(글)이 있을때 ServerThread로 부터 호출된다.
    public static void broadCasting(String message){
        ServerThread st = null;
        for(int i=0; i<list.size(); i++) {
            st = list.get(i);
            st.sendMessage(message);
        }
    }
    public static String broadCasting(String clientID, String message){
        String sendMSG = clientID + ": " + message;
        ServerThread st = null;
        for(int i=0; i<list.size(); i++) {
            st = list.get(i);
            st.sendMessage(sendMSG);
        }

        return sendMSG;
    }
    public static void main(String args[]) {
        ServerSocket ss=null;
        Socket socket = null;
        int i=0;
        try{
            System.out.println("<Lee Wan-Geun's Simple Chatting Server>");
            //1. server 소켓생성
            ss = new ServerSocket(5000);

            while(true) {
                //2. 클라이언트의 연결을 무한 반복하며 기다린다.
                System.out.println(msgKey + "클라이언트 연결을 대기 중입니다.");
                socket = ss.accept();

                //3. 클라이언트가 연결되면 ServerThread를 생성한 뒤 Thread로 실행시킨다.
                ServerThread st = new ServerThread(socket);
                Thread t = new Thread(st);
                t.start();

                //4. 연결된 클라이언트의 정보(ServerThread)를 대화대상목록(ArrayList)에 추가 시킨다.'
                // ServerThread에서 추가
            }
        }catch(IOException ioe){
            ioe.printStackTrace();
        }finally{
            if(socket!=null) {
                try{socket.close();}catch(IOException ioe){}
            }
        }
    }//end of method
}

 

 

--------------------------------------------------------------------------------

 

 


import java.net.Socket;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class ClientThread implements Runnable
{
    Socket socket = null;
    public ClientThread(Socket socket) {
        this.socket = socket;
    }
    public void run() {
        if(socket!=null) {
            BufferedReader br = null;
            try{
                br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                String str = br.readLine();
                while(str!=null) {
                    System.out.println(str);
                    str = br.readLine();
                }
                System.out.println(">>> Client Thread end");
            }catch(IOException ioe){
    //            ioe.printStackTrace();
            }finally{
                if(br!=null) {
                    try{br.close();}catch(IOException ioe){}
                }
                if(socket!=null){
                    try{socket.close();}catch(IOException ioe){}
                }
            }
        }
        else {
            System.out.println("Client Socket is null");
        }
    }
}

 

--------------------------------------------------------------------------------

 

 

import java.net.*;
import java.io.*;

public class SimpleClient {    public static String enterName(BufferedReader br, PrintWriter out) {
        String str = null;
        try{
            System.out.print("대화명 입력: ");
            str = br.readLine();
            out.println(str);
        }catch(IOException ioe) {
            ioe.printStackTrace();
        }
        return str;
    }    public static void main(String[] args) {
        Socket socket = null;
        BufferedReader keyboard = null;
        PrintWriter out = null;

        try{
            // 1. 서버와 연결 작업을 처리 - socket 생성
            socket = new Socket("127.0.0.1", 5000);

            // 2. 서버가 보낸 글을 읽는 ClientThread 객체 생성, 실행
            ClientThread ct = new ClientThread(socket);
            Thread t = new Thread(ct);
            t.start();

            // 3. 키보드로 부터 글을 읽고 서버에 전송.
            keyboard = new BufferedReader(new InputStreamReader(System.in));
            out = new PrintWriter(socket.getOutputStream(), true);
            enterName(keyboard, out);
            String str = keyboard.readLine();
            while(str!=null){
                out.println(str); // 서버 전송
                str = keyboard.readLine(); // 키보드에서 읽기
            }
        }catch(IOException ioe){
            ioe.printStackTrace();
        }finally{
            // 4. 스트림과 소켓의 연결을 끊는다.
            if(keyboard!=null) {
                try{keyboard.close();}catch(IOException ioe){}
            }
            if(out!=null) {
                out.close();
            }
            if(socket!=null) {
                try{socket.close();}catch(IOException ioe){}
            }
        }
    }
}

 

'개발 > java' 카테고리의 다른 글

class 란...무엇인가...  (0) 2013.10.22
걍 뻘짓.  (0) 2013.10.22
다중 소켓 관리(접속자인원 멀티로)  (1) 2013.10.17
elementAt(); 메소드 사용법  (0) 2013.10.17
Posted by 성큰굿
l

import java.net.*;
 import java.util.*;
 import java.io.*;

class open
 {
 ServerSocket ss = null;
 Socket soc = null;
 Vector vc = new Vector();
 public open()
 {
 try{
 ss = new ServerSocket(12345);
 }catch(IOException ee){}

while(true)
 {
 try{
 System.out.println("서버레디");
soc = ss.accept();
 System.out.println(soc.toString());
 ServerThread st = new ServerThread(soc);
 vc.add(st);
 st.start();

}catch(IOException ee){}
 }//while end
 }// method end// class end

class ServerThread extends Thread //내부클래스
{
Socket soc = null;
 Socket inwon = null;
 OutputStreamWriter osw = null;
 BufferedWriter bw = null;
 PrintWriter pw = null;

public ServerThread(Socket soc)
 {
 System.out.println("ServerThread 생성자 진입");
this.soc = soc;
 try{
 osw = new OutputStreamWriter(soc.getOutputStream());
 bw = new BufferedWriter(osw);
 pw = new PrintWriter(bw);
 }catch(IOException ee){}
 }

public void run()
 {
 System.out.println("ServerThread run 쓰레드 진입");
pw.println("접속을 환영한다.");
pw.flush();

//현재 접속자 정보 및 인원수

for(int i = 0; i<vc.size(); i++)
 {
 String strinfo = (String)vc.elementAt(i).toString();
 System.out.println(i + "번째 정보" + strinfo);

} //로컬에 출력

print();
 }

public void print()
 {
 for(int i = 0; i<vc.size(); i++)
 {
 ServerThread st1 = (ServerThread)vc.elementAt(i);

for(int j = 0; j<vc.size(); j++)
 {
 ServerThread socinfo = (ServerThread)vc.elementAt(i);
 String strinfo = socinfo.soc.toString();
 st1.pw.println("현재 접속자 실시간 업데이트" + strinfo);
 }
 st1.pw.flush();
 }
 }
 }

}//end class
 public class server1 {
 public static void main(String[] arg)
 {
 new open();
 }
 }
/*요약


설계 메인클래스, 이너클래스(쓰레드관리클래스)


메인클래스


1.서버소켓 생성

2. 소켓에 서버 어셉트를 던진다. soc = ss.accept();

3. 쓰레드가 포함된 클래스를 생성함과 동시에 soc 전달.

ServerThread st = new ServerThread(soc);

4. 쓰레드 클레스를 Vector에 쳐넣음으로써 Vector를 통한 Thread의 관리가 가능해진다. vc.add(st);

5. 쓰레드 클래스를 백터에 넣었으므로 쓰레드를 스타트시킨다.


이너클래스 - 클래스안의클래스


1. 이너클래스의 전역참조변수로는 소켓을 관리할soc필요.

그리고 나머지는 네트워크 출력을 하면 되겠다.

위의 코딩 참조.


2. ServerThread라는 생성자자를 만들며 매개변수로 Socket soc

를 받아서 this.soc = soc 해버린다.

이너클래스에 soc의 정보를 저장하는거라고 이해하면 된다.


//추가 : Serverthread의 이너클래스에서 soc의 변수 말고


다른 여러가지 정보들을 저장하여 나중에 차례차례 꺼내서 불러 올수 있도록 응용할수 있으니 필요시 응용하자.


예를들어 처음 들어온 사람의 ID가 icwert라면 ServerThread의 생성자 매개변수로 ID라는걸 얻어와 this.id = id 해서 이너클래스 속에 ID값을 저장해 둔 후. 나중에 여러가지로 활용할 수 있을듯 하다.

while - if - id문자열 비교를 통해 맞는 사람에게 특정 메시지를 전송할수 있도록 할수 있다.


머 나머지는 보면 알듯...위의 코드를 만약을 대비하여 카피해놓는다.
*/

 

 

역시나 불펌이다. 어디서 펏는지 기억이-_-;

'개발 > java' 카테고리의 다른 글

class 란...무엇인가...  (0) 2013.10.22
걍 뻘짓.  (0) 2013.10.22
쓰레드를 이용한 채팅 프로그램 예제문  (0) 2013.10.17
elementAt(); 메소드 사용법  (0) 2013.10.17
Posted by 성큰굿
l

import java.util.*

 

public class VectorDemo2 {
 public static void main(String[] args){
  Vector vec = new Vector(); //디폴트로 벡터 생성시 초기 저장 사이즈는 10으로 지정
  System.out.println("초기 벡터 사이즈 : " + vec.size());
  System.out.println("초기 벡터 수용능력 : " + vec.capacity());
  
  vec.addElement(new Integer(100);
  vec.addElement(new String("벡터테스트");
  vec.addElement(new Date();
  vec.addElement(new String("네 번째 데이터");
  System.out.println();
  
  for(int i = 0; i < vec.size(); i++){
   System.out.println(vec.elementAt(i)); //저장된 데이터의 인덱스를 이용하여 데이터를 얻음
  }
 }
}

------------ JAVA_Application ----------------
초기 벡터 사이즈 : 0
초기 벡터 수용능력 : 10


100
벡터테스트
Tue May 19 21:34:00 KST 2009
네 번째 데이터

 

 

 

--->http://blog.naver.com/truettl/150084764865        에서 불펌;

'개발 > java' 카테고리의 다른 글

class 란...무엇인가...  (0) 2013.10.22
걍 뻘짓.  (0) 2013.10.22
쓰레드를 이용한 채팅 프로그램 예제문  (0) 2013.10.17
다중 소켓 관리(접속자인원 멀티로)  (1) 2013.10.17
Posted by 성큰굿
l

이클립스정보 [불펌]

개발 2013. 10. 16. 21:48

이클립스 소개


이클립스(Eclipse)란?

  • Eclipse는 Open Source Java IDE (Integrated Development Environment), 즉 오픈 소스 자바 통합 개발환경이다.
  • JAVA 기반의 확장 가능한 개발 플랫폼이다.
  • 하나의 프레임워크로서 플러그인 컴포넌트에서 개발 환경을 구현하였다.
  • 오픈소스로 발표한 이클립스는 초기에는 개발 도구로 시작했으나 이제는 범용 플랫폼(universal platform)으로 성장했고 수많은 회사와 개발자들이 공동의 목표를 위해 함께 하는 커뮤니티라고 할 수 있다.

이클립스 탄생배경

  • IBM이 4000만불(400억)로 개발하여 오픈소스 프로젝트에 배포하였다.
  • Eclipse.org.Consortium이 개발을 관리 및 지휘하고 있다.
  • Project Management Committee (PMC)는 Eclipse 프로젝트를 관리한다.

이클립스 주요기능


1. 개발

  • 자동 완성 (Ctrl + Space)
  • 템플릿 적용 (Ctrl + Space)

리팩토링

  • 클래스 추출 (Extract Class)
    • Extract Class는 한 클래스가 너무 많은 책임을 수행할 때, 책임을 다른 클래스로 분리하는 리팩터링이다.

리팩터링 전의 Person 클래스로 간단하지만 개인 정보와 연락처 정보 관리라는 두 가지 책임을 가진다. Extract Class로 연락처 관리의 책임을 추출할 수 있다.

 public class Person {
   private String name;
   private String officeAreaCode;
   private String officeNumber;

   public String getName() {
    return name;
   }

   public void setName(String name) {
    this.name = name;
   }

   public String getOfficeAreaCode() {
    return officeAreaCode;
   }

   public void setOfficeAreaCode(String officeAreaCode) {
    this.officeAreaCode = officeAreaCode;
   }

   public String getTelephoneNumberNumber() {
    return "( " + officeAreaCode + ") "+ officeNumber;
   }

   public String getOfficeNumber() {
    return officeNumber;
   }

   public void setOfficeNumber(String officeNumber) {
    this.officeNumber = officeNumber;
   }
 }

먼저 Extract Class 메뉴를 선택한다. 최상단 메뉴나 <화면 1>과 같이 편집기 의 오른쪽 마우스 컨텍스트 메뉴에서 Refactor -> Extract Class를 선택한다.

 

Extract Class 메뉴를 선택하면 다음과 같이 설정 다이얼로그가 나온다.

  1. 설정 다이얼로그에서는 추출 대상 필드를 선택한다.
  2. 추출할 클래스 이름과 추출한 클래스의 객체를 참조할 필드 이름을 지정한다.
  3. 여기서는 연락처 정보와 관련된 officeAreaCode와 officeNumber 필드를 Telephone 클래스로 추출한다.
  4. Person 클래스가 참조하는 Telephone 클래스 인스턴스의 이름은 telephone으로 설정한다.

 

새로운 코드로 리팩터링되었다. 위에서 선택한 두 필드를 가지고 있는 Telephone 클래스가 생성되었고, Person 클래스는 Telephone 클래스의 인스턴스를 필드로 가지고 이를 참조하도록 다음과 같이 변경되었다.

 package refactoring;

 public class Person {
     private String name;
     private Telephone telephone = new Telephone();

     public String getName() {
         return name;
     }

     public void setName(String name) {
         this.name = name;
     }

     public String getOfficeAreaCode() {
         return telephone.getOfficeAreaCode();
     }

     public void setOfficeAreaCode(String officeAreaCode) {
         this.telephone.setOfficeAreaCode(officeAreaCode);
     }

     public String getTelephoneNumberNumber() {
         return "( " + telephone.getOfficeAreaCode() + ") "+ telephone.getOfficeNumber();
     }

     public String getOfficeNumber() {
         return telephone.getOfficeNumber();
     }

     public void setOfficeNumber(String officeNumber) {
         this.telephone.setOfficeNumber(officeNumber);
     }
 }
 package refactoring;

 public class Telephone {
     private String officeAreaCode;
     private String officeNumber;

     public Telephone() {
     }

     public String getOfficeAreaCode() {
         return officeAreaCode;
     }

     public void setOfficeAreaCode(String officeAreaCode) {
         this.officeAreaCode = officeAreaCode;
     }

     public String getOfficeNumber() {
         return officeNumber;
     }

     public void setOfficeNumber(String officeNumber) {
         this.officeNumber = officeNumber;
     }
 }
  • 상수 추출 (Extract Constant)
  • 메소드 추출 (Extract Method)
  • 메소드 시그니처 변경 (Change Method Signature)
  • 이름 바꾸기 (Rename)
  • 메소드 추상화 (Pull up method)

이클립스 3.4 가니메데에서 향상된 기능

  • Breadcrumb
    • 화면이 크지 않은 환경에서 개발할 때는 편집기 영역을 최대화(커맨드 + M)해서 작업하는 경우가 많은데, Breadcrumb를 통해 현재 위치를 한눈에 볼 수 있고, 편집기의 최대화를 해제하고 'Package Explorer (패키지 탐색기)'등을 이용해서 다른 파일을 열어야 하는 불편함을 해소한다.
    • 화 면 상단 툴바의 'Toggle Breadcrumb'를 선택하거나, 편집기의 컨텍스트 메뉴 중 'Show in Breadcrumb'를 선택하면 된다. 컨텍스트 메뉴에서 Breadcrumb를 비활성화 시킬 수 있는 방법은 없으며, Breadcrumb를 비활성화 시키려면 상단 툴바의 토글 버튼을 이용한다.
    • Breadcrumb가 활성화되면 편집기 상단에 현재 위치를 표시해주는 표시영역이 생긴다. 이 영역을 통해 최대화 상태의 편집기에서도 현재 위치를 한눈에 볼 수 있고, 최대화 상태에서도 편리하게 다른 파일을 열 수 있다.
  • 향상된 Call Hierarchy
    • 호출 관계가 복잡한 함수의 호출 관계를 트리 구조로 보여준다.
    • 클래스를 선택하고 'Call Hierarchy'를 찾아보면(CTRL + ALT + H) 모든 생성자를 호출하는 위치를 찾아준다.
    • 기본 생성자가 코드 상에 존재하지 않아도 찾아주니 편리하다.
    • 상수나 필드를 사용하는 위치도 'Call Hierarchy'를 통해 보여주니 더 이상 불편하게 검색하지 않아도 된다.
  • Outline 화면에서 코드 재배열하기
    • 개요(Outline) 화면에서 코드의 구성 요소의 위치를 재배열 할 수 있다.
    • 개요 화면 에서 한눈에 전체 구조를 보면서 드래그 앤 드롭 기능을 이용해서 코드를 재배열 할 수 있다.
    • Outline의 자동 정렬 기능 을 이용 중이라면 드래그 앤 드롭은 동작하지 않는다.
    • Outline에서의 재배치 기능은 자바 에디터뿐 아니라 XML 에디터에서도 지원한다.
  • 리치 호버
    • 특정 요소 위에 마우스를 가져다 두면 나타나는 JavaDoc 설명을 보여주는 것과 같은 호버 기능이 향상되었다.
    • JavaDoc 호버는JavaDoc 화면에서 보기, 외부 브라우저에서 보여주기 등 더 풍부한 기능을 제공한다.
    • 디버그 상황에서 복잡한 자료구조에 대한 값도 한 눈에 볼 수 있는 기능을 제공한다. 예전처럼 Variables 화면을 뒤지거나, Expressions 화면에 표현식을 입력해 봐야 하는 불편함이 해소되었다.
  • 저장 기본 동작 정의
    • 팀에서 코드 형식을 정해놓고, 이클립스 자동 포맷에 맞춰서 만들어 두어도 자신만의 스타일에 익숙하다면 종종 잊어버리곤 한다.
    • 개발과정 중에 사용하다 남은 불필요한 Import 잔재를 한번에 없애고 싶지만 자동으로 처리해 주지 않으면(Organized Import 기능이 자동으로 처리해 주지만, 직접 명령을 수행해야 한다.) 역시 잊어버리기 쉽다.
    • 'Windows (윈도) /Eclipse (맥) -> Preferences -> Java -> Editor -> Save Actions'를 보면 저장 시 자동으로 문서 포맷 맞추기, 불필요한 Import 구문 정리하기 등의 기능을 제공한다.
    • 저장 시 실행할 행동을 정의할 수 있으며, 문서 정렬은 전체 문서에 저장할 것인지 수정된 영역에만 적용할 것인지를 지정할 수 있다.
  • Launch Configuration 내보내기/들여오기
    • Import(가져 오기)/Export(내보내기) 메뉴에 추가된 기능으로 그 동안의 실행 설정(Launch Configuration)을 XML 파일로 저장하고, 저장된 XML 파일을 가지고 오는 기능이다.
    • 이 설정은 JDK 버전을 여러 버전으로 맞춰놓고 작업하는 것과 같은 이유 등으로 이클립스를 여러 개 설치해 놓고 작업 하거나 작업 공간을 다시 구축해야 하는 경우 매번 복잡한 실행 설정을 하지 않아도 되기에 유용하다.
      • 컴파일 레벨의 변경이 아니라 실제 JRE를 대체하면 전부 재빌드를 수행하므로 하나의 작업공간에서 모두 처리하기에는 번거롭다.
  • Tips: 이클립스 소스 코드 보고 베끼기 - 플러그인 스파이
    • 이클립스를 사용하다 보면 플러그인 개발 자가 아닐지라도 , 어떻게 구현됐는지 코드 를 보고 싶은 경우가 있다. 기존에는 플러그인 개발자에게도 특정 영역의 코드를 찾아가는 작업이 쉽지 않았다.
    • 플러그인 스파이 덕분에 코드를 보고 싶은 관심 대상 화면을 선택한 후 'SHIFT +ALT+F1'을클릭하면 해당 화면이 정의된 플러그인과 해당 화면의 클래스 등 각종 정보를 쉽게 얻을 수 있다.
    • 플러그인 스파이 기능을 활용하려면 PDE 관련 플러그인을 설치하거나 플러그인 개발자용 이클립스를 다운받아야 한다.
  • Tips: 자바스크립트 개발 툴킷
    • 웹 개발 환경에서 가장 눈에 띄는 기능은 WTP 3.0에 새로 추가된 자바스크립트 개발 툴킷(JavaScript Development Toolkit, JSDT)이다.
    • js 파일의 포맷팅 기능, 콜 계층 보기 지원 등의 기능이 눈에 띈다.
    • 추가적인 자바스크립트 라이브러리의 지원을 위한 확장점도 제공한다.
    • 자신만의 라이브러리를 지원하는 것도 용이하다.
    • WTP 3.0에 포함된 기능이므로 WTP 3.0을 별도로 설치하거나 Java EE 버전 이클립스를 다운받으면 된다.

2. 실행

  • 자바 어플리케이션 실행
  • junit 실행
  • 메이븐Maven) 실행
  • 런타임 환경 실행

3. 디버깅

  • 라이브러리 소스 첨부 (일반 방식, 메이븐 방식)
  • Breakpoint 설정
  • 단계별 디버깅 (F5, F6, F7, F8)
  • 조건부 디버깅 (Conditional Debugging)
  • 원격지 디버깅 (Remote Debugging)

4. 테스팅

  • 단위테스트
  • 통합테스트
  • 런타임테스트

5. 핫키 (단축키)

일상의 습관을 바꾸기 어렵듯이 개발습관  또한  한번 익숙해지면 바꾸기 어렵습니다. 단축키를 활용하는 개발습관은 무엇보다도 개발에 대한 전문성과 생산성에 기여한다고 할 수 있습니다.

  • 단축키 리스트 메뉴 (Show Key Assist): Ctrl + Shift + L
  • 빠른 Preferences 찾기 메뉴: Ctrl + 3
  • 편집 (Edit)
    • 빠른 교정: Ctrl + 1
    • 코드 자동완성 도움 (Content Assist): Ctrl + Space
  • 네비게이션 (Navigate)
    • 현재 클래스 상속관계 보기 (Open Type Hierarchy): F4
    • 간단한 클래스 상속관계 보기 (Quick Hierarchy): Ctrl + T
    • 현재 클래스 메서드, 맴버변수 보기 (Quick Outline): Ctrl + O
    • 리소스 찾기 (Open Resource): Ctrl + Shift + R
    • 찾기 다이얼로그 열기 (Open Search Dialog): Ctrl + H
    • 선언 위치로 이동 (Open Declaration): F3
    • 특정 줄번호로 가기 (Go to Line): Ctrl + L
    • Java Editor에서 다음 member로 이동 (Go to Next Member): Ctrl + Shift + Down
    • 이전 작업 화면 : Alt + Left
    • 다음 작업 화면 : Alt+ Right
  • 리팩토링 (Refactor)
    • 리펙토링 메뉴 바로가기 (Refactor Quick Menu): Alt + Shift + T
    • 변수명, 클래스명 등 이름 변경 (Rename): Alt + Shift + R
    • 클래스, 인터페이스 등 이동 (Move - Refactoring): Alt + Shift + V
  • 소스 (Source)
    • 선택 영역 주석처리 (Add Block Comment): Ctrl + Shift + /
    • 주석처리된 영역 주석해제 (Remove Block Comment): Ctrl + Shift + \
    • 한줄에 대한 주석 처리 (Toggle Comment): Ctrl +/
    • Javadoc타입의 주석처리 (Add Javadoc Comment): Alt + Shift + J
    • XML 편집 시 주석처리 및 해제: Ctrl + Shift +C
    • 탬플릿에 따른 코드 포맷팅 (Format): Ctrl + Shift + F
    • 들여쓰기 (Indent Line): Ctrl + I
    • 불필요 import 제거 및 import문 자동 생성 (Organize Imports): Ctrl + Shift + O
    • 빠른 소스메뉴 (Source Quick Menu): Alt + Shift + S
  • 텍스트 편집 (Test Editing)
    • 줄 삭제 (Delete Line): Ctrl + D
    • 줄 복사 (Duplicate Lines): Ctrl + Alt + Up or Down
    • 현재 줄에 새로 추가 (Insert Line Above Current Line): Ctrl + Shift + Enter
    • 다음 문자로 이동 (Next Word): Ctrl + Right
    • 이전 문자로 이동 (Previous Word): Ctrl + Left
    • 다음 줄에 새로 추가 (Insert Line Below Current Line): Shift + Enter
    • 줄 위치 위로 바꿈 (Move Lines Up): Alt + Up
    • 줄 위치 아래로 바꿈 (Move Lines Down): Alt +Down
    • 현재 위치에서 라인 끝까지 삭제 (Delete to End of Line): Ctrl + Shift + Delete
    • 한글자씩 찿기 (Incremental Find): Ctrl + J
      • 이 클립스 창의 하단 상태 표시줄 부분에 Incremental Find라고 표시되며, 한글자씩을 누를 때마다 그곳에 입력된 글자가 보이고 코드내의 일치하는 문자열로 이동하게 된다. 입력을 끝내고 다시 Ctrl + J를 누르면 그 문자열과 일치하는 곳으로 커서가 이동하게 된다.
    • System.out.println() 문장 삽입: 'sysout' + (Ctrl + Space)
    • Surround With 메뉴: Alt + Shift + Z
      • 코드를 블록으로 선택한 다음 이 단축키를 적용하면 다음과 같은 퀵 메뉴가 나타나며 선택한 문장으로 블록으로 선택했던 문장들을 감싼다.
    • 대문자로 (To Upper Case): Ctrl + Shift + X
    • 소문자료 (To Lower Case): Ctrl + Shift + Y
  • 윈도우 (Window)
    • 새로운 파일 및 프로젝트 생성: Ctrl + N
    • 선택된 뷰 최대화 (Maximize Active View or Editor): Ctrl + M
    • 열려있는 에디터간 이동 (Switch to Editor): Ctrl + Shift + E
    • 좌/우 창 이동: Ctrl + Page Up / Ctrl + Page Down
    • Properties 열기 (Properties): Alt + Enter
  • 실행 (Run)
    • 마지막 Run 구성 실행 (Run): Ctrl + F11
    • 빠른 Run 실행 메뉴 열기: Alt + Shift + X
    • 빠른 Debug 실행 메뉴 열기: Alt + Shift + D
  • 디버깅 (Debug)
    • 브레이크 포인터 설정/해제 (Toggle Breakpoint): Ctrl + Shift + B
    • 디버깅 시작 (Debug): F11
    • 디버깅 계속 (Resume): F8
    • 한줄씩 실행 (Step Over): F6
    • 한줄씩 실행하되 함수일 경우 그 함수 내부로 들어감 (Step Into): F5
    • 함수 외부로 벗어남 (Step Return): F7
    • 현재 라인까지 실행 (Run to Line): Ctrl + R

'개발' 카테고리의 다른 글

진주고용센터 실업자용 c/c++프로그래밍 훈련  (0) 2013.10.24
Posted by 성큰굿
l