Programming/Backend

자바 기초 다지기 -7 (네트워크, Java7, Java8)

meaningful_life 2021. 9. 26. 15:56
728x90

네트워크 프로그래밍

네트워킹이란?

장비와 장비가 데이터를 주고 받는 작업을 일컫는다

네트워크의 일반적인 레이어

  • 애플리케이션 레이어(HTTP, ftp, telnet. ...)
  • HTTP, ftp, telnet은 모두 TCP 통신을 한다.
  • 트랜스포트 레이어(TCP, UDP, ...)
  • 네트워크 레이어(IP, ....)
  • 링크 레이어(device driver, ...)

TCP 통신이란?

"연결 기반 프로토콜", 데이터를 수신하는 상대가 데이터를 받았는지 확실히 보장한다.

UDP 통신이란?

데이터를 제대로 받았는지 보장 없이 보내기만 한다.

TCP와 UDP로 나뉘어 존재하는 이유는?

  • 반드시 모든 데이터가 전송이 보장될 이유가 없고, 필요 없는 상황도 있다.
  • TCP는 UDP에 비해 느리고 비싸다.

"포트"란?

16비트(65,535)개의 숫자까지 구성되어 있으며 포트를 통해 해당 사이트의 어느 지점에 접속하는 것인지 구분할 수 있다.

  • 기본 포트
    • 80 : http default
    • 443 : https 접속시 사용

소켓 통신 → TCP 통신

TCP 통신을 하기 위해서는 Socket 클래스를 사용하면 된다.

서버 통신 대기중 → 클라이언트 객체 생성 및 데이터 송신 → 서버 데이터 수신 → 데이터 반환

  • 소켓 생성 메소드
    • ServerSocket() : 서버 소켓 객체를 생성
    • ServerSocket(int port) : 서버 소켓 객체 생성 및 포트번호 지정
    • ServerSocket(int port, int backlog) : 서버 소켓 객체를 생성 및 포트번호 지정, backlog 개수 지정
    • ServerSocket(int port, int backlog, InetAddress bindAddr) : 지정된 주소에서의 접근만 허용
  • 요청 대기 메소드
    • accept() : 소켓 연결을 기다리고, Socket 객체를 리턴
    • close() : 소켓 연결을 종료
  • 데이터를 보내기 위한 메소드
    • Socket() : 소켓 객체만 생성
    • Socket(Proxy proxy) : 프록시 관련 설정
    • Socket(SocketImpl impl) : 사용자가 지정한 객체를 사용하여 소켓 객체만 생성
    • Socket(InetAddress address, int port) : 소켓 객체 생성 수 address와 port를 사용하는 서버 연결
    • Socket(String host, int port) : host와 port를 사용하는 서버에 연결
    • ......

DatagramSocket → UDP 통신

  • 데이터의 유실이 있어도 문제가 없을 때에만 사용하는 것이 좋다.
  • 클래스 하나에서 보내는 역할과 받는 역할을 모두 수행할 수 있다.
  • UDP 통신을 할 때에는 스트림을 사용하지 않고 DatagramPacket이라는 클래스를 사용한다.
  • 소켓 생성 메소드
    • DatagramSocket() : 소켓 객체 생성후 사용 가능한 포트로 대기
    • DatagramSocket(DatagramSocketImpl impl) : 객체를 사용하여 소켓 객체 생성
    • DatagramSocket(int port) : 소켓 객체 생성 후 지정된 port로 대기
    • .....
  • 보내기 받기 메소드
    • receive(DatagramPacket packet) : 요청을 대기하고 데이터를 받는다
    • send(DatagramPacket packet) : 객체에 있는 데이터 전송
  • 데이터패킷 클래스
    • DatagramPacket(byte[] buf, int length) : length의 크기를 갖는 데이터를 받기 위한 객체 생성
    • DatagramPacket(byte[] buf, int length, InetAddress address, int port) : 지정된 address와 port로 데이터를 전송하기 위한 객체 생성
    • .......

Java 7 에서 달라진 것

  • 숫자 표시 방법 보완
    • 0을 숫자 앞에 넣어주면 : 8진수
    • 0x를 숫자 앞에 넣어주면 : 16진수
    • 0b를 숫자 앞에 넣어주면 : 2진수
    • 1000단위 콤마 표현 가능 : 1_000_000
  • switch문에서 String 사용
    • 이전에는 숫자만 사용이 가능하였다.
    • case "테스트" break;
  • 제네릭을 쉽게 사용할 수 있는 Diamond
    • Generic을 사용할 때 있어서 <> 다이아몬드 안에 상세한 타입을 명시했어야 한다.
    • 예를들어 new HashMap<>(); 으로 선언시 컴파일러에서 알아서 해당 생성자의 타입을 지정한다.
  • 예외 처리시 다중 처리 가능
    • try{ }catch( IllegalArgumentException | NullPointerException exception) { }
  • try-with-resource
    • AutoCloseable : Resource 관련하여 close()를 호출할 필요가 없다

Java 7 에서 추가된 것

