개발/JAVA

[Java] 자바 상식2

mabb 2023. 5. 17. 17:54
반응형

이것이자바다2권

-실행중인 프로그램을 프로세스라고 한다.
-멀티 태스킹에는 멀티 프로세스와 멀티 스레드가 있다.
-멀티 스레드는 예외 시 프로세스 전체가 종료되므로 예외처리에 만전을 기해야한다.
-작업스레드는 Thread 클래스로 직접 만들거나 Thread 클래스를 상속받아 만든다.
-병렬성은 멀티코어, 동시성은 원코어 시분할
-스레드가 코어보다 많은 경우 동시성의 순서를 정하는 것이 스레드스케줄링이다.
-스레드스케줄링에는  우선순위(Priority)와 순환할당(Round-Robin)이 있다.
-우선순위는 개발자가 코드로 제어 가능하다
-순환할당은 JVM이 처리하여 개발자가 코드로 제어 불가하다.
-멀티스레드에서 하나의 스레드만 작업할 수 있는 영역이 임계영역(Critical section)이다.
-자바에서는 synchronized 키워드로 임계영역을 설정한다.
-1)스레드객체생성 2) start() 실행대기 RUNNABLE 3) run()실행 4) TERMINATED
-멀티스레드 프로그램은 정교한 스레드 상태제어가 필요하다.
-run()메소드 종료 시 스레드가 안전하게 종료되는 것을 이용하여 thread를 stop 시킨다.
-스레드를 그룹으로 관리하면 일괄적으로 상태를 관리할 수 있다.
-스레드 폭증으로 인한 성능저하는 스레드풀 사용으로 해소한다. (Executors 클래스)
-스레드풀로 스레드 최대 개수를 제한하고 작업큐의 작업을 스레드가 처리한다.
-스레드의 하나의 작업은 Runnable 또는 Callable로 구현하며 Callable은 리턴값이 있다.
-Runnable의 run(), Callable의 call()
-작업처리요청은 execute() 와 submit()을 사용하며 submit은 반환값 처리가 가능하다.
-타입파라미터 제네릭을 사용하면 컴파일 과정에서 타입에러를 체크하고 불필요한 캐스팅을 하지 않을 수 있다.
-자바의 모든 객체의 조상은 Object 클래스이다.
-제네릭을 사용하는 클래스와 인터페이스를 제네릭타입이라고 한다.
-제네릭타입은 이름 뒤에 <타입변수> 를 사용하여 선언한다.
-제네릭은 ,콤마로 구분하여 멀티타입파라미터로 사용할 수 있다.
-매개타입과 리턴타입에 제네릭을 사용하는 메서드를 제네릭메서드라고 한다.
-제네릭메서드는 리턴타입 앞에 <>제네릭을 추가하고 리턴 및 매개변수에 타입변수를 사용한다. public <T,V> Car<T> Factory(V v){}
-제네릭메서드 호출 시 메소드명 앞에 구체적인 타입을 <>속에 명시할 수 있다.
-<T extends 상위타입> 으로 제네릭을 제한할 수 있다.
-제네릭에 ? 와일드카드를 사용할 수 있다.
-제네릭 타입 상속 시 자식은 타입파라미터를 추가할 수 있다.
-자바에서 람다를 사용하면 함수적 프로그래밍이 가능하다.
-함수적프로그래밍언어는 병렬처리와 이벤트지향 프로그래밍에 적합하다.
-람다식은 익명함수를 생성하기 위한 식이다.
-람다식은 (매개변수) ->{실행코드} 형태이며 런타임 시 인터페이스의 익명구현객체로 생성된다.
-자바의 메소드는 클래스의 멤버로만 선언할 수 있다.
-람다식은 인터페이스의 익명구현객체를 생성하는 식으로 함수적 프로그래밍을 구현한다.
-람다식이 대입될 인터페이스를 타겟타입(target type)이라고 한다.
-람다식은 하나의 추상메소드를 가진 인터페이스만 타겟타입으로 할 수 있는데 이러한 인터페이스를 함수적 인터페이스(@FunctionalInterface)라고 한다.
-자주쓰는 함수적 인터페이스(타겟타입) 은/는 java.util.Function패키지에 모여있다.
-함수적인터페이스는 Consumer, Supplier, Function, Operator, Predicate로 구분된다.
-디폴트메소드와 정적메소드가 있어도 추상메소드만 한 개이면 함수적인터페이스이다.
-함수적인터페이스에는 andThen(),compose(), and(),or(),negate(), isEqual()등의 디폴트메소드와 정적메소드가 부가 기능을 제공한다.
-andThen()디폴트메소드로 반환값을 뒤의 메소드에 넘겨주며 연결 실행할 수 있다.
-메소드참조는 정적,인스턴스메소드 및 생성자 참조가 가능하다.
-클래스::new 로 생성자 참조를 표현한다.
-자바는 java.util패키지에 컬렉션 프레임워크관련 인터페이스와 클래스를 포함시켜두었다.
-자바는 배열의 문제점을 해결하고자 널리알려진 자료구조를 바탕으로 여러 객체를 다루기 편리한 기능을 구현하였다. 이를 컬렉션 프레임워크라고 한다.
-주요 컬렉션프레임워크 인터페이스에는 List, Set, Map이 있다.
-Vector는 ArrayList와 동일한 구조이나 Synchronized로 Thread Safe하다.
-빈번한 객체 삽입, 삭제 시 LinkedList의 성능이 ArrayList보다 우월하다.
-끝에서 부터 삭제하는 것은 ArrayList가 LinkedList보다 빠르다.
-HashTable은 HashMap과 동일한 구조이나  Synchronized로 Thread Safe하다.
-Properties는 키와 값이 String으로 제한된 컬렉션으로 주로 파일로 읽고 쓸 때 사용한다.
-자바는 TreeSet과 TreeMap의 이진 트리구조로 검색기능이 강화된 컬렉션을 제공한다.
-이진트리구조의 컬렉션은 자동으로 오름차순 정렬이 된다.(숫자는 값, 문자는 유니코드)
-자바는 후입선출(LIFO) Stack , 선입선출(FIFO) Queue 컬렉션을 제공한다.
-자바는 Thread Safe하도록 Synchronized된 Vector와 HashTable을 제공한다.
-동기화컬렉션은 안전하지만 병렬처리가 불가하다.
-자바는 java.util.concurrent 패키지에서 병렬처리가 가능한 컬렉션을 제공한다.
-스트림은 컬렉션 저장요소에 하나씩 접근하여 람다식으로 처리할 수 있도록 해주는 반복자이다
.
-Stream도 Iterator처럼 반복자이지만 람다식으로 요소처리가 가능하고 내부 반복자를 통한 병렬처리 용이, 중간처리와 최종처리 기능이 가능하다는 장점을 가지고 있다.
-스트림의 메소드는 대부분 함수적인터페이스타입을 매개변수로 가져 람다식, 메소드 참조를 이용하여 요소처리를 하기 좋다.
-자바는 java.util.stream패키지에서 스트림 기능을 제공한다.
-스트림은 컬렉션, 배열, 스트림 인터페이스, 파일, 디렉토리 등에서 얻을 수 있다.
-대량의 데이터를 가공해서 축소하는 것을 리덕션(Reduction)이라고 한다.
-요소 전체를 반복하는 것을 루핑(looping)이라고 한다.
-java.util.Optiona<T>클래스에는 값을 저장하는 값 기반 클래스가 포함되어 있다.
-데이터병렬성이란 전체 데이터를 쪼개서 서브데이터를 만들고 서브데이터들을 병렬처리해서 작업을 빨리 끝내는 것을 말한다.
-작업병렬성이란 서로 다른 작업을 병렬처리하는 것을 말한다.
-자바에서 데이터는 스트림을 통해 입출력된다.
-프로그램에 입력되는 데이터는 입력스트림, 프로그램에서 출력되는 데이터는 출력스트림을 통한다.
-스트림에는 바이트기반스트림과 문자기반스트림이 있다.
-콘솔(Console) 시스템 CLI 소프트웨어를 말한다.
-엔터키는 캐리지리턴(13) + 라인피드(10) 이다.
-System.in 은 public static final InputStream in 필드이다.
-System.out 은 public static final PrintStream out 필드이다.
-in과 out 스트림으로 입출력하는 데이터는 문자열로 읽는다.
-Scanner 클래스를 이용하면 콘솔로부터 기본 타입의 값을 바로 읽을 수 있다.
-Scanner 클래스로 File, InputStream, Path 등 다양한 입력소스를 읽을 수 있다.
-자바에서는 File 클래스로 파일 생성, 삭제, 디렉토리 생성, 디렉토리 내 리스트, 파일 정보등을 얻을 수 있다. 
-File 클래스로 파일의 데이터를 읽고 쓰는 것은 불가하다, 이는 스트림을 이용한다.
-윈도우의 디렉토리 구분자는 \또는/ 리눅스의 디렉토리 구분자는 / 이다.
-자바에서 \를 디렉토리 구분자로 사용할 경우 이스케이프문자\를 사용하여 \\로 기재한다.
-File 생성자에 유효하지 않은 경로가 주어져도 에러나 예외가 발생하지 않는다.
-FIle 객체의 파일이나 디렉토리가 존재하는지 exists() 메소드로 확인하여야 한다.
-File 객체의 파일이나 디렉토리가 존재하지 않으면 생성하는 로직을 사용한다.
-File 객체의 파일이나 디렉토리가 존재하면 해당 정보를 얻는 로직을 사용한다.
-자바에서 문자변환, 성능향상, 기본데이터타입입출력, 객체입출력 등을 위해 보조 스트림을 사용한다.
-프로그램의 실행성능은 입출력이 가장 늦은 장치를 따라간다.
-버퍼를 이용하여 실행 성능을 개선할 수 있다.
-자바는 메모리에 생성된 객체를 파일 또는 네트워크로 출력할 수 있는데 이를 객체 직렬화(serialization)이라고 한다.
-객체는 바이트기반스트림으로 출력한다.
-자바에서는 Serializable 인터페이스를 구현한 클래스만 직렬화할 수 있다.
-객체의 필드만 바이트로 변환되어 직렬화 되며 생성자와 메소드는 직렬화되지 않는다.
-static, transient 예약어가 붙은 경우 직렬화되지않는다.
-부모 클래스가 Serializable 인터페이스를 구현하고 있으면 Serializable을 구현하지 않은 자식도 직렬화가 가능하며 이 때 부모 및 자식 필드 모두 직렬화된다.
-서비스를 제공하는 프로그램을 서버, 서비스를 받는 프로그램을 클라이언트라고 한다.
-네트워크에서 컴퓨터의 고유한 주소가 IP이며 IP는 네트워크 어댑터(NIC)마다 할당된다.
-한 컴퓨터에는 다양한 서버 프로그램이 실행될 수 있다.
-네트워크에서 IP를 통해 네트워크 어댑터까지 접근하고, 포트(port)번호를 통해 각 서버 프로그램에 접근한다.
-서버가 시작할 때 고정적인 포트번호를 가지고 실행되는데 이를 포트 바인딩이라고 한다.
-자바는 IP주소를 java.net.InetAddress 객체로 다룬다.
-InetAdress로 DNS IP주소를 가져올 수 있다.
-TCP(Transmission Control Protocol) 은 연결지향프로토콜로 가상회선으로 통신선로가 고정되고 고정된 선로를 통해 데이터를 전송한다.
-UDP(User Datagram Protocol) 은 비연결지향프로토콜로 연결절차 및 통신선로 고정없이 데이터를 연속하여 일방적으로 보낸다.
-자바는 TCP 네트워킹을 위해 java.net.ServerSocket과 java.net.Socket 클래스를 제공한다.
-TCP 서버의 첫번째 역할은 클라이언트의 연결요청을 수락하는 것, 두번째 역할은 연결된 클라이언트와 통신하는 것이다.
-연결요청을 수락하는 것이 ServerSocket클래스, 연결된 클래스와 통신하는 것이 Socket클래스이다.
-연결을 위해 IP와 바인딩포트번호가 필요하다.
-네트워킹에는 가상선로방식과 데이터그램방식이 있는 것이다. (정처기)
-자바에서 소켓은 연결 및 통신 시 블로킹(blocking)이 되는 동기 방식으로 구동이 된다.
-소켓의 accept(), connect(), read(), write() 는 작업스레드로 병렬처리하는 것이 좋고, 스레드 증폭으로 인한 서버 과부하 및 다운을 방지하려면 스레드 풀을 사용하여야 한다.
-자바는 UDP 네트워킹을 위해 java.net.DatagramSocket과 java.net.DatagramPacket클래스를 제공한다.
-UDP에서 수신자는 항상 데이터를 받을 준비를 해야하므로 작업 스레드를 생성해서 receive()메소드를 반복적으로 호출해야 한다.
-NIO는 New Input/Output이며 IO와 다르게 채널 방식으로 입출력한다.
-NIO는 버퍼, 비동기, 넌블로킹 모두 지원한다.
-스트림은 단방향이기에 인풋스트림, 아웃풋스트림을 사용한다.
-채널은 양방향이다.
-연결 클라이언트 수가 많고 하나의 입출력 시간이 짧은 경우 NIO가 유리하다.
-연결 클라이언트 수가 적고 대용량 데이터 전송시에는 IO가 유리하다.
-자바의 와치서비스는 디렉토리 내부에서 파일 생성,삭제,수정 등의 변화를 감시하는데 사용한다.





반응형