2012의 게시물 표시

소켓 프로그래밍

아래의 소켓 서버/클라이언트 소스코드는 각각 콘솔에서 실행되며, 클라이언트로부터 한 줄을 입력 받아 서버에서 해당 내용을 출력하고, 다시 그 내용을 클라이언트에 보내면, 클라이언트가 받은 메시지를 출력한다. 테스트를 위해 로컬 호스트 주소를 사용하고 있으며, 포트번호는 11111을 사용했다. 다중 클라이언트에 응답하는 서버를 만드려면 스레드로 처리해야 한다. 소켓 클라이언트 소켓을 연다. 소켓에 대해 입출력 스트림을 연다. 서버의 프로토콜에 맞게 입출력 스트림에서 읽거나 쓴다. 스트림을 닫는다. 소켓을 닫는다. 1 public static void main ( String [] args ) throws IOException { 2 // 소켓을 연다. 3 Socket socket = new Socket ( InetAddress . getLocalHost (), 11111 ); 4 5 // 입출력스트림을 연다. 6 PrintWriter out = new PrintWriter ( socket . getOutputStream (), true ); 7 BufferedReader in = new BufferedReader ( new InputStreamReader ( socket . getInputStream ())); 8 9 // 콘솔에서 입력받는다. 10 BufferedReader stdIn = new BufferedReader ( new InputStreamReader ( System . in )); 11 String userInput ; 12 13 while (( userInput = stdIn . readLine ()) != null ) { 14 // 입력받은 내용을 소켓에 쓴다. 15 out . println ( userInput ); 16

java.net.URLConnection

URL url = new URL ( "" ); URLConnection conn = url . openConnection (); conn . setDoInput ( true ); //GET //conn.setDoOutput(true) //POST InputStreamReader isr = new InputStreamReader ( conn . getInputStream ());

java.net.Socket

이 요약은 사용할 수 없습니다. 이 글을 보려면 여기를 클릭하세요.

java.net.ServerSocket

Server 1 ServerSocket serverSocket = new ServerSocket ( 1234 ); 2 while ( true ) { 3 Socket socket = serverSocket . accept (); 4 InputStreamReader isr = new InputStreamReader ( socket . getInputStream ()); 5 BufferedReader br = new BufferedReader ( isr , 512 ); 6 String data = br . readLine (); 7 br . close (); 8 } Client 1 InetAddress addr = InetAddress . getByName ( "..." ); 2 Socket socket = new Socket ( addr , 1234 ); 3 OutputStreamWriter osw = new OutputStreamWriter ( socket . getOutputStream ()); 4 BufferedWriter bw = new BufferedWriter ( osw , 512 ); 5 PrintWriter pw = new PrintWriter ( bw ); 6 pw . println ( "Hello" ); 7 pw . flush (); 8 pw . close ();

java.net.InetAddress

static InetAddress getLocalHost() static InetAddress getByName(String host) static InetAddress[] getAllByName(String host)

HTTP POST

Java를 사용한 POST 방식 데이터 전송 및 응답 처리하기 1 public static void main ( String [] args ) { 2 try { 3 //연결 4 URL url = new URL ( "http://www.example.com/post.php" ); 5 HttpURLConnection conn = ( HttpURLConnection ) url . openConnection (); 6 conn . setDoOutput ( true ); 7 conn . setRequestMethod ( "POST" ); 8 conn . setRequestProperty ( "Accept-Language" , "ko-kr,ko;q=0.8,en-us;q=0.5,en;q=0.3" ); 9 10 //데이터 11 String param = URLEncoder . encode ( "name" , "UTF-8" ) + "=" + URLEncoder . encode ( "??" , "UTF-8" ); 12 param += "&" + URLEncoder . encode ( "age" , "UTF-8" ) + "=" + URLEncoder . encode ( "??" , "UTF-8" ); 13 14 //전송 15 OutputStreamWriter osw = new OutputStreamWriter ( conn . getOutputStream ()); 16 osw . write ( param ); 17 osw . flush (); 18 19 /

java.util.Date

생성자 Date() 현재 시간 Date(long date) 메서드 boolean after(Date when) boolean before(Date when) long getTime() void setTime(long time)

java.text.SimpleDateFormat

1 Date date = new Date (); 2 SimpleDateFormat f = new SimpleDateFormat ( "yyyy-MM-dd HH:mm:ss); 3 String str = f.format(date);

문자열의 길이 계산

paint()메서드 안에서 문자열을 그릴 때, 해당 문자열의 크기를 얻어오는 방법. 1 Graphics2D g = ( Graphics2D ) graphics ; 2 3 g . drawString ( str , x , y ); 4 5 int width = g . getFontMetrics (). stringWidth ( str ); 6 int height = g . getFontMetrics (). getHeight (); 7 8 g . dispose ();

Swing Launcher

main() 함수에서 다음과 같은 방식으로 JFrame등을 실행시킬 수 있다. 1 SwingUtilities . invokeLater ( new Runnable (){ 2 public void run () { 3 JFrame win = new JFrame (); 4 win . pack (); 5 win . setVisible ( true ); 6 } 7 });

OSX에서의 Swing

자바로 구현된 스윙 어플리케이션을 맥 OSX에서 구동하는 경우, 시스템 룩앤필을 적용하는 것만으로는 뭔가 아쉽다는 것을 깨달았다. 윈도우즈나 리눅스와 달리 OSX에서는 메뉴바가 화면 위에 있다거나 해서 좀 더 손 봐줘야 할 곳이 있다. 아래 링크된 사이트의 몇 가지 항목을 번역해 두기로 한다. http://www.devdaily.com/apple/mac/java-mac-native-look/ https://developer.apple.com/library/mac/#documentation/Java/Conceptual/Java14Development/04-JavaUIToolkits/JavaUIToolkits.html#//apple_ref/doc/uid/TP40001901-SW1 시스템이 OSX인지를 판별 String lcOSName = System . getProperty ( "os.name" ). toLowerCase (); boolean IS_MAC = lcOSName . startsWith ( "mac os x" ); 시스템 룩앤필을 적용 UIManager . setLookAndFeel ( UIManager . getSystemLookAndFeelClassName ()); 메뉴바를 화면 맨 위로 이동 System . setProperty ( "apple.laf.useScreenMenuBar" , "true" ); 메뉴바에 패키지명 대신 어플리케이션 이름을 지정 System . setProperty ( "com.apple.mrj.application.apple.menu.about.name" , "어플리케이션명" ); 독 바 아이콘을 지정하려한다거나 보다 자세한 내용이 필요한 경우에는 원문을 참조하기 바란다.

Jar 패키지 안의 파일을 이용하기

이미지 파일 혹은 텍스트 파일을 Jar 패키지 안에 포함시켜 놓고 소스 코드에서 해당 파일에 접근해서 읽는 방법이다.  해당 경로에 필요한 파일을 복사해 두는 것을 잊지 말것! 이미지 파일 1 URL urlImage = getClass (). getResource ( "kr/pe/elex/images/imageFile.png" ); 2 myImage = Toolkit . getDefaultToolkit (). getImage ( urlImage ); 3 //혹은 4 //myImage = ImageIO.read(urlImage); 텍스트 파일 1 JarFile jarFile = new JarFile ( getClass (). getProtectionDomain (). getCodeSource (). getLocation (). toURI ()); 2 JarEntry entry = jarFile . getJarEntry ( "kr/pe/elex/files/textFile.txt" ); 3 InputStreamReader input = new InputStreamReader ( jarFile . getInputStream ( entry ) );

스윙에서 데스크탑의 브라우저 실행하기

버튼 등에서 이벤트를 받아서 임의의 URL로 이동하는 브라우저를 띄우려거든 리스너에 다음과 같이 구현한다. 1 public void actionPerformed ( ActionEvent e ) { 2 try { 3 Desktop . getDesktop (). browse ( new java . net . URI ( "www.elex.pe.kr" )); 4 } catch ( IOException e1 ) { 5 e1 . printStackTrace (); 6 } catch ( URISyntaxException e1 ) { 7 e1 . printStackTrace (); 8 } 9 }

JDBC

JDBC 작업 과정 1. 데이터베이스와 연결하는 드라이버 파일을 찾아서 객체를 발생시킨다. 2. 연결을 관리하는 Connection 객체를 생성한다. 4~6. 작업을 처리할 Statement 또는  PreperedStatement 또는  CallableStatement 객체를 생성한다. 7. 반환되는 결과는 int 또는 ResultSet 객체에 담는다. 8. 접속을 종료한다. 1 Class . forName ( "..." ); 2 Connection conn = DriverManager . getConnection ( "..." , "..." , "..." ); 3 // String url = "프로토콜:서브프로토콜:SID"; 4 Statement stmt = conn . createStatement (); //정적 쿼리 5 PreparedStatement prepStmt = conn . prepareStatement ( "..." ); //동적 쿼리 6 CallableStatement callStmt = conn . prepareCall ( "..." ); // 프로시저 처리 7 ResultSet result = stmt . executeQuery ( query ); 8 conn . close ();

SQLite JDBC

SQLite JDBC http://www.zentus.com/sqlitejdbc/ 사용법 1 import java . sql .*; 2 3 public class Test { 4 public static void main ( String [] args ) throws Exception { 5 Class . forName ( "org.sqlite.JDBC" ); 6 Connection conn = 7 DriverManager . getConnection ( "jdbc:sqlite:test.db" ); 8 Statement stat = conn . createStatement (); 9 stat . executeUpdate ( "drop table if exists people;" ); 10 stat . executeUpdate ( "create table people (name, occupation);" ); 11 PreparedStatement prep = conn . prepareStatement ( 12 "insert into people values (?, ?);" ); 13 14 prep . setString ( 1 , "Gandhi" ); 15 prep . setString ( 2 , "politics" ); 16 prep . addBatch (); 17 prep . setString ( 1 , "Turing" ); 18 prep . setString ( 2 , "computers" ); 19 prep . addBatch (); 20 prep . setString ( 1 , "

jLayer

jLayer - MP3 Library http://www.javazoom.net/ 자바SE만으로는 MP3를 재생할 수 없다. 라이센스 때문이다. 따라서, Java를 사용해서 MP3를 재생하려면 이 라이브러리를 이용하는 것이 바람직하다. 이 라이브러리의 라이센스는 LGPL이다. 기본적인 사용법 InputStream을 넘겨서 Player 객체를 생성해주고 play(). public static void main ( String [] args ) { FileInputStream fis ; try { fis = new FileInputStream ( new File ( "test.mp3" )); Player player = new Player ( fis ); player . play (); } catch ( FileNotFoundException e ) { e . printStackTrace (); } catch ( JavaLayerException e ) { e . printStackTrace (); } } AdvancedPlayer 객체 또한 비슷한 방식으로 사용할 수 있겠다 싶다. 자세한 설명은 생략한다.

java.util.StringTokenizer

String str = "abc@def.com" ; StringTokenizer token = new StringTokenizer ( str , "@." ); while ( token . hasMoreTokens ()) { System . out . println ( token . nextToken ()); } StringTokenizer 생성자의 두 번째 매개변수의 각 문자를 기준으로 첫 번째 문자열을 토막낸다.

Proguard

Proguard http://proguard.sourceforge.net/ 자바 파일의 난독화(Ofuscator).

Launch4j

Launch4j http://launch4j.sourceforge.net/ 자바 패키지 파일인 Jar 파일을 윈도우즈 실행 파일인 Exe 파일로.

JD

JD http://java.decompiler.free.fr/ 자바 디컴파일러.

동기화

지역 동기화 synchronized ( this ) { ... 메서드 동기화 synchronized void run () { ...

java.lang.Runnable

class Runnable1 implements Runnable { public void run () { ... } } Runnable1 run1 = new Runnable1 (); Thread th = new Thread ( run1 ); th . start (); Runnale을 구현한 경우에는 Thread와 달리 start()메서드가 없으므로 별도의 Thread에 담아서 실행해야 한다.

java.lang.Thread

class Thread1 extends Thread { public void run () { ... } } Thread1 th = new Thread1 (); th . start (); static int activeCount() 현재 활성 상태인 스레드의 갯수를 반환한다. static Thread currentThread() 현재 실행 중인 스레드를 반환한다. static int enumerate(Thread[] arr) 활성중인 모든 스레드를 주어진 배열에 전달한다. String getName() void setName(String name) int getPriority() void setPriority(int priority) void interrupt() 스레드를 중지. static boolean interrupted() 현재 스레드가 중지 되었는가. void join() 스레드가 종료될 때까지 기다린다. 이 스레드가 계속 실행된다. static void sleep(long millisec) 지정된 시간 동안 현재 스레드를 멈춘다. static void yield() 현재 스레드를 잠시 멈추고 다른 스레드가 실행될 수 있도록 한다.

바이트 입출력

1바이트 출력 FileOutputStream fos = new FileOutputStream ( FileDescriptor . out ); BufferedOutputStream bos = new BufferedOutputStream ( fos , 2048 ); DataOutputStream dos = new DataOutputStream ( bos ); dos . writeXXX (..); dos . flush (); dos . close (); FileDescriptor.out은 콘솔에 대한 출력임. 버퍼의 크기는 파일인 경우에는 1024, 네트워크인 경우에는 512정도가 적당함. 1바이트 입력 FileInputStream fis = new FileInputStream ( FileDescriptor . in ); BufferedInputStream bis = new BufferedInputStream ( fis , 2048 ); DataInputStream dis = new DataInputStream ( bis ); char ch = ( char ) dis . read (); byte [] by = new byte [ 1024 ]; dis . read ( by ); dis . readXXX (..); dis . close (); FileDescriptor.in은 콘솔에 대한 입력임.

문자 입출력

텍스트 출력 OutputStreamWriter osw = new OutputStreamWriter ( System . out ); // FileWriter osw = new FileWriter(파일객체); BufferedWriter bw = new BufferedWriter ( osw , 바이트수 ); PrintWriter out = new PrintWriter ( bw ); 텍스트 입력 InputStreamReader isr = new InputStreamReader ( System . in ); // FileReader isr = new FileReader(파일객체); BufferedReader in = new BufferedReader ( isr );

객체 입출력

객체 출력 FileOutputStream fos = new FileOutputStream ( 파일객체 ); BufferedOutputStream bos = new BufferedOutputStream ( fos , 바이트수 ); ObjectOutputStream oos = new ObjectOutputStream ( bos ); 객체 입력 FileInputStream fis = new FileInputStream ( 파일객체 ); BufferedInputStream bis = new BufferedInputStream ( fis , 바이트수 ); ObjectInputStream ois = new ObjectInputStream ( bis );

주석

프로그램 실행에 영향을 미치지 않으며 소스코드의 내용을 설명하는 글을 주석이라고 한다. 자바는 3가지 유형의 주석을 지원한다. C언어 형식 /* ... ... */ 여러 줄 주석 C++언어 형식 // ... ... 한 줄 주석 Java Doc 형식 /** ... ... */ 문서화를 위한 주석

원시 자료형

논리형 boolean 형변환 불가. 정수형 byte 1 바이트 short 2 바이트 int 4 바이트 long 8 바이트 문자형 char 2바이트 실수형 float 4 바이트 double 8 바이트

예약어

abstract    continue    for    new    switch    assert    default    if    package    synchronized    boolean    do    goto    private    this    break    double    implements    protected    throw    byte    else    import    public    throws    case    enum    instanceof    return    transient    catch    extends    int    short    try    char    final    interface    static    void    class    finally    long    strictfp    volatile    const    float    native    super    while 

연산자

자바의 연산자(operator)는 다음과 같다. =       >    <    !       ~       ?       :        ==      <=   >=   !=      &&      ||      ++      --        +       -       *       /       &   |       ^       %       <<        >>        >>>        +=      -=      *=      /=      &=  |=      ^=      %=      <<=       >>=       >>>=

구분자

자바의 구분자(separator)는 다음과 같다. (       )       {       }       [       ]       ;       ,       .

값의 표현

리터럴(literal)은 원시자료(primitive type)형, 문자열(String)형, 널(null)형을 소스 코드 내에서 표현하는 방법이다. 정수형 정수는 10진수, 16진수, 8진수로 표현할 수 있다. 16진수로 표현하려면 0x로 시작한다. 8진수로 표현하려면 0으로 시작한다. 마지막에 L 또는 l을 붙이면 long형이다. 1과 혼동되지 않도록 가급적이면 L을 사용하는 것이 좋다. L을 붙이지 않으면 int형이다. 예 0     2    0372    0xDadaCafe    1996    0x00FF00FF 0l    0777L    0x100000000L    2147483648L    0xC0B0L 부동소수형 부동소수값은 IEEE 754에 따라 저장된다. 마지막에 F 또는 f를 붙이면 float형이다. F을 붙이지 않거나, D를 붙이면 double형이다. 예 1e1f    2.f     .3f    0f    3.14f    6.022137e+23f 1e1    2.    .3    0.0    3.14    1e-9d    1e137 불린형 참과 거짓 두가지 값을 가질 수 있다. 예 true    false 문자형 문자는 UTF-16으로 표현되는 단 하나의 문자이며, 작은 따옴표(' ')로 묶어서 표현한다. 예 'a'    '%'    '\t'    '\\'    '\''    '\u03a9'    '\uFFFF'    '\177'    ''    '' 문자열형 문자열은 0개 이상의 문자로 이루어지며, 큰 따옴표(" ")로 묶어서 표현한다. 예 "" // the empty string " \" " // a stri

컬렉션

Set 정렬 X, 중복객체 허용 X Map 정렬 X, 중복객체 허용 O List 정렬 O, 중복객체 허용 O

내부 클래스

Inner Class 클래스의 내부에 또 다른 클래스를 가진 클래스. (static 멤버는 포함 할 수 없다.) 1 class Outer { 2 class Inner { 3 ... 4 } 5 } Outer.class, Outer$Inner.class Outer . Inner oi = new Outer (). new Inner (); Static Inner Class 내부 클래스의 안에 static 멤버를 포함할 수 있다. (외부 클래스의 비 static 멤버는 포함 할 수 없다.) 1 class Outer { 2 static class Inner { 3 ... 4 } 5 } Outer.class, Outer$Inner.class   Outer . Inner oi = new Outer . Inner (); Local Inner Class 메서드 실행시에 사용되는 클래스를 정의하는 형식으로 접근자나 지정어를 가질 수 없다. 1 class Outer { 2 method () { 3 class Inner { 4 ... 5 } 6 } 7 } Outer.class, Outer$숫자Inner.class 객체 생성은 외부에서 할 수 없다. Anonymous Inner Class 기존 클래스의 특정 메서드를 오버라이딩하여 원하는 형태로 재정의하여 사용하는 방식. 외부 멤버중 final만 포함할 수 있다. 1 class Inner { ... } 2 3 class Outer { 4 method () { 5 new Inner () { 6 ... 7 } 8 } 9 } Outer.class, Outer$숫자.class n