Fork/Join 이란?

CPU를 더 쉽게, 효율적으로 사용하기 위해서 만들어졌다.

여러 개로 나누어 계산한 후 결과를 모으는 작업을 의미한다

  • Fork() : 여러개로 나누는 것
  • Join() : 나누어서 작업한 결과를 모으는 것
  • Compute() : 재귀호출 되는 메소드
  • Fork/Join은 여러개의 Thread가 일을 처리할때 만약 일이 다 끝나고 한가한 Thread가 생길 경우 work steal 이라는 개념을 통해 바쁜 쓰레드의 일을 가져와서 도와준다
  • CPU가 많이 있는 장비에서 계산 위주의 작업을 매우 빠르게 해야 할 필요가 있을 때 매우 유용하게 사용할 수 있다.
  • 추상 클래스
    • RecursiveAction : 리턴값이 없는 추상 클래스
    • RecursiveTask<V> : 리턴값이 있는 추상 클래스
  • 메소드
    • execute() : 비동기적 호출 수행시
    • invoke() : 호출 후 결과 대기
    • submit() : 호출 후 Future 객체 수신

NIO 2

java.io 패키지의 File 클래스에 미흡한 부분이 많았다는데 이를 보완하는 것이 NIO2에 매우 많이 포함되어 있다

  • 파일의 속성을 다룰 수 있다
  • 심볼릭 링크까지 처리할 수 있다
  • 어떤 파일이 변경되었는지 쉽게 확인할 수 있는 기능이 있다
  • 몇 가지 채널이 추가되었다
  • File 클래스를 대체하는 클래스들
    • Path : 파일과 경로에 대한 정보를 갖고 있다.
    • Files : Path 객체를 사용하여 파일을 통제한다
    • FileSystems : 현재 사용중인 파일 시스템에 대한 정보를 처리
    • FileStore : 파일을 저장하는 디바이스 파티션, 볼륨 등에 대한 정보들을 확인

이 외 추가된 기능

  • WatchService : 파일이 변경되었는지 확인하는 클래스
  • SeekableByteChannel : 바이트 기반의 채널을 처리하는데 사용한다
  • NetworkChanne : 네트워크 소켓을 처리하기 위한 채널
  • MulticastChannel : IP 멀티캐스트를 지원하는 네트워크 채널
  • AsynchronousFileChannel : 비동기 처리를 위한 채널
  • JDBC 4.1 : Connection 및 Statement 객체를 생성할 필요 없이 SQL 쿼리를 수행할 수 있다.
  • TransferQueue : 메시지를 처리할 때 유용하다
  • Objects : 매개변수로 넘어온 객체가 null이어도 예외를 발생시키지 않는다

Java 8에서 추가된 것들

  • Lambda
  • Functional
  • Stream
  • Optional
  • 인터페이스 기본 메소드 Default Method
  • 날짜 관련 클래스
  • 병렬 배열 정렬
  • StringJoiner

Optional

객체의 null을 편리하게 처리하기 위해서 만든 클래스

날짜 관련 클래스

  • LocalDateTime
  • LocalDate
  • DateTimeFormatter
  • ZoneId
  • ZoneOffset
  • ChronoField
  • ChronoUnit

병렬 배열 정렬

  • binarySearch() : 배열 내에서 검색
  • copyOf() : 배열의 복제
  • equals() : 배열의 비교
  • fill() : 배열 채우기
  • hashCode() : 배열의 해시코드 제공
  • sort() : 정렬
  • toString() : 배열 내용을 출력
  • parallelSort() : 정렬 메소드

StringJoiner

순차적으로 나열되는 문자열을 처리할 때 사용된다

Java 8에서 변경된 것

Lambda

익명 클래스를 사용하면 가독성도 떨어지고 불편한 단점을 보완하기 위해 만들어졌다.

  • 구성

// (매개 변수 목록) -> 처리식 (int x, int y) -> System.out.println(x+y);

  • 람다에 사용할 인터페이스 생성

// FunctionalInterface는 람다에 사용 할 인터페이스에 // 두 개의 메소드가 선언될 경우 에러가 발생하는 것을 방지해준다. @FunctionalInterface public interface AnnotationInterface{ int rambdaMethod(int a, int b); }

  • 인터페이스 사용방법

AnnotationInterface ai = (a,b) -> a+b; System.out.println(ai.rambdaMethod(1+2));

Function 패키지

함수형 인터페이스를 사용한다

  • Predicate
  • Supplier
  • Consumer
  • Function
  • UnaryOperator
  • BinaryOperator

Stream

연속된 정보를 처리하는데 사용한다

  • 구성

// list.스트림 생성.중개연산.종단 연산 list.stream().map(()->{}).count()

Method Reference

forEach(System.out::println)

JavaFX

자바 기반의 GUI를 만들 수 있는 라이브러리

  • 주요 기능
    • Java API
    • FXML, Scene Builder
    • 웹뷰
    • Swing과의 연동
    • 빌트인 UI 콘트롤 및 CSS
    • 3차원 그래픽 지원
728x90