Integer 타입의 리스트를 int 타입 배열로 변환할 때는 (int[]) 등의 형태로 변환할 수 없다. 이 때는 아래와 같이 List에서 제공하는 stream을 통해 primitive type인 int 타입 배열로 변환할 수 있다. List list = Arrays.asList(1, 2, 3, 4, 5); int[] arr = list.stream().mapToInt(Integer::intValue).toArray();
Backend/Java
쉘 스크립트를 실행시키면서 파라미터를 넘기기 위해서는 'sh 스크립트명 파라미터'와 같이 실행시킬 쉘 스크립트 파일명 뒤에 띄우고 전달할 수 있다. 이를 자바에서 쉘 스크립트 실행하는 방법과 연동하면, Java가 제공하는 Runtime 클래스의 getRuntime() 메서드를 호출해 런타임 인스턴스를 반환받아, 여기에 exec() 메서드를 통해 쉘 실행 스크립트를 작성하면 된다. Process process = Runtime.getRuntime().exec("sh shellname.sh hello java"); 쉘을 아래와 같이 작성되어 있다고 전제한다. $ echo $1 $ echo $2 위의 내용을 바로 출력시켜 보려면 Process 인스턴스로부터 바로 InputStream을 받아 BuffredRea..
클라이언트에게서 데이터를 전달받아 서버에서 처리하기 위해서는 주로 json 형태의 데이터를 전달받고는 한다. 이 때 Jackson 패키지의 ObjectMapper를 사용해 받아온 문자열 형태의 json 데이터 또는 @RequestBody로 받아온 Map 타입의 데이터를 자용자 정의 타입으로 변환할 수 있다. 먼저, ObjectMapper를 사용할 때에는 ObjectMapper 객체를 생성하여 사용할 수 있다. ObjectMapper objectMapper = new ObjectMapper(); 1. json 문자열에서 특정 타입(Class)로 변환하는 경우 - readValue(String jsonStr, classType) T parsingData = objectMapper.readValue(jsonS..
UDP 통신을 위해 필요한 Class ◆ DatagramSocket(접속 설정 필요없이 사용) ◆ DatagramPacket : 이를 통해 데이터를 주고 받음(데이터를 보낼 때는 ip, port 필요, 데이터를 받을 때는 buffer만 필요) 데이터 전송 시 BufferedReader bufReader = new BufferedReader(new InputStreamReader(System.in)); while ((buff = bufReader.readLine()) != null) { str += buff; } byte[] buffer = str.getBytes(); DatagramSocket ds = new DatagramSocket(); InetAddress ip = InetAddress.getByN..
아래에 총 세개의 클래스를 생성하는데, 실제로 스레드를 구동시킬 main 메서드를 포함한 public 클래스 SynchronizedEx와 값이 변경되도록 하는 ShareObj 클래스, 스레드인 AddThread 클래스가 그것이다. 스레드가 thread 하나일때는 순차적으로 1, 2, 3, 4, ..., 10이 출력되는 것을 볼 수 있다. 그러나 thread2(또 다른 하나의 스레드)를 생성해 실행시켜보면, 두 스레드가 해당 자원을 점유하기 위해 경쟁하는 것을 볼 수 있다. 이 때, 하나의 스레드만 자원을 점유할 수 있도록 하는 키워드인 synchronized를 사용하면, 하나의 스레드의 작업이 모두 끝난 뒤 다른 스레드의 작업이 이루어지는 것을 볼 수 있다. 동기화란 한 번에 하나의 자원에 하나의 스레드..
1:1 채팅 프로그램을 구현해보았다. 서버 측 코드가 서버 소켓을 두고, 클라이언트가 연결될 때마다 소켓을 생성해주는 역할을 한다는 점과 클라이언트 측 코드가 ip, port를 기반으로 소켓을 생성(연결 시도)한다는 점이 다르다. 그 외의 실제 데이터를 주고 받는 코드는 양 측 코드가 매우 흡사하다. Source Code 서버 측 public class ChattingServer implements Runnable { Socket sk; public ChattingServer() { System.out.println("Server Start"); try { ServerSocket ssk = new ServerSocket(6060); sk = ssk.accept(); System.out.println("C..
이번 차수에서는 소켓의 스트림을 통해 데이터를 전송하는 것에 대해서 다루었다. 데이터 전송 눈여겨 보아야 할 부분은 ServerSocket이 클라이언트 측과 연결되면 생성되는 소켓(Socket Class)에서 제공되는 OutputStream을 통해 데이터를 보낸다는 것이다. 이를 클라이언트 측에서는 소켓(서버 측에서 생성되는 소켓과 동일한 Class)에서 제공되는 InputStream을 통해 데이터를 받을 수 있다. ※ Java의 Socket을 이용한 네트워크 통신에 대해 알고 싶어 이 부분에 대해서 공부하기 시작하면서 추가적으로 Stream에 대한 공부가 이어져야 할 것 같다... Stream에 대한 이해도가 낮은 것을 많이 느낀다. ※ 서버 측에서 DataOutputStream을 Filter Stre..
서버 측 소켓 생성(ServerSocket) public class DemoServer { public static void main(String[] args) throws IOException { int port = 5050; // 서버 소켓(리스너 역할 뿐) 생성 ServerSocket ssk = new ServerSocket(port); // 소켓과 연결할 포트 번호를 인자로 지님 System.out.println("접속 대기중"); Socket socket = ssk.accept(); // Client와 연결되면 새로운 소켓 생성(accept) if (socket.isConnected()) { } } } 클라이언트 측 소켓 생성 public class DemoClient { public stati..
public static void main(String[] args) throws Exception { String str = "https://skbp.learningmate.co.kr/usrs/lms/classrm/classrmPrgrsItm.do"; // File까지 있는 URL을 부여 URL url = new URL(str); URLConnection conn = url.openConnection(); int size = conn.getContentLength(); // 가끔 불러오지 못하는 경우 존재 String fileType = conn.getContentType(); long time = conn.getDate(); // 1970.01.01 00:00부터 시작되어 천분의 일초로 계산된 값 S..