네트워크 프로그래밍
네트워킹이란?
장비와 장비가 데이터를 주고 받는 작업을 일컫는다
네트워크의 일반적인 레이어
- 애플리케이션 레이어(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차원 그래픽 지원
'Programming > Backend' 카테고리의 다른 글
API 명세서 뜯어보기 - StringBuilder && StringBuffer Class (0) | 2021.09.28 |
---|---|
API 명세서 뜯어보기 - String Class (0) | 2021.09.27 |
자바 기초 다지기 - 6 (Thread, Syncronized, Serializable, IO, NIO) (0) | 2021.09.13 |
자바 기초 다지기 - 5 ( Generic, Collection, Map ) (0) | 2021.09.06 |
자바 기초 다지기 - 4 (내부 클래스, 어노테이션, 자바) (0) | 2021.08.29 |