printf 와 지시자



자바에서는 콘솔화면에 출력 할 때 println을 주로 사용한다. 하지만 printf를 사용하면 데이터를 좀 더 다양하게 출력 할 수 있는 장점이 있다. printf는 C를 해봤던 사람이면 익숙한 함수이다. C의 printf와 비슷한 자바의 printf를 사용 법을 알아보자.


 

지시자 설명



우선 지시자에 대해 알아보도록 해보겠다.


 지시자

 설명

 %b

 불리언

 %d

 10진수

 %o

  8진수

 %x, %X

 16진수

 %f

 실수형 10진수

 %e, %E  지수형태표현
 %c 문자
 %s 문자열
 %n

 개행


[ println VS printf ]


println을 이용한 출력

 String s = "hello"

 System.out.println( "test = [" + s + "]" );


printf를 이용한 출력

 String s = "hello"

 System.out.printf( "test = [%s]%n",s); 


[예제]

public class Printf {

public static void main(String[] args) {

//boolean 출력 지시자

boolean isTrue = true;

System.out.printf("isTrue[%b]%n",isTrue);

//10진수 출력 지시자

int number = 10;

System.out.printf("isTrue[%d]%n",number);

//문자 출력 지시자

char c = 'A';

System.out.printf("c[%c]%n",c);

//8진수 출력 지시자

int oNum = 010;

System.out.printf("oNum[%o],[%d]%n",oNum, oNum);

//16진수 출력 지시자

int hNum = 0x10;

System.out.printf("hNum[%x],[%d]%n",hNum, hNum);

//문자열 출력 지시자

    String msg = "hello world";

System.out.printf("msg[%s]%n",msg);

}

}



반응형

'프로그램 > Java' 카테고리의 다른 글

[java] Random 사용법  (0) 2018.05.24
[java] sleep 사용법  (0) 2018.05.23
[java] ServerSocket, Socket  (0) 2018.05.21
[java] 다중 반복문 탈출 방법  (0) 2018.05.21
[java] do~while문 사용법  (0) 2017.12.15

ServerSocket, Socket



ServerSocket은 java에서 서버 프로그램을 개발할 때 쓰이는 클래스이다. 해당 클래스를 이용해서 서버를 개발 하는 방법에 대해 알아보겠다. Socket 클래스는 client에서 서버로 접속하거나 Server에서 accept 하는데 필요한 클래스다. 이 설명을 이해 하려면 TCP/IP 접속 송수신 과정이해가 선행 되어야 한다.


 

소켓 송수신 과정 설명



ServerSocket, Socket 클래스를 이용한 서버-클라이언트 프로그램을 이해하려면 다음과 같이 TCP/IP 송수신 과정을 이해 해야한다.


 서버

 방향

 클라이언트

 클라이언트의 요청을 받기 위한 준비를 한다.(ServerSocket)

 

 

 클라이언트의 요청을 받아 들인다. (accept)

 <-

 서버에 접속 요청을 한다. (Socket)

 클라이언트가 보낸 데이터를 출력 한다. (BufferedReader)

 <-

 서버에 메시지를 보낸다. ( BufferedWriter )

 클라이언트에 메시지를 보낸다. ( BufferedWriter )

 ->

 서버가 보낸 메시지를 출력한다. ( BufferedReader )

 종료 한다. ( socket.close() )

 

 종료 한다. ( socket.close() )



[서버]

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.net.ServerSocket;

import java.net.Socket;


public class Server {

    public static void main(String[] args ) {

        try {

            //서버 생성

            ServerSocket serverSocket = new ServerSocket(9000);

            //client 접속 accept

            Socket socket = serverSocket.accept();

            

            //client가 보낸 데이터 출력

            BufferedReader bufReader =

              new BufferedReader( new InputStreamReader( socket.getInputStream()));

            String message = bufReader.readLine();

            System.out.println("Message : " + message );

            

            //client에 데이터 전송

            BufferedWriter bufWriter = 

              new BufferedWriter( new OutputStreamWriter( socket.getOutputStream()));

            bufWriter.write("hello world");

            bufWriter.newLine();

            bufWriter.flush();

            

            socket.close();

            serverSocket.close();

            bufReader.close();

            bufWriter.close();

            

          }

          catch( Exception e ){

            e.printStackTrace();

          }

            

     }

}

  


