프로젝트가 마음에 들면 클릭하세요. 귀하의 기여를 진심으로 환영합니다.
멀티스레딩
컬렉션
JDBC(Java 데이터베이스 연결)
자바 프로그램
자바 문자열 메소드
자카르타 서버 페이지(JSP)
서블릿
Java 객관식 질문
자바 디자인 패턴
최대 절전 모드
스프링 프레임워크 기본
소개
자바 아키텍처
자바 데이터 유형
자바 메소드
자바 함수형 프로그래밍
Java 람다 표현식
자바 클래스
자바 생성자
자바 어레이
자바 문자열
자바 리플렉션
자바 스트림
자바 정규식
자바 파일 처리
자바 예외
자바 상속
Java 메소드 재정의
자바 다형성
자바 추상화
자바 인터페이스
자바 캡슐화
자바 제네릭
여러 가지 잡다한
기본적으로 인터페이스 방법;
람다식;
기능적 인터페이스
메서드 및 생성자에 대한 참조
반복 가능한 주석
데이터 유형에 대한 주석
메소드 매개변수에 대한 반영.
컬렉션 작업을 위한 스트림 API;
배열의 병렬 정렬;
날짜 및 시간 작업을 위한 새로운 API;
새로운 JavaScript Nashorn 엔진;
스레드 안전 작업을 위한 몇 가지 새로운 클래스가 추가되었습니다.
Calendar
및 Locale
위한 새로운 API가 추가되었습니다.
유니코드 6.2.0에 대한 지원이 추가되었습니다.
Base64 작업을 위한 표준 클래스를 추가했습니다.
부호 없는 산술에 대한 지원이 추가되었습니다.
향상된 생성자 java.lang.String(byte[], *)
및 메소드 성능 java.lang.String.getBytes()
;
* 다른 모든 액세스 수준을 확인할 필요 없이 권한의 하위 집합을 설정할 수 있는 새로운 구현인 AccessController.doPrivileged
;
비밀번호 기반 알고리즘이 더욱 강력해졌습니다.
JSSE 서버에 SSL/TLS 서버 이름 표시(NSI)에 대한 지원이 추가되었습니다.
향상된 키스토어(KeyStore);
SHA-224 알고리즘이 추가되었습니다.
JDBC 브리지 제거 - ODBC;
PermGen이 제거되면 클래스의 메타데이터 저장 방법이 변경됩니다.
전체 플랫폼이 아닌 일부를 포함하는 Java SE 플랫폼용 프로필을 생성하는 기능
도구
JavaScript Nashorn 사용을 위한 유틸리티 jjs
추가했습니다.
java
명령은 JavaFX 애플리케이션을 실행할 수 있습니다.
.class 파일 분석을 위한 유틸리티 jdeps
추가했습니다.
↥ 맨 위로 돌아가기
Nashorn은 Oracle이 Java로 개발한 JavaScript 엔진입니다. Java 애플리케이션에 JavaScript 코드를 포함하는 기능을 제공하도록 설계되었습니다. Mozilla Foundation에서 지원하는 Rhino와 비교하여 Nashorn은 코드를 컴파일하고 메모리에서 직접 바이트코드를 Java 가상 머신으로 전송하므로 2~10배 더 나은 성능을 제공합니다. Nashorn은 JavaScript 코드를 컴파일하고 특수 로더로 로드되는 Java 클래스를 생성할 수 있습니다. JavaScript에서 직접 Java 코드를 호출하는 것도 가능합니다.
↥ 맨 위로 돌아가기
jjs
- 콘솔에서 직접 JavaScript 프로그램을 실행할 수 있게 해주는 명령줄 유틸리티입니다.
↥ 맨 위로 돌아가기
Java에는 명령줄 환경( console )에서 사용자의 입력을 읽는 세 가지 방법이 있습니다.
1. 버퍼링된 리더 클래스 사용:
이 방법은 System.in(표준 입력 스트림)을 BufferedReader로 래핑된 InputStreamReader로 래핑하여 사용되며 명령줄에서 사용자의 입력을 읽을 수 있습니다.
/** * 버퍼 리더 클래스 */import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Test { public static void main(String[] args) throws IOException { // Enter BufferReader를 사용하는 데이터 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); // readLine을 사용하여 데이터 읽기 String name = reader.readLine(); // 읽기 라인 인쇄 System.out.println(name); } }
2. 스캐너 클래스 사용:
Scanner 클래스의 주요 목적은 정규식을 사용하여 기본 유형과 문자열을 구문 분석하는 것이지만 명령줄에서 사용자의 입력을 읽는 데에도 사용할 수 있습니다.
/** * 스캐너 클래스 */import java.util.Scanner;class GetInputFromUser { public static void main(String args[]) { // 사용자로부터 입력을 얻기 위해 스캐너 사용 Scanner in = new Scanner(System.in); 문자열 s = in.nextLine(); System.out.println("문자열을 입력하셨습니다. " + s); int a = in.nextInt(); System.out.println("정수를 입력하셨습니다. " + a); float b = in.nextFloat(); System.out.println("float를 입력하셨습니다. " + b); } }
3. 콘솔 클래스 사용:
이는 명령줄에서 사용자 입력을 읽는 데 선호되는 방법이 되었습니다. 또한 사용자가 입력한 문자를 에코하지 않고 비밀번호와 같은 입력을 읽는 데 사용할 수 있습니다. 형식 문자열 구문을 사용할 수도 있습니다(예: System.out.printf()).
/** * 콘솔 클래스 */public class Sample { public static void main(String[] args) { // 콘솔을 사용하여 사용자로부터 데이터 입력 String name = System.console().readLine(); System.out.println(이름); } }
↥ 맨 위로 돌아가기
javap 명령은 클래스 파일에 있는 필드, 생성자 및 메소드에 대한 정보를 표시합니다. javap 명령(Java Disassembler라고도 함)은 하나 이상의 클래스 파일을 역어셈블합니다.
/** * Java 디스어셈블러 */class Simple { public static void main(String args[]) { System.out.println("Hello World"); } }
cmd> javap Simple.class
산출
".java" 클래스 Simple {에서 컴파일됨 단순한(); 공개 정적 무효 메인(java.lang.String[]); }
↥ 맨 위로 돌아가기
System.out::println
표현식에 대해 설명해주세요. 지정된 표현식은 println()
클래스 System.out
의 정적 메서드에 대한 참조를 전달하는 방법을 보여줍니다.
↥ 맨 위로 돌아가기
스트림은 순차적일 수도 있고 병렬적일 수도 있습니다. 순차 스트림에 대한 작업은 여러 프로세서 스레드를 사용하여 병렬 스트림에서 하나의 프로세서 스레드에서 수행됩니다. 병렬 스트림은 정적 ForkJoinPool.commonPool()
메서드를 통해 공유 스트림 ForkJoinPool
사용합니다. 이 경우 환경이 멀티 코어가 아닌 경우 스트림은 순차적으로 실행됩니다. 실제로 병렬 스트림의 사용은 스트림의 데이터가 여러 부분으로 나누어지고 각 부분이 별도의 프로세서 코어에서 처리되며 결국 이러한 부분이 연결되고 최종 작업이 수행된다는 사실로 축소됩니다. 그들을.
또한 parallelStream()
인터페이스 메서드를 사용하여 Collection Collection
에서 병렬 스트림을 생성할 수도 있습니다.
일반 순차 스트림을 병렬로 만들려면 객체 parallel()
에서 Stream
메서드를 호출해야 합니다. isParallel()
메소드를 사용하면 스트림이 병렬인지 확인할 수 있습니다.
parallel()
및 sequential()
메소드를 사용하면 어떤 작업이 병렬일 수 있고 어떤 작업은 순차일 수 있는지 결정할 수 있습니다. 순차 스트림에서 병렬 스트림을 만들 수도 있고 그 반대의 경우도 가능합니다.
수집 .개울 () .peek ( ... ) // 작업은 순차적입니다. .평행한 () .map ( ... ) // 작업은 병렬로 수행될 수 있습니다. .순차적 () .reduce ( ... ) // 작업이 다시 순차적입니다.
일반적으로 요소는 데이터 소스에 정의된 순서와 동일한 순서로 스트림으로 전송됩니다. 병렬 스트림으로 작업할 때 시스템은 요소의 순서를 유지합니다. 예외는 요소를 무작위 순서로 출력할 수 있는 forEach()
메서드입니다. 그리고 순서를 유지하기 위해서는 forEachOrdered()
메소드를 적용해야 합니다.
병렬 스트림의 성능에 영향을 미칠 수 있는 기준:
데이터 크기 - 데이터가 많을수록 먼저 데이터를 분리한 다음 결합하는 것이 더 어렵습니다.
프로세서 코어 수. 이론적으로 컴퓨터에 코어가 많을수록 프로그램 작동 속도가 빨라집니다. 머신에 코어가 하나인 경우 병렬 스레드를 사용하는 것은 의미가 없습니다.
스트림이 작동하는 데이터 구조가 단순할수록 작업이 더 빠르게 수행됩니다. 예를 들어, ArrayList
의 데이터는 사용하기 쉽습니다. 이 컬렉션의 구조는 관련 없는 데이터의 시퀀스를 가정하기 때문입니다. 그러나 유형 컬렉션 LinkedList
최선의 선택이 아닙니다. 순차 목록에서는 모든 요소가 이전/다음과 연결되어 있기 때문입니다. 그리고 그러한 데이터는 병렬화하기 어렵습니다.
기본 유형을 사용한 작업은 클래스 객체를 사용한 작업보다 빠릅니다.
모든 병렬 스트림은 하나의 ForkJoinPool
로 작동하므로 긴 작업(예: 네트워크 연결)에는 병렬 스트림을 사용하지 않는 것이 좋습니다. 이러한 긴 작업은 사용 가능한 스레드 부족으로 인해 JVM의 모든 병렬 스트림을 중지할 수 있습니다. 수영장 등에서 e. 병렬 스트림은 카운트가 밀리초 단위로 진행되는 짧은 작업에만 사용해야 하며, 카운트가 몇 초 및 분 단위로 진행될 수 있는 작업에는 사용하지 않아야 합니다.
병렬 스트림에 순서를 저장하면 실행 비용이 증가하며, 순서가 중요하지 않은 경우 저장을 비활성화하고 unordered()
중간 작업을 사용하여 생산성을 높일 수 있습니다.
collection.parallelStream() .정렬() .순서없음 () .collect (수집자 .toList ());
↥ 맨 위로 돌아가기
JVM(Java Virtual Machine)은 Java 바이트코드(.class 파일)가 실행될 수 있는 런타임 환경을 제공하는 사양입니다. JVM은 플랫폼입니다. JVM은 "가상" 머신 또는 프로세서 역할을 합니다. Java의 플랫폼 독립성은 대부분 JVM(Java Virtual Machine)으로 구성됩니다. JVM은 플랫폼(운영 체제)의 특정 명령어 길이와 기타 특성을 인식하기 때문에 이를 가능하게 합니다.
JVM은 플랫폼 독립적이지 않습니다. JVM(Java Virtual Machine)은 Java 파일(.Class 파일)을 실행할 수 있는 환경을 제공합니다. 따라서 결국 커널에 따라 다르며 커널은 OS(운영 체제)마다 다릅니다. JVM은 바이트코드를 특정 컴퓨터의 기계어로 변환하고 실제로 해당 기계어 명령을 실행하는 데 사용됩니다.
↥ 맨 위로 돌아가기
JIT(Just-In-Time) 컴파일러는 런타임에 바이트코드를 기본 기계어 코드로 컴파일하여 Java 애플리케이션의 성능을 향상시키는 런타임 환경의 구성 요소입니다.
Java 프로그램은 다양한 컴퓨터 아키텍처에서 JVM에 의해 해석될 수 있는 플랫폼 중립 바이트코드를 포함하는 클래스로 구성됩니다. 런타임 시 JVM은 클래스 파일을 로드하고 각 개별 바이트코드의 의미를 결정하며 적절한 계산을 수행합니다. 해석 중 추가 프로세서 및 메모리 사용량은 Java 애플리케이션이 기본 애플리케이션보다 느리게 수행된다는 것을 의미합니다. JIT 컴파일러는 런타임 시 바이트코드를 기본 기계어 코드로 컴파일하여 Java 프로그램의 성능을 향상시키는 데 도움이 됩니다. JIT 컴파일러는 기본적으로 활성화되어 있습니다. 메소드가 컴파일되면 JVM은 메소드를 해석하는 대신 해당 메소드의 컴파일된 코드를 직접 호출합니다.
↥ 맨 위로 돌아가기
Java ClassLoader 는 Java 클래스를 Java Virtual Machine에 동적으로 로드하는 Java Runtime Environment의 일부입니다. Java 코드는 javac 컴파일러에 의해 클래스 파일로 컴파일되고 JVM은 클래스 파일에 작성된 바이트 코드를 실행하여 Java 프로그램을 실행합니다. ClassLoader는 파일 시스템, 네트워크 또는 기타 소스에서 클래스 파일을 로드하는 역할을 담당합니다.
클래스로더 유형:
1. 부트스트랩 클래스 로더 :
rt.jar 및 기타 핵심 클래스에서 표준 JDK 클래스 파일을 로드합니다. jre/lib/rt.jar에서 클래스 파일을 로드합니다. 예를 들어 java.lang 패키지 클래스입니다.
2. 확장 클래스 로더 :
JDK 확장에서 직접 일반적으로 JAVA_HOME/lib/ext
디렉토리 또는 java.ext.dirs와 같은 다른 디렉토리에서 클래스를 로드합니다.
3. 시스템 클래스 로더 :
CLASSPATH 환경 변수에서 애플리케이션별 클래스를 로드합니다. -cp 또는 classpath 명령줄 옵션을 사용하여 프로그램을 호출하는 동안 설정할 수 있습니다.
↥ 맨 위로 돌아가기
1. JDK :
Java Development Kit는 Java Environment의 핵심 구성 요소이며 Java 프로그램을 컴파일, 디버그 및 실행하는 데 필요한 모든 도구, 실행 파일 및 바이너리를 제공합니다.
2. JVM :
JVM은 바이트 코드를 기계별 코드로 변환하는 역할을 담당합니다. JVM은 플랫폼에 따라 다르며 메모리 관리, 가비지 수집, 보안 등과 같은 핵심 Java 기능을 제공합니다. JVM은 사용자 정의가 가능하며 Java 옵션을 사용하여 이를 사용자 정의할 수 있습니다(예: JVM에 최소 및 최대 메모리 할당). JVM은 기본 운영 체제 및 시스템 하드웨어에 의존하지 않는 인터페이스를 제공하기 때문에 가상이라고 합니다.
2. JRE :
Java Runtime Environment는 Java 프로그램을 실행하기 위한 플랫폼을 제공합니다. JRE는 JVM, Java 바이너리 및 기타 클래스로 구성되어 모든 프로그램을 성공적으로 실행합니다.
↥ 맨 위로 돌아가기
1. 자바 힙 공간:
Java 힙 공간은 Java 런타임에서 객체 및 JRE 클래스 에 메모리를 할당하는 데 사용됩니다. 객체를 생성할 때마다 항상 힙 공간에 생성됩니다.
가비지 수집은 힙 메모리에서 실행되어 참조가 없는 개체가 사용하는 메모리를 해제합니다. 힙 공간에 생성된 모든 객체는 전역적으로 액세스할 수 있으며 애플리케이션 어디에서나 참조할 수 있습니다.
2. 자바 스택 메모리:
Java의 스택은 메소드 , 지역 변수 및 참조 변수를 포함하는 메모리 섹션입니다. 지역 변수는 스택에 생성됩니다.
스택 메모리는 항상 LIFO(Last-In-First-Out) 순서로 참조됩니다. 메서드가 호출될 때마다 해당 메서드에 대한 스택 메모리에 새 블록이 생성되어 로컬 기본 값과 메서드의 다른 개체에 대한 참조를 유지합니다.
메서드가 종료되자마자 블록은 사용되지 않고 다음 메서드에 사용할 수 있게 됩니다. 스택 메모리 크기는 힙 메모리에 비해 매우 작습니다.
차이점:
매개변수 | 스택 메모리 | 힙 공간 |
---|---|---|
애플리케이션 | 스택은 스레드 실행 중에 한 번에 하나씩 부분적으로 사용됩니다. | 전체 애플리케이션은 런타임 중에 힙 공간을 사용합니다. |
크기 | 스택은 OS에 따라 크기 제한이 있으며 일반적으로 힙보다 작습니다. | 힙에는 크기 제한이 없습니다. |
저장 | 힙 공간에 생성된 객체에 대한 기본 변수 및 참조만 저장합니다. | 새로 생성된 모든 객체는 여기에 저장됩니다. |
주문하다 | LIFO(Last-in First-out) 메모리 할당 시스템을 사용하여 액세스됩니다. | 이 메모리는 Young Generation, Old 또는 Tenured Generation, Permanent Generation을 포함한 복잡한 메모리 관리 기술을 통해 액세스됩니다. |
삶 | 스택 메모리는 현재 메서드가 실행되는 동안에만 존재합니다. | 애플리케이션이 실행되는 동안 힙 공간이 존재합니다. |
능률 | 힙에 비해 상대적으로 할당 속도가 훨씬 빠릅니다. | 스택에 비해 할당 속도가 느림 |
할당/할당 해제 | 이 메모리는 메소드가 각각 호출되고 반환될 때 자동으로 할당 및 할당 해제됩니다. | 힙 공간은 새 객체가 생성될 때 할당되고 더 이상 참조되지 않을 때 Gargabe Collector에 의해 할당이 취소됩니다. |
↥ 맨 위로 돌아가기
JVM은 Java 바이트코드를 가져와서 바이트 코드(한 줄씩)를 기계가 이해할 수 있는 코드로 변환하는 프로그램입니다. JVM은 몇 가지 특정 유형의 작업을 수행합니다.
코드 로딩
코드 확인
코드 실행
사용자에게 런타임 환경을 제공합니다.
JVM이 할당하는 메모리 영역 유형:
1. 클래스로더 : 클래스로더는 클래스 파일을 로드하는 데 사용되는 JVM의 하위 시스템입니다.
2. 클래스(메소드) 영역 : 클래스(메소드) 영역에는 런타임 상수 풀, 필드 및 메소드 데이터, 메소드 코드 등 클래스별 구조가 저장됩니다.
3. 힙(Heap ) : 객체가 할당되는 런타임 데이터 영역입니다.
4. 스택 : Java 스택은 프레임을 저장합니다. 로컬 변수와 부분 결과를 보유하고 메소드 호출 및 반환에 참여합니다. 각 스레드에는 스레드와 동시에 생성된 전용 JVM 스택이 있습니다.
5. 프로그램 카운터 레지스터 : PC(프로그램 카운터) 레지스터. 현재 실행 중인 JVM(Java Virtual Machine) 명령어의 주소를 포함합니다.
6. 네이티브 메서드 스택(Native Method Stack ) : 애플리케이션에서 사용되는 모든 네이티브 메서드가 포함되어 있습니다.
↥ 맨 위로 돌아가기
기본 데이터 유형을 동등한 래퍼 유형으로 자동 변환하는 것을 박싱(boxing)이라고 하며 반대 작업을 박싱 해제(unboxing)라고 합니다.
예: 오토박싱
/** * 오토박싱 */class BoxingExample { public static void main(String args[]) { int a = 50; 정수 a2 = 새로운 정수(a); // 복싱 정수 a3 = 5; // 복싱 System.out.println(a2 + " " + a3); } }
예: 언박싱
/** * 언박싱 */class UnboxingExample { public static void main(String args[]) { Integer i = new Integer(50); int a = i; System.out.println(a); } }
↥ 맨 위로 돌아가기
1. 일시적:
임시 수정자는 클래스의 인스턴스를 직렬화할 때 해당 필드를 제외하도록 Java 객체 직렬화 하위 시스템에 지시합니다. 그런 다음 개체가 역직렬화되면 필드가 기본값으로 초기화됩니다. 즉, 참조 유형의 경우 null이고 기본 유형의 경우 0 또는 false입니다.
예:
/** * Transient */public Transient int 제한 = 55; // 지속되지 않습니다.public int b; // 지속됩니다
2. 휘발성:
휘발성 수정자는 필드에 대한 쓰기가 항상 메모리에 동기적으로 플러시되어야 하고 필드 읽기는 항상 메모리에서 읽어야 함을 JVM에 알립니다. 즉, 휘발성으로 표시된 필드는 기본 또는 표준 라이브러리 기반 동기화를 사용하지 않고도 다중 스레드 응용 프로그램에서 안전하게 액세스하고 업데이트할 수 있습니다.
예:
/** * Volatile */public class MyRunnable은 Runnable을 구현합니다. { private 휘발성 boolean active; 공개 무효 실행() { 활성 = true; 동안 (활성) { } } 공개 무효 중지() { 활성 = 거짓; } }
↥ 맨 위로 돌아가기
어설션을 사용하면 프로그램에서 이루어진 모든 가정의 정확성을 테스트할 수 있습니다. 어설션은 Java의 Assert 문을 사용하여 수행됩니다.
어설션을 실행하는 동안 해당 내용이 참인 것으로 간주됩니다. 실패하면 JVM은 AssertionError
라는 오류를 발생시킵니다. 주로 개발 중 테스트 목적으로 사용됩니다.
Assert 문은 부울 표현식과 함께 사용되며 두 가지 방법으로 작성할 수 있습니다.
// 첫 번째 방법은 표현을 주장;// 두 번째 방법은 표현1을 주장 : 표현2;
예:
/** * 주장 */public class 예시 { public static void main(String[] args) { int age = 14; 연령 <= 18 주장 : "투표할 수 없습니다"; System.out.println("투표자의 나이는 " + age); } }
↥ 맨 위로 돌아가기
1. 최종 변수:
최종 변수는 상수일 뿐입니다. 일단 초기화되면 최종 변수의 값을 변경할 수 없습니다.
예:
/** * 최종 변수 */class Demo { final int MAX_VALUE = 99; void myMethod() { MAX_VALUE = 101; } public static void main(String args[]) { Demo obj = new Demo(); obj.myMethod(); } }
산출
스레드 "main" java.lang.Error의 예외: 해결되지 않은 컴파일 문제: 최종 필드 Demo.MAX_VALUE는 Beginnersbook.com.Demo.myMethod(Details.java:6), Beginnersbook.com.Demo.main(Details.java:10)에서 할당할 수 없습니다.
2. 빈 최종 변수:
선언 시 초기화되지 않은 최종 변수를 빈 최종 변수라고 합니다. 클래스 생성자에서 빈 최종 변수를 초기화해야 합니다. 그렇지 않으면 컴파일 오류가 발생합니다(오류: variable MAX_VALUE might not have been initialized
).
예:
/** * 빈 최종 변수 */class Demo { // 빈 최종 변수 final int MAX_VALUE; Demo() { // 생성자에서 초기화되어야 합니다. MAX_VALUE = 100; } void myMethod() { System.out.println(MAX_VALUE); } public static void main(String args[]) { Demo obj = new Demo(); obj.myMethod(); } }
산출
100
3. 최종 방법:
최종 메서드는 재정의될 수 없습니다. 이는 하위 클래스가 문제 없이 상위 클래스의 최종 메서드를 호출할 수 있지만 이를 재정의할 수는 없음을 의미합니다.
예:
/** * 최종 메소드 */class XYZ { final void 데모() { System.out.println("XYZ 클래스 메소드"); } }class ABC 확장 XYZ { void 데모() { System.out.println("ABC 클래스 메서드"); } 공개 정적 void main(String args[]) { ABC obj = new ABC(); obj.demo(); } }
↥ 맨 위로 돌아가기
기본 유형 또는 문자열이 상수로 정의되고 값이 컴파일 타임에 알려진 경우 컴파일러는 코드의 모든 위치에서 상수 이름을 해당 값으로 바꿉니다. 이를 컴파일 타임 상수라고 합니다.
컴파일 시간 상수는 다음과 같아야 합니다.
결승선언
기본 또는 문자열
선언 내에서 초기화됨
상수 표현식으로 초기화됨
컴파일러는 해당 값을 미리 알고 런타임 중에 변경할 수 없다는 것을 알고 있기 때문에 컴파일 타임에 실제 값으로 대체됩니다.
개인 최종 int x = 10;
↥ 맨 위로 돌아가기
액세스 지정자/수정자는 클래스, 생성자, 변수, 메서드 또는 데이터 멤버의 범위를 제한하는 데 도움이 됩니다.
Java에는 네 가지 유형의 액세스 수정자가 있습니다.
default
– 키워드가 필요하지 않습니다. 클래스, 생성자, 변수, 메서드 또는 데이터 멤버가 액세스 지정자 없이 선언되면 기본 액세스 범위를 갖게 됩니다. 즉, 동일한 패키지 내에서만 액세스할 수 있습니다.
private
- private 으로 선언되면 접근 범위는 둘러싸는 클래스 내로 제한됩니다.
protected
- protocted로 선언되면 액세스 범위는 포함 클래스, 동일한 패키지의 하위 클래스 및 다른 패키지로 제한됩니다.
public
- 공개로 선언되면 프로그램의 모든 곳에서 액세스할 수 있습니다.
... /* 데이터 멤버 변수 */ String firstName="Pradeep"; /* 기본 범위 */ protected isValid=true; /* 보호 범위 */ private String otp="AB0392"; /* 개인 범위 */ public int id = 12334; /* 공개 범위 */ ... ... /* 데이터 멤버 함수 */ String getFirstName(){ return this.firstName; } /* 기본 범위 */ protected boolean getStatus(){this.isValid;} /* 보호 범위 */ private void generateOtp(){ /* 개인 범위 */ this.otp = this.hashCode() << 16; }; public int getId(){ return this.id; } /* 공개 범위 */ ... .../* 내부 클래스 */ 클래스 A{} /* 기본 범위 */ 보호 클래스 B{} /* 보호 범위 */ 비공개 클래스 C{} /* 비공개 범위 */ 공개 클래스 D{} /* 공개 범위 */ ...
↥ 맨 위로 돌아가기
Java에서 모든 비정적 메소드는 기본적으로 가상 함수 입니다. 재정의할 수 없는 final
키워드로 표시된 메서드와 상속되지 않는 private methods
만 가상이 아닙니다.
예: 인터페이스가 있는 가상 기능
/** * 인터페이스의 함수는 재정의되도록 설계되었기 때문에 * applyBrakes() 함수는 가상입니다. **/인터페이스 자전거 { void applyBrakes(); }class ACMEBicycle Implements Bicycle { public void applyBrakes() { // 여기서는 applyBrakes()를 구현합니다. System.out.println("Brakesapped"); // 기능 } }
↥ 맨 위로 돌아가기
기본 메소드는 구현이 C/C++와 같은 다른 프로그래밍 언어로도 작성된 Java 메소드(인스턴스 메소드 또는 클래스 메소드)입니다. 게다가 네이티브로 표시된 메서드는 본문을 가질 수 없으며 세미콜론으로 끝나야 합니다.
Main.java:
공개 클래스 Main { 공개 네이티브 int intMethod(int i); public static void main(String[] args) { System.loadLibrary("메인"); System.out.println(new Main().intMethod(2)); } }
메인.c:
#include <jni.h>#include "Main.h"JNIEXPORT jint JNICALL Java_Main_intMethod( JNIEnv *env, jobject obj, jint i) { return i * i; }
컴파일 및 실행:
javac Main.javajavah -jni Maingcc -shared -fpic -o libMain.so -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux Main.cjava -Djava.library.path=. 기본
산출
4
↥ 맨 위로 돌아가기
메소드가 정적으로 선언되면 해당 메소드는 클래스의 객체에 속하지 않고 클래스의 멤버가 됩니다. 클래스의 객체를 생성하지 않고도 호출할 수 있습니다. 정적 메서드에는 클래스의 정적 데이터 멤버에 액세스할 수 있는 기능도 있습니다.
정적 메서드에는 몇 가지 제한 사항이 있습니다.
정적 메서드는 비정적 데이터 멤버를 사용하거나 비정적 메서드를 직접 호출할 수 없습니다.
this
및 super
정적 컨텍스트에서 사용할 수 없습니다.
정적 메소드는 정적 유형 데이터(정적 유형 인스턴스 변수)에만 액세스할 수 있습니다.
정적 메서드를 호출하기 위해 클래스의 개체를 만들 필요가 없습니다.
하위 클래스에서는 정적 메서드를 재정의할 수 없습니다.
예:
/** * 정적 메서드 */class Parent { static void display() { System.out.println("Super class"); } }public class 예제 Extensions Parent { void display() // display() 재정의 시도 { System.out.println("Sub class"); } 공개 정적 무효 메인(String[] args) { 상위 obj = new 예제(); obj.display(); } }
이로 인해 컴파일 시간 오류가 발생합니다. 출력은 다음과 같습니다 -
예.java:10: 오류: 예제의 디스플레이()는 Parentvoid의 디스플레이()를 재정의할 수 없습니다. 디스플레이() // 디스플레이()를 재정의하려고 합니다. ^재정의된 메서드는 static1 오류입니다.
↥ 맨 위로 돌아가기
람다 표현식을 사용하는 구조와 특징은 무엇인가요? 람다는 별도의 변수로 분리된 다음 프로그램의 다양한 위치에서 반복적으로 호출될 수 있는 명령 집합입니다.
람다 식의 기본은 ->
화살표를 나타내는 람다 연산자 입니다. 이 연산자는 람다 식을 두 부분으로 나눕니다. 왼쪽에는 식 매개 변수 목록이 포함되고 오른쪽에는 실제로 모든 작업이 수행되는 람다 식의 본문이 표시됩니다.
람다 식은 단독으로 실행되지 않지만 기능적 인터페이스에 정의된 메서드의 구현을 형성합니다. 기능적 인터페이스에는 구현 없이 단 하나의 메서드만 포함되어야 한다는 것이 중요합니다.
인터페이스 작동 가능 { int 계산( int x , int y ); }public static void main ( String [] args) { 작동 가능한 연산 = (x, y) - > x + y; int 결과 = 연산.계산(10, 20); System.out.println(결과); // 30 }
실제로 람다 표현식은 이전에 Java에서 사용되었던 내부 익명 클래스의 축약형입니다.
지연 실행 람다 식 - 프로그램의 한 위치에서 한 번 정의되며 필요한 경우 프로그램의 어느 위치에서나 횟수에 관계없이 호출됩니다.
람다 식의 매개 변수는 기능적 인터페이스 메서드의 매개 변수와 유형이 일치해야 합니다.
연산 = ( int x, int y) - > x + y;// 람다 표현식 자체를 작성할 때 매개변수 유형을 지정하지 않는 것이 허용됩니다: (x, y) - > x + y;// 메소드가 매개 변수를 허용하지 않으면 빈 대괄호가 작성됩니다. 예: () - > 30 + 20 ;// 메서드가 매개 변수를 하나만 허용하는 경우 대괄호를 생략할 수 있습니다. n - > n * n;
값을 반환하는 데 후행 람다 식은 필요하지 않습니다.
인터페이스 인쇄 가능 { void print( String s ); } public static void main ( String [] args) { 인쇄 가능한 프린터 = s - > System.out.println(s); print.print("안녕하세요, 세계"); }// _ 블록 람다 - 표현식_은 중괄호로 묶입니다. 모듈식 람다 표현식은 중첩된 블록, 루프, if 디자인 ` ` 스위치 문 ', 변수 생성 등에서 사용할 수 있습니다. 디. 람다 - 표현식이 값을 반환해야 함을 차단하는 경우 '문 반환 문'을 명시적으로 적용합니다. 작동 가능한 작업 = ( int x, int y) - > { if (y == 0 ) { 반환 0 ; } else { x / y를 반환합니다. } };
람다 표현식을 메서드 매개변수로 전달
인터페이스 조건 { 부울 isAppropriate ( int n ); }private static int sum ( int [] 숫자, 조건 조건) { int result = 0 ; for ( int i : 숫자) { if (condition.isAppropriate(i)) { 결과 + = i; } } 결과를 반환합니다. }public static void main ( String [] args) { System.out.println(sum ( new int [] { 0 , 1 , 0 , 3 , 0 , 5 , 0 , 7 , 0 , 9 }, (n) - > 엔! = 0)); }
↥ 맨 위로 돌아가기
람다 식에서 외부 범위 변수에 액세스하는 것은 익명 개체에서 액세스하는 것과 매우 유사합니다.
불변(실질적으로 최종 - 최종으로 표시될 필요는 없음) 지역 변수;
클래스 필드
정적 변수.
구현된 기능 인터페이스의 기본 메서드는 람다 식 내에서 액세스할 수 없습니다.
↥ 맨 위로 돌아가기
클래스에 존재하는 메서드가 이미 필요한 모든 작업을 수행하는 경우 메서드 참조 메커니즘(메서드 참조)을 사용하여 이 메서드를 직접 전달할 수 있습니다. 결과는 이 메서드를 호출하는 람다 식을 정의하는 경우와 정확히 동일합니다.
예:
개인 인터페이스 측정 가능 { 공개 int 길이(문자열 문자열); }public static void main(String [] args) { 측정 가능 a = String::length; System.out.println(a.length("abc")); }
메서드 참조는 람다 식을 사용하는 것보다 잠재적으로 더 효율적입니다. 또한 컴파일러에 유형에 대한 더 나은 정보를 제공하며 기존 메서드에 대한 참조 사용과 람다 식 사용 중에서 선택할 수 있는 경우 항상 메서드 참조를 사용해야 합니다.
↥ 맨 위로 돌아가기
정적 방법에 대해;
인스턴스별 방법;
생성자에게.
↥ 맨 위로 돌아가기
중첩된 내부 클래스는 외부 클래스의 모든 개인 인스턴스 변수에 액세스할 수 있습니다. 다른 인스턴스 변수와 마찬가지로 접근 한정자 private, protected, public 및 default 한정자를 가질 수 있습니다.
예:
/** * 내부 클래스 */class 외부 { 클래스 내부 { 공개 무효 쇼() { System.out.println("중첩 클래스 메서드에서"); } } } 클래스 메인 { 공개 정적 무효 메인(String[] args) { Outer.Inner in = new Outer().new Inner(); in.show(); } }
서브클래스는 슈퍼클래스로부터 메소드를 상속받는 클래스입니다.
예:
/** * 하위 클래스 */class Car { //...} 클래스 HybridCar는 Car { //...}를 확장합니다.
↥ 맨 위로 돌아가기
1. 정적 클래스 로딩:
new
키워드를 사용하여 객체와 인스턴스를 생성하는 것을 정적 클래스 로딩이라고 합니다. 클래스 정의 검색 및 객체 인스턴스화는 컴파일 타임에 수행됩니다.
예:
/** * 정적 클래스 로딩 */class TestClass { public static void main(String args[]) { TestClass tc = new TestClass(); } }
2. 동적 클래스 로딩:
로딩 클래스는 Class.forName()
메소드를 사용합니다. 동적 클래스 로딩은 컴파일 타임에 클래스 이름을 알 수 없을 때 수행됩니다.
예:
/** * 동적 클래스 로딩 */Class.forName (String className);
↥ 맨 위로 돌아가기
1. 런타임 클래스:
java.lang.Runtime 클래스는 Object 클래스의 하위 클래스로, Java 런타임 시스템에 대한 액세스를 제공합니다. 메모리 가용성, 가비지 수집기 호출 등과 같은 런타임 정보
예:
/** * 런타임 클래스 */public class RuntimeTest { static class Message extends Thread { public void run() { System.out.println(" Exit"); } } public static void main(String[] args) { try { Runtime.getRuntime().addShutdownHook(new Message()); System.out.println(" 프로그램이 시작되었습니다..."); System.out.println(" 5초 동안 기다리십시오..."); Thread.sleep(5000); System.out.println(" 프로그램이 종료되었습니다..."); } catch(예외 e) { e.printStackTrace(); } } }
2. 시스템 클래스:
System 클래스의 목적은 시스템 리소스에 대한 액세스를 제공하는 것입니다. 표준 입력, 대립 출력, 오류 출력 스트림, Millis의 현재 시간, 응용 프로그램 종료 등에 대한 접근성이 포함되어 있습니다.
↥ 위로 돌아갑니다
1. 새로운 키워드 사용 :
myObject Object = new myObject ();
2. class.forname () 사용 사용
myObject Object = (myObject) class.forname ( "subin.rnd.myObject"). newInstance ();
3. Clone () 사용 :
myObject OtherObject = new myObject (); myObject Object = (myObject) otherObject.clone ();
4. 객체 사막화 사용 :
ObjectInputStream instream = new ObjectInputStream (aninputStream); myObject Object = (myObject) instream.ReadObject ();
↥ 위로 돌아갑니다
불변의 물체는 변하지 않는 대상입니다. Java 불변의 물체는 모든 필드가 내부의 개인 최종 필드 여야합니다. 세터를 구현해서는 안됩니다. 모든 단일 필드에 값을 취하는 생성자가 필요합니다.
불변의 대상 만들기 :
세터 메소드를 추가하지 마십시오
모든 필드를 최종적이고 개인화하십시오
필드가 변한 객체 인 경우 getter 방법을 위해 방어 사본을 만듭니다.
생성자에게 전달 된 변이 가능한 객체를 필드에 할당 해야하는 경우 방어 사본을 생성해야합니다.
서브 클래스가 메소드를 무시하는 것을 허용하지 마십시오.
/** * 불변의 대상 */public class datecontainer {개인 최종 날짜 날짜; public datecontainer () {this.date = new Date (); } public date getDate () {return new Date (date.getTime ()); } }
↥ 위로 돌아갑니다
불변의 클래스는 일단 객체가 만들어지면 내용을 변경할 수 없음을 의미합니다. Java에서는 모든 래퍼 클래스 (정수, 부울, 바이트, 짧음) 및 문자열 클래스는 불변입니다.
불변의 수업을 만드는 규칙 :
수업은 최종으로 선언되어야합니다
수업의 데이터 구성원은 최종으로 선언해야합니다.
매개 변수화 된 생성자
그것의 모든 변수에 대한 getter 메소드
세터가 없습니다
/** * 불변의 클래스 */공개 최종 클래스 직원 {Final String PancardNumber; 공공 직원 (String PancardNumber) {this.pancardNumber = PancardNumber; } public String getPancardNumber () {return PancardNumber; } }
↥ 위로 돌아갑니다
부트 스트랩 클래스 로더는 rt.jar 의 표준 JDK 클래스 파일을로드하는 데 반복 가능하며 Java의 모든 클래스 로더의 부모입니다. Java에는 세 가지 유형의 내장 클래스 로더가 있습니다.
1. 부트 스트랩 클래스 로더 : JDK 내부 클래스를로드하고 일반적으로 rt.jar 및 기타 핵심 클래스를 Java.lang.* 패키지 클래스와 같은로드합니다.
2. Extensions 클래스 로더 : JDK Extensions 디렉토리, 일반적으로 $ java_home/lib/ext 디렉토리에서 클래스를로드합니다.
3. 시스템 클래스 로더 : -cp 또는 -classpath 명령 줄 옵션을 사용하여 프로그램을 호출하는 동안 설정할 수있는 현재 클래스 경로에서 클래스를로드합니다.
/** * 클래스 로더 */import java.util.logging.level; import java.util.logging.logger; public classloadertest {public static void main (String args []) {try {//이 클래스 시스템의 클래스 로더 인쇄기 인쇄 .out.println ( "클래스 로더 :" + classloaderTest.class.getClassLoader ()); // Extension Class Loader Class.forname을 사용 하여이 클래스를 다시로드하려고 시도합니다 ( "명시 적으로로드 클래스", true, classloaderTest.class.getClassLoader (). getParent ()); } catch (classNotFoundException ex) {logger.getLogger (classLoaderTest.class.getName ()). log (level.severe, null, ex); } } }
↥ 위로 돌아갑니다
자바에서 객체를 만드는 다른 방법
새로운 키워드 사용 :
클래스 ObjectCreationExample {문자열 소유자; } public class mainclass {public static void main (string [] args) {// 여기 우리는 새로운 keywordobjectCreationExample obj = new ObjectringCreationExample ()을 사용하여 JBT의 객체를 생성하고 있습니다. } }
새 인스턴스 사용 (반사)
createobjectClass {static int j = 10; createObjectClass () {i = j ++; } int i; @OverRidePublic String toString () {return "value :" + i; } } class mainclass {public static void main (string [] args) {try {class cls = class.forname ( "createObjectClass"); createObjectClass obj = (CreateObjectClass) cls.newInstance (); createObclass obj1 = (CreateObjectClass) cls.newinstance (); system.out.println (obj); system.out.println (obj1); } catch (classNotFoundException e) {e.printstacktrace (); } catch (InstantiationException e) {e.printstacktrace (); } catch (delegalAccessException e) {e.printstacktrace (); } } }
클론 사용 :
CreateObjectWithClone 클래스 클로닝 가능 {@OverRideProtected Object Clone ()는 ClonenOntSupportedException {return super.clone (); } int i; static int j = 10; createObjectWithClone () {i = j ++; } @OverRidePublic String toString () {return "value of i :" + i; } } class mainclass {public static void main (string [] args) {createObjectWithClone obj1 = new CreateObjectWithClone (); System.out.println (obj1); try {createObjectWithClone obj2 = (CreateObjectWithClone) obj1.clone (); System.out. println (obj2); } catch (clonenotsupportedException e) {e.printstacktrace (); } } }
클래스 로더 사용
createobjectwithclassloader {static int j = 10; createObjectWithClassLoader () {i = j ++; } int i; @OverRidePublic String toString () {return "value :" + i; } } public class mainclass {public static void main (String [] args) {createObjectWithClassLoader obj = null; try {obj = (createObjectWithClassLoader) new mainclass (). getClass () .getClassLoader (). loadClass ( "CreateObjectWithClassLoader"). NewInstance (); // 완전히 자격을 갖춘 클래스 이름을 사용해야합니다. } catch (InstantiationException e) {e.printstacktrace (); } catch (delegalAccessException e) {e.printstacktrace (); } catch (classNotFoundException e) {e.printstacktrace (); } system.out.println (obj); } }
↥ 위로 돌아갑니다
객체 클래스는 기본적으로 Java의 모든 클래스의 부모 클래스입니다.
방법 | 설명 |
---|---|
공개 최종 클래스 getClass () | 이 개체의 클래스 클래스 객체를 반환합니다. 클래스 클래스는이 클래스의 메타 데이터를 얻는 데 더 많이 사용될 수 있습니다. |
public int hashcode () | 이 개체의 해시 코드 번호를 반환합니다. |
Public Boolean Equals (Object OBJ) | 주어진 객체를이 객체와 비교합니다. |
보호 된 객체 클론 ()은 ClonenotsupportedException을 던졌습니다 | 이 객체의 정확한 사본 (클론)을 생성하고 반환합니다. |
공개 문자열 tostring () | 이 개체의 문자열 표현을 반환합니다. |
공개 최종 무효 Notify () | 이 개체의 모니터를 기다리는 단일 스레드를 깨우십시오. |
공개 최종 void notifyall () | 이 개체의 모니터를 기다리는 모든 스레드를 깨우십시오. |
공개 최종 무효 대기 (긴 타임 아웃)는 중단 된 예고를 던졌습니다 | 다른 스레드가 알 수있을 때까지 (notify () 또는 notifyall () 메소드를 호출 할 때까지 현재 스레드가 지정된 밀리 초에 대기하게됩니다. |
공개 최종 무효 대기 (긴 타임 아웃, INT NANOS)는 중단 예고를 던졌습니다 | 다른 스레드가 알림 (notify () 또는 notifyall () 메소드를 호출 할 때까지 현재 스레드가 지정된 밀리 초 및 나노초를 기다릴 수 있습니다. |
Public Final Void Wait ()는 InterruptedException을 던졌습니다 | 다른 스레드가 알 수있을 때까지 (notify () 또는 notifyall () 메소드를 호출 할 때까지 현재 스레드가 대기를합니다. |
보호 된 void finalize () 던지기 가능 | 물체가 수집되기 전에 쓰레기 수집가에 의해 호출됩니다. |
↥ 위로 돌아갑니다
선택적 값 Optional
은 값 null
을 포함하거나 포함하지 않을 수있는 객체의 컨테이너입니다. 이러한 포장지는 편리한 예방 수단입니다