1. 자바 가상 머신이란 무엇인가요? Java를 "플랫폼 독립적 프로그래밍 언어"라고 부르는 이유는 무엇입니까?
(더 관련 있는 면접 질문 추천: java 면접 질문 및 답변)
Java Virtual Machine은 바이트코드 파일(.class)을 실행하는 가상 머신 프로세스입니다. . Java 소스 프로그램(.java)은 컴파일러에 의해 바이트코드 파일(.class)로 컴파일됩니다. 그런 다음 바이트코드 파일은 Java 가상 머신에 의해 기계어 코드로 해석됩니다(다른 플랫폼의 기계어 코드는 다릅니다). 기계어 코드를 사용하여 하드웨어와 운영 체제를 작동합니다. 다양한 플랫폼에는 다양한 JVM이 장착되어 있으므로 동일한 .class 파일을 다양한 플랫폼에 필요한 기계어 코드로 해석할 수 있습니다. Java가 플랫폼 독립적인 프로그래밍 언어라고 불리는 것은 바로 JVM의 존재 때문입니다.
2. JDK와 JRE의 차이점은 무엇인가요?
JDK(Java Development Kit)는 개발자가 Java 애플리케이션을 개발, 컴파일 및 실행할 수 있도록 하는 JRE, 컴파일러 및 기타 도구(예: JavaDoc, Java 디버거)를 포함하는 완전한 Java 소프트웨어 개발 패키지입니다. 자바 런타임 환경(JRE). 여기에는 Java 가상 머신, Java 코어 클래스 라이브러리 및 지원 파일이 포함됩니다. 개발 도구(JDK), 컴파일러, 디버거 및 기타 도구는 포함되지 않습니다.
3. "정적" 키워드는 무엇을 의미하나요? Java에서 개인 또는 정적 메소드를 대체할 수 있습니까?
"정적" 키워드는 멤버 변수나 멤버 메서드가 속한 클래스의 인스턴스 변수 없이 액세스할 수 있음을 나타냅니다.
Java의 정적 메서드는 메서드 재정의가 런타임 시 동적 바인딩을 기반으로 하는 반면 정적 메서드는 컴파일 시 정적으로 바인딩되므로 재정의할 수 없습니다. 정적 메서드는 클래스의 인스턴스와 관련이 없으므로 개념적으로는 적용되지 않습니다. 프라이빗 변수와 메서드는 현재 클래스에서만 사용할 수 있으므로 프라이빗 메서드는 Java에서 재정의될 수 없습니다. 다른 클래스가 현재 클래스를 상속하는 경우 프라이빗 변수나 메서드에 액세스할 수 없으며 물론 재정의될 수도 없습니다.
4. 정적 환경에서 비정적 변수에 액세스할 수 있나요?
정적 변수는 Java의 클래스에 속하며 해당 값은 모든 인스턴스에서 동일합니다. JVM(Java Virtual Machine)이 클래스를 로드하면 정적 변수가 초기화됩니다. 코드에서 인스턴스를 사용하지 않고 비정적 변수에 액세스하려고 하면 해당 변수가 아직 생성되지 않았고 인스턴스와 연결되지 않았기 때문에 컴파일러에서 오류를 보고합니다.
5.Java에서 지원하는 데이터 유형은 무엇인가요? 자동 개봉박스란?
Java는 두 가지 유형의 데이터를 지원합니다. 하나는 byte, char, short, boolean, int, long, float, double을 포함한 기본 데이터 유형이고, 다른 하나는 String 등과 같은 참조 유형입니다. 객체 참조, JVM의 가상 스택은 객체의 주소를 저장하고, 생성된 객체는 실제로 힙에 해당 주소를 통해 객체를 찾는 과정이 참조 유형입니다. Autoboxing은 Java 컴파일러에서 기본 데이터 유형과 해당 객체 패키징 유형 간의 변환, 즉 int를 Integer로 변환하는 것입니다. 자동 unboxing은 해당 메소드를 호출하여 Integer를 int로 변환하는 프로세스입니다.
6.Java에서 메소드 오버라이딩과 메소드 오버로딩은 무엇을 의미하나요?
Java의 메서드 오버로드는 동일한 클래스에 있는 두 개 이상의 메서드가 메서드 이름은 같지만 매개변수가 다를 때 발생합니다. 재정의는 클래스의 다형성을 나타냅니다. 메소드 오버라이딩(Method Overriding)은 하위 클래스가 상위 클래스의 메소드를 재정의하는 것을 의미합니다. 메서드 재정의에는 메서드 이름, 매개변수 목록 및 반환 유형이 동일해야 합니다. 재정의자는 재정의하는 메서드에 대한 액세스를 제한할 수 없습니다. Java에서는 하위 클래스가 상위 클래스의 메서드를 상속할 수 있으므로 동일한 메서드를 다시 작성할 필요가 없습니다. 그러나 때로는 하위 클래스가 상위 클래스의 메서드를 변경하지 않고 상속하기를 원하지 않지만 특정 수정을 원하므로 메서드 재작성이 사용됩니다. 메서드 재정의는 메서드 덮어쓰기라고도 합니다.
7.Java의 생성자 메서드란 무엇인가요? 생성자 오버로딩이란 무엇입니까? 복사 생성자란 무엇입니까?
새 객체가 생성되면 생성자가 호출됩니다. 모든 클래스에는 생성자 메서드가 있습니다. 프로그래머가 클래스에 대한 생성자를 제공하지 않으면 Java 컴파일러는 클래스에 대한 기본 생성자를 만듭니다. Java의 생성자 오버로딩과 메서드 오버로딩은 매우 유사합니다. 하나의 클래스에 대해 여러 생성자를 만들 수 있습니다. 각 생성자에는 고유한 매개변수 목록이 있어야 합니다. Java는 복사 생성자를 지원하지 않습니다. 생성자를 직접 작성하지 않으면 Java는 기본 복사 생성자를 생성하지 않습니다.
8. Java는 다중 상속을 지원하나요?
Java의 클래스는 다중 상속을 지원하지 않고 단일 상속만 지원합니다(즉, 클래스에는 상위 클래스가 하나만 있음). 그러나 Java의 인터페이스는 다중 상속을 지원합니다. 즉, 하위 인터페이스는 여러 상위 인터페이스를 가질 수 있습니다. (인터페이스의 기능은 객체의 기능을 확장하는 것입니다. 하위 인터페이스는 여러 상위 인터페이스를 상속합니다. 이는 하위 인터페이스가 여러 기능을 확장함을 나타냅니다. 클래스가 인터페이스를 구현할 때 클래스는 해당 기능을 확장합니다.)
9. 인터페이스와 추상 클래스의 차이점은 무엇인가요?
디자인 수준에서 추상화는 클래스의 추상화이고, 인터페이스는 동작의 추상화이자 동작의 사양입니다.
Java는 추상 클래스 및 인터페이스 생성을 제공하고 지원합니다. 이들 구현에는 공통점이 있지만 차이점은 다음과 같습니다.
인터페이스의 모든 메소드는 암시적으로 추상적입니다. 추상 클래스는 추상 메서드와 비추상 메서드를 모두 포함할 수 있습니다. 클래스는 많은 인터페이스를 구현할 수 있지만 하나의 추상 클래스만 상속할 수 있습니다. 물론 이 경우 클래스는 추상 클래스와 인터페이스에서 선언된 모든 메서드를 구현할 필요가 없습니다. 이 경우 클래스는 추상으로 선언되어야 합니다. 추상 클래스는 인터페이스 메소드 구현을 제공하지 않고 인터페이스를 구현할 수 있습니다. Java 인터페이스에 선언된 변수는 기본적으로 최종입니다. 추상 클래스에는 최종이 아닌 변수가 포함될 수 있습니다. Java 인터페이스의 멤버 함수는 기본적으로 공개됩니다. 추상 클래스의 멤버 함수는 비공개, 보호 또는 공개일 수 있습니다. 인터페이스는 완전히 추상적이며 인스턴스화할 수 없습니다. 추상 클래스는 인스턴스화할 수 없지만 기본 메서드가 포함되어 있으면 호출할 수 있습니다.
JDK8의 추상 클래스와 인터페이스의 차이점을 참고할 수도 있습니다.
10. 값에 의한 전달과 참조에 의한 전달이란 무엇인가요?
일반적으로 Java에서의 전송은 값에 의한 것이라고 믿어집니다. Java에서 인스턴스 객체의 전송은 참조에 의한 것입니다.
값으로 전달하는 것은 기본 변수에 대한 것이며, 전달되는 것은 변수의 복사본이며, 참조에 의한 전달은 일반적으로 객체 유형의 변수에 대한 것입니다. 주소. 원본 개체 자체가 아닙니다.
11. 프로세스와 스레드의 차이점은 무엇인가요?
프로세스는 실행되는 애플리케이션으로, 프로그램의 동적 형태이며, CPU, 메모리 등의 자원을 차지하는 기본 단위입니다. 또한 프로세스는 서로 독립적이며 프로세스 실행 중에 통신이 어렵습니다. 스레드는 프로세스 내의 실행 순서로 특정 프로세스에 속하며, 프로세스는 여러 스레드를 가질 수 있으며 스레드는 메모리 영역을 공유합니다. 통신 비교 편리하게도 이러한 프로세스의 스레드 항목 실행 순서는 응용 프로그램에 의해 제어됩니다.
12. 스레드를 만드는 방법에는 몇 가지가 있나요? 어느 쪽을 선호하시나요? 왜?
스레드를 만드는 방법에는 네 가지가 있습니다.
Thread 클래스를 상속하고 Runnable 인터페이스를 구현합니다. 애플리케이션은 Executor 프레임워크를 사용하여 Callable 인터페이스를 구현할 수 있습니다.
Runnable 인터페이스를 구현하는 것은 Thread 클래스를 상속할 필요가 없기 때문에 더 많이 사용됩니다. 애플리케이션 설계에서 다른 객체가 상속된 경우 다중 상속이 필요하며(Java는 다중 상속을 지원하지 않음) 인터페이스만 구현할 수 있습니다. 동시에 스레드 풀은 매우 효율적이고 구현 및 사용이 쉽습니다.
13. 사용 가능한 여러 스레드 상태를 간략하게 설명합니다.
New(새): 새 스레드 개체가 생성됩니다. 실행 가능: 스레드 개체가 생성된 후 다른 스레드(예: 기본 스레드)가 개체의 start() 메서드를 호출합니다. 이 상태의 스레드는 실행 가능한 스레드 풀에 위치하며 CPU 사용 권한을 얻기 위해 스레드 스케줄링에 의해 선택되기를 기다리고 있습니다. 실행 중: 실행 가능 상태의 스레드는 CPU 타임슬라이스(timeslice)를 획득하고 프로그램 코드를 실행합니다. 차단(block): 차단 상태는 스레드가 어떤 이유로 CPU 사용 권한을 포기한다는 것을 의미합니다. 즉, CPU 타임슬라이스를 포기하고 일시적으로 실행을 중지합니다. 스레드가 실행 가능 상태에 들어갈 때까지 CPU 타임슬라이스를 다시 획득하고 실행 상태로 이동할 수 있는 기회를 갖게 됩니다. 차단 상황에는 세 가지 유형이 있습니다.
(1) 차단 대기: 실행 중인 스레드가 o.wait() 메서드를 실행하고 JVM이 스레드를 대기 대기열에 넣습니다.
(2) 동기 차단: 실행 중인 스레드가 객체의 동기화 잠금을 획득할 때 다른 스레드가 동기화 잠금을 점유하고 있는 경우 JVM은 스레드를 잠금 풀에 넣습니다.
(3) 기타 차단: 실행 중인 스레드가 Thread.sleep(long ms) 또는 t.join() 메서드를 실행하거나 I/O 요청을 발행하면 JVM은 스레드를 차단 상태로 전환합니다. sleep() 상태가 시간 초과되거나, Join()이 스레드가 종료되거나 시간 초과될 때까지 기다리거나, I/O 처리가 완료되면 스레드는 실행 가능 상태로 돌아갑니다.
Death(죽음): 스레드의 run() 및 main() 메서드 실행이 종료되거나 예외로 인해 run() 메서드가 종료되면 스레드의 수명 주기가 종료됩니다. 죽은 스레드는 부활할 수 없습니다.
14. 동기화된 메소드와 동기화된 코드 블록의 차이점은 무엇인가요?
동기화를 사용하는 이유는 무엇인가요?
Java는 다중 스레드 동시성 제어를 허용합니다. 여러 스레드가 공유 가능한 리소스 변수를 동시에 작동(추가, 삭제, 수정, 확인)하면 부정확한 데이터가 발생하고 서로 충돌하므로 동기화 잠금이 추가됩니다. 스레드의 부정확성을 방지합니다. 작업이 완료되기 전에 다른 스레드에서 호출되므로 변수의 고유성과 정확성이 보장됩니다.
Difference
동기화 방법은 기본적으로 이 객체 또는 현재 클래스 객체를 잠금으로 사용합니다. 동기화 코드 블록은 잠글 항목을 선택할 수 있으며 이는 동기화 방법보다 더 세부적으로 선택할 수 있습니다. 동기화 문제를 일으키는 코드 중 동기화된 메소드는 동기화된 키워드를 사용하여 메소드를 수정하며, 동기화된 코드 블록은 주로 동기화된(객체){코드 내용을 사용하여 동기화가 필요한 코드를 수정합니다. } 수정
15. 모니터(Monitor) 내부에서 스레드 동기화를 수행하는 방법은 무엇입니까? 프로그램은 어떤 수준의 동기화를 수행해야 합니까?
Java Virtual Machine에서는 모니터와 잠금이 함께 사용됩니다. 모니터는 동기화된 코드 블록을 모니터링하여 한 번에 하나의 스레드만 동기화된 코드 블록을 실행하는지 확인합니다. 각 모니터는 개체 참조와 연결됩니다. 스레드는 잠금을 획득하기 전에 동기화된 코드를 실행할 수 없습니다.
16. 교착상태란 무엇인가요?
소위 교착 상태는 여러 프로세스가 리소스를 두고 경쟁하면서 발생하는 교착 상태(서로를 기다리는 상태)를 의미합니다. 외부 힘이 없으면 이러한 프로세스는 앞으로 나아갈 수 없습니다. 교착 상태에 필요한 네 가지 조건:
상호 배제 조건: 프로세스는 할당된 리소스(예: 프린터)에 대한 배타적 제어가 필요합니다. 즉, 특정 리소스는 일정 기간 내에 하나의 프로세스에서만 점유됩니다. 이때 다른 프로세스가 자원을 요청하면 요청한 프로세스는 대기만 할 수 있다. 비박탈 조건: 프로세스가 획득한 자원은 완전히 사용되기 전에 다른 프로세스가 강제로 빼앗을 수 없습니다. 즉, 리소스를 획득한 프로세스에서만 해제할 수 있습니다(능동적으로 해제할 수만 있음). 요청 및 보류 조건: 프로세스가 하나 이상의 리소스를 보유했지만 새로운 리소스 요청을 했으며, 해당 리소스는 다른 프로세스에 의해 점유되었습니다. 이때 요청 프로세스는 차단되지만 보유하고 있는 리소스는 유지됩니다. 획득. 순환 대기 조건: 프로세스 자원에 대한 ==순환 대기 체인==이 있습니다. 체인의 각 프로세스가 얻은 자원은 체인의 다음 프로세스에서 동시에 요청됩니다.
17. 교착 상태를 일으키지 않고 N 스레드가 N 리소스에 액세스할 수 있도록 하는 방법은 무엇입니까?
멀티 스레딩을 사용할 때 교착 상태를 방지하는 매우 간단한 방법은 다음과 같습니다. ==잠금 획득 순서를 지정하고== 스레드가 지정된 순서로 잠금을 획득하도록 합니다. 따라서 모든 스레드가 동일한 순서로 잠금 및 잠금을 해제하면 교착 상태가 발생하지 않습니다.
18.Java 컬렉션 클래스 프레임워크의 기본 인터페이스는 무엇인가요?
컬렉션 클래스 인터페이스는 요소라는 개체 집합을 지정합니다. 컬렉션 클래스 인터페이스의 각 구체적인 구현 클래스는 고유한 방식으로 요소를 저장하고 정렬하도록 선택할 수 있습니다. 일부 컬렉션 클래스는 중복 키를 허용하지만 다른 컬렉션 클래스는 허용하지 않습니다.
Java 컬렉션 클래스는 객체 집합에 대한 작업을 지원하는 잘 설계된 인터페이스와 클래스 집합을 제공합니다. Java 컬렉션 클래스의 가장 기본적인 인터페이스는 다음과 같습니다.
Collection: 개체 집합을 나타내며 각 개체는 하위 요소입니다. 세트: 중복된 요소를 포함하지 않는 컬렉션입니다. 목록: 순서가 지정되어 있고 반복되는 요소를 포함할 수 있는 모음입니다. Map: 키를 값에 매핑할 수 있는 개체입니다.
19. 컬렉션 클래스가 복제 가능 및 직렬화 가능 인터페이스를 구현하지 않는 이유는 무엇입니까?
복제 또는 직렬화의 의미와 의미는 특정 구현과 관련이 있습니다. 따라서 복제 또는 직렬화 방법을 결정하는 것은 컬렉션 클래스의 특정 구현에 달려 있습니다.
20.반복자란 무엇인가요?
Iterator 인터페이스는 컬렉션 요소를 반복하는 다양한 방법을 제공합니다. 모든 컬렉션 클래스에는 반복자 인스턴스를 반환하는 반복 메서드가 포함되어 있습니다. 반복자는 반복 프로세스 중에 기본 컬렉션의 요소를 삭제할 수 있지만 컬렉션의
remove(Object Obj)를 호출하여 직접 삭제할 수는 없습니다. 반복자의 Remove() 메서드를 통해 삭제할 수 있습니다.
HashMap과 Hashtable은 모두 Map 인터페이스를 구현하므로 많은 기능이 매우 유사합니다. 그러나 다음과 같은 차이점이 있습니다.
HashMap은 키와 값이 null이 되는 것을 허용하는 반면, Hashtable은 키나 값이 null이 되는 것을 허용하지 않습니다. Hashtable은 동기식이지만 HashMap은 그렇지 않습니다. 따라서 HashMap은 단일 스레드 환경에 더 적합하고 Hashtable은 다중 스레드 환경에 더 적합합니다. HashMap은 애플리케이션이 반복할 수 있는 키 컬렉션을 제공하므로 HashMap은 실패하지 않습니다. 반면 Hashtable은 키 열거를 제공합니다. 일반적으로 Hashtable은 레거시 클래스라고 믿어집니다.
36. 배열(Array)과 목록(ArrayList)의 차이점은 무엇인가요? ArrayList 대신 Array를 언제 사용해야 합니까?
Array는 기본 유형과 객체 유형을 포함할 수 있고, ArrayList는 객체 유형만 포함할 수 있습니다. Array의 크기는 고정되어 있고 ArrayList의 크기는 동적으로 변경됩니다. ArrayList는 addAll(), RemoveAll(), iterator() 등과 같은 더 많은 메소드와 기능을 제공합니다. 기본 유형의 데이터의 경우 컬렉션은 자동 박싱을 사용하여 코딩 작업을 줄입니다. 그러나 이 접근 방식은 고정 크기 기본 데이터 유형을 처리할 때 상대적으로 느립니다.
37. ArrayList와 LinkedList의 차이점은 무엇인가요?
ArrayList와 LinkedList는 모두 List 인터페이스를 구현합니다. 두 가지 차이점은 다음과 같습니다.
ArrayList는 인덱스 기반 데이터 인터페이스이고 하위 레이어는 배열입니다. O(1) 시간 복잡도로 요소에 대한 임의 액세스를 수행할 수 있습니다. 이에 따라 LinkedList는 == 요소 목록 == 형식으로 데이터를 저장합니다. 각 요소는 이전 요소와 다음 요소에 연결됩니다. 이 경우 요소를 찾는 시간은 O(n)입니다.
ArrayList에 비해 LinkedList의 삽입, 추가, 삭제 작업은 컬렉션의 어느 위치에나 요소가 추가될 때 배열처럼 크기를 다시 계산하거나 인덱스를 업데이트할 필요가 없기 때문에 더 빠릅니다. LinkedList는 각 노드에 대해 두 개의 참조(이전 요소를 가리키는 참조와 다음 요소를 가리키는 참조)를 저장하기 때문에 ArrayList보다 더 많은 메모리를 차지합니다.
38.Comparable 및 Comparator 인터페이스는 무엇에 사용되나요? 차이점을 나열하십시오.
Java는 CompareTo() 메서드가 하나만 포함된 Comparable 인터페이스를 제공합니다. 이 방법을 사용하면 두 개의 개체를 정렬할 수 있습니다. 구체적으로는 음수, 0, 양수를 반환하여 기존 개체가 입력 개체보다 작거나 같거나 크다는 것을 나타냅니다.
Java는 Compare() 및 Equals()라는 두 가지 메서드가 포함된 Comparator 인터페이스를 제공합니다. Compare() 메서드는 두 개의 입력 매개 변수를 정렬하는 데 사용되며 음수 0을 반환합니다. 양수는 첫 번째 매개 변수가 두 번째 매개 변수보다 작거나 같거나 크다는 것을 나타냅니다. equals() 메소드에는 입력 매개변수가 비교기와 같은지 여부를 판별하는 데 사용되는 매개변수로 객체가 필요합니다. 이 메소드는 입력 매개변수가 비교기이기도 하고 입력 매개변수와 현재 비교기의 정렬 결과가 동일한 경우에만 true를 반환합니다.
Comparable과 Comparator는 모두 컬렉션의 요소를 비교하고 정렬하는 데 사용되지만 Comparable은 컬렉션 내부에 정의된 메서드로 구현된 정렬이고 Comparator는 컬렉션 외부에서 구현된 정렬입니다. 정렬하려면 컬렉션 외부에서 Comparator 인터페이스의 메서드를 정의하거나 컬렉션 내에서 Comparable 인터페이스의 메서드를 구현해야 합니다. Comparator는 java.util 패키지 하위에 있고, Comparable은 java.lang 패키지 하위에 위치하며, Comparable은 이미 자체 비교를 지원하는 객체(예: String, Integer)에서 구현해야 하는 인터페이스입니다. 자체적으로 비교 작업을 수행하고 Comparable 인터페이스를 구현했습니다.) 사용자 정의 클래스를 목록 컨테이너에 추가한 후 정렬할 수 있는 경우 Collections 클래스의 정렬 메서드를 사용하여 정렬할 때 지정하지 않으면 Comparable 인터페이스를 구현할 수 있습니다. Comparator를 사용하면 자연 순서로 정렬됩니다. 여기서 자연스러운 순서는 특정 정렬 방법을 구현하는 것입니다.
Comparator는 전용 비교기입니다. 개체가 자체 비교를 지원하지 않거나 자체 비교 기능이 요구 사항을 충족할 수 없는 경우 비교기를 작성하여 두 개체 간의 크기 비교를 완료할 수 있습니다. 하나의 차이점은 스스로 비교를 완료한다는 점과, 다른 하나는 비교를 외부 프로그램에서 구현한다는 점이라고 할 수 있습니다. Comparator를 사용하는 것은 전략 디자인 패턴으로, 개체 자체를 변경하는 것이 아니라 전략 개체를 사용하여 해당 동작을 변경하는 것을 의미합니다. 예: 정수를 절대 크기로 정렬하려는 경우 Integer는 요구 사항을 충족하지 않습니다. 정렬 동작을 변경하기 위해 Integer 클래스를 수정할 필요는 없습니다(사실 이렇게 할 수는 없습니다). Comparator 인터페이스를 구현하는 Comparator 인터페이스는 객체를 사용하여 정렬을 제어합니다.
39.Java 우선순위 큐(Priority Queue)란 무엇인가요?
PriorityQueue는 우선순위 힙을 기반으로 하는 무제한 대기열이며 해당 요소는 자연 순서로 정렬됩니다. 이를 생성할 때 요소 정렬을 담당하는 비교기를 제공할 수 있습니다. PriorityQueue는 자연 순서가 없거나 관련 비교자가 없기 때문에 null 값을 허용하지 않습니다. 마지막으로 PriorityQueue는 스레드로부터 안전하지 않으며 큐에 넣기와 빼기의 시간 복잡도는 O(log(n))입니다.
40. 빅오 표기법을 이해하시나요? 다양한 데이터 구조의 예를 들어주실 수 있나요?
Big O 표기법은 데이터 구조의 요소가 증가할 때 알고리즘의 크기 또는 점근적 상한을 설명합니다.
Big O 표기법은 메모리 소비와 같은 다른 동작을 설명하는 데에도 사용할 수 있습니다. 컬렉션 클래스는 실제로 데이터 구조이기 때문에 일반적으로 Big O 표기법을 사용하여 시간, 메모리 및 성능을 기반으로 최상의 구현을 선택합니다. Big O 표기법은 대량의 데이터에 대한 성능에 대한 좋은 아이디어를 제공할 수 있습니다.
41.Enumeration 인터페이스와 Iterator 인터페이스의 차이점은 무엇입니까?
Enumeration은 Iterator보다 2배 빠르며 메모리를 덜 차지합니다. 그러나 Iterator는 다른 스레드가 Iterator가 탐색하는 컬렉션의 개체를 수정할 수 없기 때문에 Enumeration보다 훨씬 안전합니다. 동시에 Iterator를 사용하면 호출자가 기본 컬렉션의 요소를 삭제할 수 있습니다. 이는 Enumeration에서는 불가능합니다.
42.HashSet과 TreeSet의 차이점은 무엇인가요?
HashSet은 해시 테이블로 구현되므로 해당 요소는 순서가 없습니다. add(), Remove() 및 Contains() 메서드의 시간 복잡도는 O(1)입니다. 반면 TreeSet은 트리 구조로 구현되며 그 안에 있는 요소는 순서가 지정됩니다. 따라서 add(), Remove(), Contains() 메서드의 시간 복잡도는 O(logn)입니다.
43.Java에서 가비지 컬렉션의 목적은 무엇인가요? 가비지 수집은 언제 발생합니까?
참조되지 않은 개체나 메모리 범위를 초과하는 개체가 있는 경우 가비지 수집이 수행됩니다.
가비지 수집의 목적은 리소스를 해제하고 재사용하기 위해 애플리케이션에서 더 이상 사용하지 않는 개체를 식별하고 삭제하는 것입니다.
44.System.gc()와 Runtime.gc()는 무엇을 합니까?
이 두 가지 방법은 JVM이 가비지 수집을 수행하도록 유도하는 데 사용됩니다. 그러나 가비지 수집이 즉시 시작되는지 또는 지연되는지는 JVM에 따라 다릅니다.
45. finalize() 메서드는 언제 호출되나요? 소멸자(완결)의 목적은 무엇입니까?
가비지 수집기가 객체를 재활용하기로 결정하면 객체의 finalize() 메서드를 실행합니다. 그러나 불행히도 Java에서는 메모리가 항상 충분하면 가비지 수집이 절대 발생하지 않을 수 있습니다. 즉, filalize가 발생한다고 합니다. ()는 결코 실행되지 않을 수 있으며, 그것이 마무리 작업을 수행할 것이라고 기대하는 것은 분명히 신뢰할 수 없습니다. 그렇다면 finalize()는 정확히 무엇을 하는가? 주요 목적은 특수 채널에 의해 할당된 메모리를 회수하는 것입니다. Java 프로그램에는 가비지 수집기가 있으므로 일반적인 상황에서 프로그래머는 메모리 문제에 대해 걱정할 필요가 없습니다. 그러나 Java가 아닌 프로그램(C 또는 C++)을 호출하는 JNI(Java Native Interface)가 있으며 finalize()의 작업은 메모리의 이 부분을 회수하는 것입니다.
호출 타이밍: 가비지 수집기가 개체를 종료했다고 선언하려면 최소한 두 가지 표시 프로세스를 거쳐야 합니다. 연결 가능성 분석 후 개체에 GC Roots에 연결된 참조 체인이 없는 것으로 확인되면 다음으로 표시됩니다. 객체가 finalizer() 메소드를 재정의하고 가상 머신에서 호출되지 않은 경우 해당 객체는 F-Queue 대기열에 배치되고 실행됩니다. 우선 순위가 낮은 Finalizer 스레드 영역을 실행하면 finalizer() 메서드가 트리거되지만 해당 작업이 끝날 때까지 기다리지 않을 것입니다.
(추천 튜토리얼: java 강좌)
완결의 목적: 객체가 죽음을 피할 수 있는 마지막 기회. (참조 체인의 개체와 다시 연결하면 됩니다.) 그러나 실행하는 데 비용이 많이 들고 매우 불확실하며 각 개체의 호출 순서를 보장할 수 없으므로 권장되지 않습니다. try-finally 또는 다른 대안을 사용하세요.
46. 개체의 참조가 null로 설정되면 가비지 수집기가 개체가 차지한 메모리를 즉시 해제합니까?
아니요, 이 물건은 다음 쓰레기 수거 주기에 재활용 가능합니다.
객체가 차지한 메모리는 즉시 해제되지 않습니다. 개체의 참조가 null로 설정된 경우 현재 스레드 스택 프레임에서 개체에 대한 참조 연결만 끊고 가비지 수집기는 사용자 스레드가 백그라운드에서 실행되는 스레드일 때만 사용할 수 있습니다. 세이프 포인트(safe point) 또는 세이프 객체 참조 관계는 해당 영역에서만 스캔되며, 객체가 참조되지 않으면 객체 메모리가 즉시 해제되지 않습니다. (참조는 finalize 메소드에서 복원됩니다). 개체 메모리는 개체를 복원할 수 없다고 판단되는 경우에만 지워집니다.
47.Java 힙의 구조는 무엇인가요? 힙의 Perm Gen 공간은 무엇입니까? JVM의 힙은 런타임 데이터 영역이며 모든 클래스 인스턴스와 배열은 힙에 메모리를 할당합니다. JVM이 시작될 때 생성됩니다. 객체가 점유한 힙 메모리는 자동 메모리 관리 시스템, 즉 가비지 컬렉터에 의해 회수됩니다.
힙 메모리는 살아있는 객체와 죽은 객체로 구성됩니다. 살아남은 개체는 애플리케이션에서 액세스할 수 있으며 가비지 수집되지 않습니다. 데드 개체는 애플리케이션에 액세스할 수 없고 가비지 수집기에 의해 아직 회수되지 않은 개체입니다. 가비지 수집기가 이러한 개체를 수집할 때까지 해당 개체는 계속해서 힙 메모리 공간을 차지합니다.영구 생성은 Java 클래스, 메소드 등과 같은 정적 파일을 저장하는 데 사용됩니다. 영구 생성은 가비지 수집에 큰 영향을 미치지 않지만 일부 응용 프로그램은 Hibernate 등과 같은 일부 클래스를 동적으로 생성하거나 호출할 수 있습니다. 이 경우 새로 추가된 클래스를 저장하기 위해 상대적으로 큰 영구 생성 공간을 설정해야 합니다. 코드에는 일반적으로 다음이 포함됩니다.
클래스의 메서드(바이트코드...)
클래스 이름(Sring 객체)
.class 파일에서 읽은 상수 정보
클래스 객체와 관련된 객체 목록 및 유형 목록(예:
JVM에서 생성된 내부 객체
최적화를 위해 JIT 컴파일러에서 사용하는 정보
48. 직렬 수집기와 처리량 수집기의 차이점은 무엇인가요?
처리량 수집기는 중대형 데이터가 포함된 애플리케이션에 사용되는 젊은 세대 가비지 수집기의 병렬 버전을 사용합니다. 직렬 수집기는 대부분의 소규모 애플리케이션(최신 프로세서에서 약 100M의 메모리가 필요함)에 충분합니다.
49. Java에서는 언제 객체를 가비지 수집할 수 있나요?
객체가 GC Roots에서 접근할 수 없으면 다음 가비지 수집 주기에서 객체를 재활용하려고 시도합니다. 객체가 finalize() 메서드를 재정의하고 이 메서드에 성공적으로 저장되면(참조에 할당됨) 이 개체는 재활용되지 않습니다. 그러나 객체가 finalize() 메서드를 재정의하지 않거나 이미 이 메서드를 실행하고 자체 저장에 실패한 경우 객체는 재활용됩니다.
50. JVM 영구 세대에서는 가비지 수집이 발생합니까?
영구 세대에서는 가비지 수집이 발생하지 않습니다. 영구 세대가 가득 차거나 임계값을 초과하면 전체 가비지 수집(Full GC)이 실행됩니다. 가비지 컬렉터의 출력을 주의 깊게 살펴보면 영구 생성도 수집되는 것을 볼 수 있습니다. 이것이 Full GC를 피하기 위해 올바른 영구 생성 크기가 매우 중요한 이유입니다. Java8: 영구 생성에서 메타데이터 영역으로
를 참조하세요(참고: Java8에서는 영구 생성이 제거되고 메타데이터 영역이라는 새로운 기본 메모리 영역이 추가되었습니다)
51 Java의 두 가지 예외 유형은 무엇입니까? 그들 사이의 차이점은 무엇입니까?
Java에는 확인된 예외와 확인되지 않은 예외라는 두 가지 유형의 예외가 있습니다. 확인되지 않은 예외는 메서드나 생성자에서 선언할 필요가 없습니다. 메서드나 생성자가 실행되면 이러한 예외가 발생할 수 있고 확인되지 않은 예외는 메서드나 생성자 외부로 전파될 수 있습니다. 대신, throws 문을 사용하여 메서드나 생성자에서 확인된 예외를 선언해야 합니다. 다음은 Java 예외 처리에 대한 몇 가지 팁입니다.
Throwable에는 두 가지 유형의 오류(Error)와 예외(Excetion)가 포함됩니다.
Exception에는 런타임 예외(RuntimeException, 확인되지 않은 예외라고도 함)와 비런타임 예외(확인된 예외라고도 함)도 포함됩니다.
(1) 오류는 프로그램이 수행할 수 없는 것입니다. OutOfMemoryError 등이 발생하면 일반적으로 Java 가상 머신은 스레드를 종료합니다. (2) 런타임 예외는 RuntimeException 클래스와 NullPointerException, IndexOutOfBoundsException 등과 같은 하위 클래스입니다. 이러한 예외는 확인되지 않습니다. 프로그램이 실행 중일 때 예외가 발생할 수 있으므로 프로그램이 이를 잡을 수도 있고 잡지 못할 수도 있습니다. 이러한 오류는 일반적으로 프로그램의 논리적 오류로 인해 발생하므로 프로그램은 논리적 관점에서 이를 방지하도록 노력해야 합니다.
(3) 예외 확인 이는 런타임 예외가 아닌 예외이며 프로그램 관점에서 볼 때 이러한 예외는 포착되고 확인되어야 합니다. 그렇지 않으면 IOException, SQLException 등과 같은 컴파일을 통과할 수 없습니다.
2. Throw 뒤에는 예외 유형이 옵니다.
3. 예외 객체이며, Throws 유형 이후에 여러 예외를 한 번에 선언할 수 있습니다.
Init: 로드될 때마다 초기화됩니다.
시작: 애플릿 실행을 시작합니다.
중지: 애플릿 실행을 종료합니다.
파괴: 애플릿을 제거하기 전에 최종 정리를 수행합니다.
58. 애플릿이 로드되면 어떻게 되나요?
먼저 애플릿 제어 클래스의 인스턴스를 생성한 다음 애플릿을 초기화하고 마지막으로 실행을 시작합니다.
59. 애플릿과 일반 Java 애플리케이션의 차이점은 무엇인가요?
애플릿은 Java 지원 브라우저에서 실행되며 Java 애플리케이션은 브라우저 외부에서 실행될 수 있는 독립적인 Java 프로그램입니다. 그러나 모두 Java 가상 머신이 필요합니다.
게다가 Java 애플리케이션의 실행을 시작하려면 특정 메서드 시그니처가 있는 기본 함수가 필요합니다. Java 애플릿은 실행을 시작하기 위해 이러한 기능이 필요하지 않습니다.
마지막으로 Java 애플릿은 일반적으로 매우 엄격한 보안 정책을 사용하고 Java 애플리케이션은 일반적으로 보다 느슨한 보안 정책을 사용합니다.
60. Java 애플릿에는 어떤 제한이 있나요?
주로 보안상의 이유로 애플릿에는 다음과 같은 제한 사항이 적용됩니다.
애플릿은 클래스 라이브러리를 로드하거나 로컬 메서드를 정의할 수 없습니다. 호스트 컴퓨터와 함께 있으며 호스트 컴퓨터의 다른 프로그램을 열 수 없습니다.
61. 신뢰할 수 없는 애플릿이란 무엇입니까?
신뢰할 수 없는 애플릿은 로컬 시스템 파일에 액세스하거나 실행할 수 없는 Java 애플릿입니다. 기본적으로 다운로드된 모든 애플릿은 신뢰할 수 없습니다.
62. 네트워크에서 로드된 애플릿과 로컬 파일 시스템에서 로드된 애플릿의 차이점은 무엇입니까?
애플릿이 네트워크에서 로드되면 애플릿 보안 관리자에 의해 제한되는 애플릿 클래스 로더에 의해 애플릿이 로드됩니다.
애플릿이 클라이언트의 로컬 디스크에서 로드되면 파일 시스템 로더에 의해 애플릿이 로드됩니다.
파일 시스템에서 로드된 애플릿을 사용하면 클라이언트에서 파일 읽기, 파일 쓰기, 클래스 라이브러리 로드 및 기타 프로그램 실행이 가능하지만 바이트코드 확인을 통과할 수 없습니다.
63. 애플릿 클래스 로더란 무엇입니까? 그것은 무엇을 할 것인가?
애플릿이 네트워크에서 로드되면 애플릿 클래스 로더에 의해 로드됩니다. 클래스 로더에는 자체 Java 네임스페이스 계층이 있습니다. 클래스 로더는 파일 시스템의 클래스에 고유한 네임스페이스가 있고, 네트워크 리소스의 클래스에 고유한 네임스페이스가 있는지 확인합니다.
브라우저가 네트워크를 통해 애플릿을 로드하면 애플릿의 클래스는 애플릿 소스와 연결된 개인 네임스페이스에 배치됩니다. 그런 다음 클래스 로더에 의해 로드된 클래스는 유효성 검사기에 의해 확인됩니다. 유효성 검사기는 클래스 파일 형식이 Java 언어 사양을 준수하는지 확인하여 스택 오버플로 또는 언더플로가 발생하지 않고 바이트코드 명령어에 전달된 매개변수가 올바른지 확인합니다.
64. 애플릿 보안 관리자란 무엇입니까? 그것은 무엇을 할 것인가?
애플릿 보안 관리자는 애플릿에 제한을 가하는 메커니즘입니다. 브라우저에는 보안 관리자가 하나만 있을 수 있습니다. 보안 관리자는 시작 시 생성되며 나중에 교체하거나 확장할 수 없습니다.
65. 팝업 선택 메뉴(Choice)와 목록(List)의 차이점은 무엇인가요?
Choice는 간단한 형식으로 표시되며 모든 옵션을 보려면 아래로 스크롤해야 합니다. Choice에서는 한 번에 하나의 옵션만 선택할 수 있습니다. 목록에는 동시에 여러 요소가 표시될 수 있으며 하나 이상의 요소 선택을 지원합니다.
66. 레이아웃 관리자란 무엇입니까?
레이아웃 관리자는 컨테이너의 구성 요소를 구성하는 데 사용됩니다.
67. 스크롤바(Scrollbar)와 스크롤 패널(JScrollPane)의 차이점은 무엇입니까?
스크롤바는 컨테이너가 아닌 구성요소입니다. 그리고 ScrollPane은 컨테이너입니다. ScrollPane은 스크롤 이벤트 자체를 처리합니다.
68. 어떤 Swing 메소드가 스레드로부터 안전합니까?
스레드로부터 안전한 메소드는 repaint(), revalidate() 및 무효화()의 3가지뿐입니다.
69. 다시 칠하기를 지원하는 세 가지 구성 요소를 말하세요.
캔버스, 프레임, 패널 및 애플릿은 다시 그리기를 지원합니다.
70.JDBC란?
JDBC는 사용자가 다양한 데이터베이스 중에서 선택할 수 있는 추상화 계층입니다. JDBC를 사용하면 개발자는 기본 특정 데이터베이스의 세부 사항에 대해 걱정할 필요 없이 JAVA로 데이터베이스 애플리케이션을 작성할 수 있습니다.
JDBC(Java DataBase Connectivity)는 객체 지향 API(응용 프로그래밍 인터페이스) 세트로, 다양한 관계형 데이터베이스에 액세스하기 위한 통합 표준 인터페이스를 구성하고 다양한 데이터베이스 제조업체에 표준 구현을 제공합니다. JDBC 기술을 통해 개발자는 순수 Java 언어와 표준 SQL 문을 사용하여 완전한 데이터베이스 애플리케이션을 작성하고 소프트웨어의 크로스 플랫폼 특성을 실제로 실현할 수 있습니다.
일반적으로 JDBC는 다음 작업을 완료하는 데 사용됩니다.
2. 데이터베이스에 SQL 문을 보냅니다.
JDBC에는 다음과 같은 장점이 있습니다. 1. JDBC와 ODBC(Open Database Connectivity(Open Database Connectivity)는 매우 유사하고 소프트웨어 개발자가 이해하기 쉽습니다.
2.JDBC는 소프트웨어 개발자가 복잡한 드라이버 작성 작업에서 해방되고 비즈니스 로직 개발에 전적으로 집중할 수 있습니다.
3.JDBC 다양한 관계형 데이터베이스를 지원하여 소프트웨어 이식성을 크게 높입니다.
4. JDBC API는 객체 지향적이며 소프트웨어 개발자는 코드 재사용성을 향상하기 위해 일반적으로 사용되는 방법을 다시 캡슐화할 수 있습니다. 평균?
데이터베이스 연결 열기 및 닫기와 같은 데이터베이스와의 상호 작용에는 시간이 많이 걸릴 수 있습니다. 특히 클라이언트 수가 증가하면 많은 리소스가 소비되고 비용도 매우 높아집니다. 응용 프로그램 서버가 시작되면 풀에서 많은 데이터베이스 연결을 설정하고 유지 관리할 수 있습니다. 연결 요청은 풀의 연결에서 제공됩니다. 연결이 모두 사용된 후에는 나중에 더 많은 요청을 충족하는 데 사용하기 위해 연결이 풀로 반환됩니다.
72. RMI 프로그램을 올바르게 실행하는 단계는 무엇입니까?
RMI 프로그램이 올바르게 실행되려면 다음 단계가 포함되어야 합니다.
모든 소스 파일을 컴파일합니다.
rmic을 사용하여 스텁을 생성하세요.
rmiregistry를 시작하세요.
RMI 서버를 시작합니다.
클라이언트 프로그램을 실행하세요.
73. 마샬링과 디마샬링을 설명하세요.
애플리케이션이 네트워크를 통해 메모리 개체를 다른 호스트로 전송하거나 스토리지에 유지하려는 경우 메모리에 있는 개체 표현을 적합한 형식으로 변환해야 합니다. 이 프로세스를 마샬링이라고 하며 그 반대를 디마샬링이라고 합니다.
74. 직렬화와 역직렬화를 설명하세요.
Java는 객체 직렬화라는 메커니즘을 제공합니다. 이는 객체 데이터, 객체 유형 정보, 객체 내부 데이터 유형 정보 등을 포함하는 일련의 바이트로 객체를 나타냅니다. 따라서 직렬화는 객체를 디스크에 저장하거나 디스크에서 읽고 재구성하기 위해 객체를 평면화하는 방법으로 볼 수 있습니다. 역직렬화는 개체를 일반 상태에서 활성 개체로 변환하는 역단계입니다.
75. 서블릿이란?
Servlet은 클라이언트 요청을 처리하고 동적 웹 콘텐츠를 생성하는 데 사용되는 Java 클래스입니다. 서블릿은 주로 HTML 양식으로 제출된 데이터를 처리 또는 저장하고, 동적 콘텐츠를 생성하고, 상태 비저장 HTTP 프로토콜에서 상태 정보를 관리하는 데 사용됩니다.
76. 서블릿의 아키텍처에 대해 이야기해 보겠습니다.
모든 서블릿이 구현해야 하는 핵심 인터페이스는 javax.servlet.Servlet입니다. 모든 서블릿은 이 인터페이스를 직접 또는 간접적으로 구현하거나 javax.servlet.GenericServlet 또는 javax.servlet.http.HTTPServlet을 상속해야 합니다. 마지막으로 서블릿은 여러 스레드를 사용하여 여러 요청을 병렬로 처리합니다.
77. 웹 애플리케이션이란 무엇입니까?
웹 애플리케이션은 웹 또는 애플리케이션 서버의 동적 확장입니다. 웹 애플리케이션에는 프레젠테이션 지향과 서비스 지향이라는 두 가지 유형이 있습니다. 프레젠테이션 지향 웹 애플리케이션은 요청에 응답하여 다양한 마크업 언어와 동적 콘텐츠를 포함하는 대화형 웹 페이지를 생성합니다. 서비스 지향 웹 애플리케이션은 웹 서비스의 끝점을 구현합니다. 일반적으로 웹 애플리케이션은 서버 URL 네임스페이스의 특정 하위 집합 아래에 설치된 서블릿 모음으로 볼 수 있습니다.
78. 어떤 클라이언트 시스템이 서블릿을 요청하는지 어떻게 알 수 있나요?
ServletRequest 클래스는 클라이언트 시스템의 IP 주소나 호스트 이름을 알아낼 수 있습니다. getRemoteAddr() 메소드는 클라이언트 호스트의 IP 주소를 획득하고, getRemoteHost()는 호스트 이름을 획득합니다.
79. HTTP 응답의 구조는 무엇입니까?
HTTP 응답은 세 부분으로 구성됩니다.
상태 코드: 응답 상태를 설명합니다. 요청이 성공적으로 완료되었는지 확인하는 데 사용할 수 있습니다. 요청이 실패하는 경우 상태 코드를 사용하여 실패 이유를 찾을 수 있습니다. 서블릿이 상태 코드를 반환하지 않으면 기본적으로 성공적인 상태 코드 HttpServletResponse.SC_OK가 반환됩니다.
HTTP 헤더: 응답에 대한 추가 정보가 포함되어 있습니다. 예를 들어 헤더는 응답이 만료된 것으로 간주되는 만료 날짜를 지정하거나 엔터티 콘텐츠를 사용자에게 안전하게 전송하는 데 사용되는 인코딩 형식을 지정할 수 있습니다. Serlet에서 HTTP 헤더를 검색하는 방법은 여기를 참조하세요.
Body: 응답 내용을 담고 있습니다. 여기에는 HTML 코드, 이미지 등이 포함될 수 있습니다. 본문은 헤더 바로 다음에 HTTP 메시지로 전송된 데이터 바이트로 구성됩니다.
80. 쿠키란 무엇인가요? 세션과 쿠키의 차이점은 무엇입니까?
쿠키는 웹서버가 브라우저에 보내는 정보의 일부입니다. 브라우저는 각 웹 서버에 대한 쿠키를 로컬 파일에 저장합니다. 앞으로는 브라우저가 특정 웹 서버에 요청을 보낼 때 해당 서버에 저장된 모든 쿠키도 함께 보낼 것입니다. 세션과 쿠키의 차이점은 다음과 같습니다.
클라이언트 브라우저의 설정에 관계없이 세션은 정상적으로 작동해야 합니다. 클라이언트는 쿠키를 비활성화하도록 선택할 수 있지만 클라이언트가 서버측 세션을 비활성화할 수 없기 때문에 세션은 계속 작동합니다.
세션과 쿠키는 저장되는 데이터의 양도 다릅니다. 세션은 모든 Java 개체를 저장할 수 있으며 쿠키는 문자열 유형 개체만 저장할 수 있습니다.
81. JSP 요청은 어떻게 처리되나요?
브라우저는 먼저 .jsp 확장자로 끝나는 페이지를 요청하고 JSP 요청을 시작합니다. 그런 다음 웹 서버는 요청을 읽고 JSP 컴파일러를 사용하여 JSP 페이지를 서블릿 클래스로 변환합니다. JSP 파일은 페이지가 처음 요청되거나 JSP 파일이 변경될 때만 컴파일되며, 그런 다음 서버는 브라우저의 요청을 처리하기 위해 서블릿 클래스를 호출합니다. 요청 실행이 완료되면 서블릿은 클라이언트에 응답을 보냅니다.
82. 캡슐화의 정의와 이점은 무엇인가요?
캡슐화는 객체에 내부 특성과 동작을 숨기는 기능을 제공합니다. 객체는 내부 데이터를 변경하기 위해 다른 객체가 액세스할 수 있는 메서드를 제공합니다. Java에는 public, private 및 protected라는 세 가지 수정자가 있습니다. 각 수정자는 동일한 패키지 또는 다른 패키지에 있는 다른 개체에 대해 서로 다른 액세스 권한을 제공합니다.
다음은 캡슐화 사용의 이점 중 일부입니다.
객체 속성을 숨겨 객체 내부의 상태를 보호합니다.
개체의 동작을 개별적으로 변경하거나 확장할 수 있으므로 코드의 유용성과 유지 관리성이 향상됩니다.
모듈성을 향상시키기 위해 개체 간의 잘못된 상호 작용을 금지합니다.
캡슐화에 대한 자세한 내용과 예시는 이 문서를 참조하세요.
or:
먼저, 클래스의 세부 사항을 외부 세계로부터 격리하기 위해 private를 사용하여 데이터 항목과 메서드를 숨깁니다. 이러한 데이터 항목과 메서드에 액세스할 수 있는 유일한 방법은 클래스 자체를 통하는 것입니다. 이를 호출할 수 있는 자격이 있는 리소스(메소드, 데이터 항목 속성 등)입니다. 따라서 첫 번째 이점은 데이터 보안이 향상된다는 것입니다.
둘째, 숨겨진 격리를 통해 클래스에 대한 제한된 외부 액세스만 허용됩니다. 개발자는 클래스를 사용하는 프로그램을 수정하지 않고도 클래스의 내부 구현을 자유롭게 변경할 수 있습니다. 클래스 외부에서 호출할 수 있는 메서드는 외부 특성을 그대로 유지하는 한, 내부 코드는 필요에 맞게 자유롭게 변경할 수 있어 분업이 용이합니다.
세 번째는 코드의 재사용성을 향상시키는 것입니다. 이를 도구 클래스로 캡슐화하면 많은 지루한 단계를 줄일 수 있습니다.
83. 추상의 정의? 추상화와 캡슐화의 차이점은 무엇입니까?
추상화는 아이디어를 구체적인 인스턴스와 분리하여 구현 세부 사항이 아닌 기능을 기반으로 클래스를 만드는 단계입니다. Java는 인터페이스만 노출하고 메소드 구현은 포함하지 않는 추상 클래스 생성을 지원합니다. 이 추상화 기술의 주요 목적은 클래스의 동작을 구현 세부 사항과 분리하는 것입니다. 추상화와 캡슐화는 상호 보완적인 개념입니다. 한편으로 추상화는 객체의 동작에 중점을 둡니다. 반면 캡슐화는 객체 동작의 세부 사항에 중점을 둡니다. 캡슐화는 일반적으로 객체의 내부 상태 정보를 숨김으로써 달성됩니다. 따라서 캡슐화는 추상화를 제공하는 데 사용되는 전략으로 간주될 수 있습니다.
관련 권장 사항: Java 시작하기
위 내용은 일반적인 Java 주요 면접 질문 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!