9000번 port로 설정해 서버를 생성

 ServerSocket serverSocket = new ServerSocket(9000);


클라이언트 요청을 받아 들인다.

 Socket socket = serverSocket.accept();


[클라이언트]

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.net.Socket;


public class Client {

    public static void main(String[] args ) {

        try {

            //서버 접속

            Socket socket = new Socket("127.0.0.1", 9000);

            

            //Server에 보낼 데이터 

            BufferedWriter bufWriter = 

              new BufferedWriter( new OutputStreamWriter( socket.getOutputStream()));

            bufWriter.write("hello world");

            bufWriter.newLine();

            bufWriter.flush();

            

            //Server가 보낸 데이터 출력

            BufferedReader bufReader =

              new BufferedReader( new InputStreamReader( socket.getInputStream()));

            String message = bufReader.readLine();

            System.out.println("Message : " + message );

            

            socket.close();

            bufReader.close();

            bufWriter.close();

          }

          catch( Exception e ){

            e.printStackTrace();

          }

            

          }

}



127.0.0.1 (localhost) 9000번 서버에 접속

 Socket socket = new Socket("127.0.0.1", 9000);



소켓에서 데이터를 읽을 때 

( 예제 기준으로 서버인 경우 클라이언트의 요청을 받는다. 반대로 클라이언트는 서버의 응답을 받는다. )

BufferedReader bufReader =

              new BufferedReader( new InputStreamReader( socket.getInputStream())));


소켓에서 데이터를 쓸 때 

( 예제 기준으로 서버인 경우 클라이언트에 응답을 한다. 반대로 클라이언트는 서버의 요청을 한다. )

 BufferedWriter bufWriter = 

              new BufferedWriter( new OutputStreamWriter( socket.getOutputStream())));




반응형

'프로그램 > Java' 카테고리의 다른 글

[java] sleep 사용법  (0) 2018.05.23
[java] printf 와 지시자  (0) 2018.05.22
[java] 다중 반복문 탈출 방법  (0) 2018.05.21
[java] do~while문 사용법  (0) 2017.12.15
[java] while문 사용법  (0) 2017.12.11

다중 반복문 탈출



프로그램 작성 하는 중 2중 혹은 그 이상 다중으로 반복문( while, for 등 )을 사용하는 경우가 있다. 여러 반복문을 탈출 하기 위해서는 각 반복문 마다 break를 해야만 빠져나올 수 있어 번거롭고 코드 보기도 복잡하다. Java에서 다중 반복문을 탈출 하는 방법을 알아보자.

 

구구단 예문으로 2중 for문 탈출 예제



아래와 같이 구구단을 출력하는 프로그램이 있다.


public class calcMath{

public static void main(String[] args){

             for( int i = 2; i < 10; i++ ){

                for( int j = 2; j < 10; j++){

                   System.out.println( i + "X" + j + "=" + (i*j));                   

                }

             }

}

}


여기서 2번째 for 문에서 한 번에 빠져 나가는 방법을 알아보자.


public class calcMath{

public static void main(String[] args){

             forout : 

             for( int i = 2; i < 10; i++ ){

                for( int j = 2; j < 10; j++){

                   if( i == 3 )

                      break forout;

                   System.out.println( i + "X" + j + "=" + (i*j));                   

                }

             }

}

}



위와 같이 반복문이 실행 되기 전에 반복문 이름을 forout 이라고 짓는다. 

그리고 2 번 째 for문에서 break 반복문 명인 forout을 지정해주면 해당 반복문을 빠져 나올 수 있다.

 반복문 명 지정 :

  for( ... ){

     for( ... ) {

         break 반복문 명;

     }

  }



반응형

'프로그램 > Java' 카테고리의 다른 글

[java] printf 와 지시자  (0) 2018.05.22
[java] ServerSocket, Socket  (0) 2018.05.21
[java] do~while문 사용법  (0) 2017.12.15
[java] while문 사용법  (0) 2017.12.11
[java] switch문 사용법  (0) 2017.12.10

벽을 통과 할 수 있는 능력을 갖은 남자 이야기 < 벽으로 드나드는 남자 > 는 마르셀 에메의 단편 소설이다. 독신인 뒤티유욀은 모험심이 없는 남자이다. 그래서 스스로 이 능력을 사용하지 않다가 어떠한 계기로 벽을 통과하는 능력을 마음껏 사용하면서 벌어지는 이야기다. 주인공 내면에 간직했던 자신이 돋보이고 싶어 하는 욕망을 이 능력을 통해 채우기 시작한다. 이러한 주인공의 행동을 통해 독자들은 통쾌함과 기쁨을 얻을 수 있을 것이라 생각이 든다. 왜냐하면 오늘날 현대인들은 집, 회사 등 콘크리트 벽속에 갇혀 생활을 한다. 항상 실내 생활이 갑갑해 벗어나고 싶은 독자들은 주인공의 행동을 통해 어느 정도 위안을 얻을 수 있을 것이라 생각이 든다.

 

책의 전체적인 내용을 살펴보겠다. 뒤티유욀은 마흔세 살에 벽을 통과하는 능력을 알았을 때 이 능력을 없애기 위해 병원에 가서 약을 처방 받았다. 약을 먹고 체력을 과도하게 소모하면 벽을 통과 할 수 없게 된다는 의사의 조언과 약의 존재를 잊고 살아간다. 주인공은 모험심이 없어 이 능력을 사용하지 않다가 회사에서 맞지 않는 상관이 들어오면서 능력을 사용하게 된다. 상사는 주인공을 방에 혼자 가둔다. 주인공은 복수를 위해 방 벽을 통해 머리만 내밀며 상관을 괴롭힌다. 끝내 상관은 정신병원에 가게 되었다. 주인공은 이 능력을 더 사용 하고 싶어서 여기저기 도둑질을 하게 되었다. 아무도 자신이 도둑이라는 것을 믿지 않아 일부러 경찰에 잡힌다. 감옥에 갇혀도 주인공은 벽을 드나들 수 있기 때문에 언제나 감옥을 뼈져 나왔다. 주인공은 감옥 소장을 골탕 먹이는데 재미를 붙였다. 곧 이마져도 시들어져서 이집트로 여행을 갈 계획을 세운다. 이 때 한 여인을 목격하고 이 여인과 사랑에 빠지게 된다. 이 여인의 남편은 여자가 밖에 나가지 못하게 집에 감금 시켜 놓는다. 하지만 주인공은 벽을 드나들면서 여자와 사랑을 나누게 된다. 어느날 주인공은 머리가 아파서 서랍에 있는 약을 먹고 다시 여자를 만나게 된다. 격렬한 사랑을 나눈 후 돌아가려고 벽을 지나가는데 이전처럼 벽을 통과할 수가 없게 되었다. 이유는 주인공이 먹은 약은 이전에 의사가 처방해준 것으로 약을 먹고 체력소진을 하여 능력을 잃어버리게 된 것이다. 그로 인해 주인공은 영원히 벽에 갇히게 된다.

 

요즘 영화에 나오는 슈퍼히어로에 비하면 보잘 것 없는 능력이다. 그리고 그나마 있는 이 능력은 오르지 자신을 위해 사용하게 된다. 세상을 구하거나 어려운 사람을 돕는 일은 하지 않는다. 상당히 이기적이면서 현실적이다. 마치 오늘날 권력남용으로 일반사람이 생각지도 못하는 일들을 저지르는 것과 비슷하다고 생각이 든다. 남들보다 초월적인 능력을 갖게 되면 우선 자신을 위해 사용하고 싶은 생각이 누구나 있을 것이다. <벽을 드나드는 남자>는 독자로 하여금 내가만약 이런 능력을 가지고 있다면 어떻게 행동할까?” 라는 생각을 하며 재미있게 볼 수 있는 책이라 생각 된다.

 


반응형

+ Recent posts