|
592 | 592 | <summary>JVM의 구조와 Java의 실행방식을 설명해주세요.</summary>
|
593 | 593 | </br>
|
594 | 594 | <p>자바 가상 머신의 약자를 따서 줄여 부르는 용어로 JVM의 역할은 자바 애플리케이션을 클래스 로더를 통해 읽어 자바 API와 함께 실행하는 것입니다. 메모리 관리(GC)을 수행하며 스택기반의 가상머신입니다.</p>
|
595 |
| - <p>JVM의 구조는 Class Loader, Exection engine, GC, Runtime Data Area로 이루어져 있습니다.</p> |
| 595 | + <p>JVM의 구조는 Class Loader, Exection engine, Runtime Data Area, JNI, Native Method Library로 이루어져 있습니다.</p> |
596 | 596 | <ul>
|
597 |
| - <li>클래스로드: JVM내로 클래스를 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈</li> |
598 |
| - <li>실행 엔진: 클래스를 실행시키는 역할</li> |
599 |
| - <li>GC: 가비지 컬렉터로 힙 영역에서 사용되지 않는 객체들을 제거하는 작업을 의미합니다.</li> |
600 |
| - <li>Runtime Data Areas: 프로그램을 수행하기 위해 OS에서 할당받은 메모리공간을 의미합니다.</li> |
| 597 | + <li>클래스 로더: JVM내로 클래스를 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈</li> |
| 598 | + <li>실행 엔진: 바이트 코드를 실행시키는 역할</li> |
| 599 | + <ul> |
| 600 | + <li>인터프리터: 바이트 코드를 한줄 씩 실행합니다.</li> |
| 601 | + <li>JIT 컴파일러: 인터피르터 효율을 높이기 위한 컴파일러로 인터프리터가 반복되는 코드를 발견하면 JIT 컴파일러가 반복되는 코드를 네이티브 코드로 바꿔줍니다. 그 다음부터 인터프리터는 네이티브 코드로 컴파일된 코드를 바로 사용합니다.</li> |
| 602 | + <li>GC(Garbage Collector): 가비지 컬렉터로 힙 영역에서 사용되지 않는 객체들을 제거하는 작업을 의미합니다.</li> |
| 603 | + </ul> |
| 604 | + <li>Runtime Data Areas: 프로그램 실행 중에 사용되는 다양한 영역입니다.</li> |
601 | 605 | <ul>
|
602 | 606 | <li>PC Register: Thread가 시작될 때 생성되며 현재 수행 중인 JVM 명령의 주소를 갖고 있습니다.</li>
|
603 |
| - <li>Stack Area: 지역 변수, 파리미터 등이 생성되는 영역. 실제 객체는 Heap에 할당되고 해당 레퍼런스만 Stack에 저장됩니다.</li> |
| 607 | + <li>Stack Area: 지역 변수, 파라미터 등이 생성되는 영역. 실제 객체는 Heap에 할당되고 해당 레퍼런스만 Stack에 저장됩니다.</li> |
604 | 608 | <li>Heap Area: 동적으로 생성된 오브젝트와 배열이 저장되는 곳으로 GC의 대상 영역입니다.</li>
|
605 | 609 | <li>Method Area: 클래스 멤버 변수, 메소드 정보, Type 정보, Constant Pool, static, final 변수 등이 생성됩니다. 상수 풀(Constant Pool)은 모든 Symbolic Reference를 포함하고 있습니다.</li>
|
606 | 610 | </ul>
|
| 611 | + <li>JNI(Java Native Interface): 자바 애플리케이션에서 C, C++, 어셈블리어로 작성된 함수를 사용할 수 있는 방법을 제공해줍니다. Native 키워드를 사용하여 메서드를 호출합니다. 대표적인 메서드는 Thread의 currentThread()입니다.</li> |
| 612 | + <li>Native Method Library: C, C++로 작성된 라이브러리 입니다.</li> |
607 | 613 | </ul>
|
608 | 614 | <p>Java의 실행방식
|
609 | 615 | <ul>
|
|
629 | 635 | <details>
|
630 | 636 | <summary>컬렉션 프레임워크에 대해서 설명해주세요.</summary>
|
631 | 637 | </br>
|
632 |
| - <p>Java Collection은 널리 알려져 있는 자료구조를 바탕으로 객체, 데이터들을 효율적으로 관리 할 수 있는 자료구조들이 있는 라이브러리를 컬렉션 프레임워크라고 합니다. 배열과 다르게 객체의 수를 상황에 따라 동적으로 정할 수 있습니다.</p> |
633 |
| - <p>List, Map, Set 인터페이스를 기준으로 여러 구현체가 존재합니다.</p> |
| 638 | + <p>Java Collection은 널리 알려져 있는 자료구조를 바탕으로 객체, 데이터들을 효율적으로 관리 할 수 있는 자료구조들이 있는 라이브러리를 컬렉션 프레임워크라고 합니다.</p> |
| 639 | + <p>List, Set은 Collection 인터페이스을 상속받지만, Map 인터페이스는 구조상의 차이라 별도로 정의합니다.</p> |
634 | 640 | </details>
|
635 | 641 |
|
636 | 642 | <details>
|
|
642 | 648 | <details>
|
643 | 649 | <summary>애노테이션에 대해서 설명해주세요.</summary>
|
644 | 650 | </br>
|
645 |
| - <p>애너테이션은 인터페이스를 기반으로 한 문법으로 주석처럼 코드에 달아 클래스에 특별한 의미를 부여하거나 기능을 주입할 수 있습니다. built-in annotation은 상속받아서 메소드를 오버라이드 할 때 나타나는 @Override 애너테이션이 그 대표적인 예입니다.</p> |
| 651 | + <p>애노테이션은 인터페이스를 기반으로 한 문법으로 주석처럼 코드에 달아 클래스에 특별한 의미를 부여하거나 기능을 주입할 수 있습니다. built-in annotation은 상속받아서 메소드를 오버라이드 할 때 나타나는 @Override 애노테이션이 그 대표적인 예입니다.</p> |
| 652 | + <p>메타 애너테이션은 애노테이션을 선언할 때 사용하는 애노테이션입니다.</p> |
| 653 | + <ul> |
| 654 | + <li>@Retention: 애노테이션 유지 범위를 지정합니다. (소스, 클래스, 런타임)</li> |
| 655 | + <li>@Inherit: 애노테이션을 하위 클래스까지 전달여부를 지정합니다. 이 애노테이션이 있으면 하위 클래스까지 상속이 가능합니다.</li> |
| 656 | + <li>@Target: 해당 애노테이션을 어디에 사용할 지 결정합니다. (타입, 필드, 메서드, 파라미터, 생성자, 로컬변수, 애노테이션 타입)</li> |
| 657 | + </ul> |
646 | 658 | </details>
|
647 | 659 |
|
648 | 660 | <details>
|
|
657 | 669 | <details>
|
658 | 670 | <summary>인터페이스와 추상클래스의 차이점에 대해 설명해주세요.</summary>
|
659 | 671 | </br>
|
660 |
| - <p>추상클래스의 목적은 공통적인 기능을 하는 객체들의 추상화입니다. 일반 메소드는 상속받을 클래스에서 다시 재정의할 필요가 없습니다.</p> |
661 |
| - <p>인터페이스는 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용합니다. 다중 상속이 가능합니다.</p> |
| 672 | + <p>추상클래스는 객체의 추상적인 상위 개념으로 공통된 개념을 표현할 때 사용합니다. 단일 상속만 가능합니다. 추상클래스를 상속하는 집합간에는 연관관계가 있습니다.</p> |
| 673 | + <p>인터페이스는 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용합니다. 다중 상속이 가능합니다. 인터페이스를 구현하는 집합간에는 관계가 없을 수 있습니다.</p> |
662 | 674 | </details>
|
663 | 675 |
|
664 | 676 | <details>
|
665 | 677 | <summary>클래스는 무엇이고 객체는 무엇인가요?</summary>
|
666 | 678 | </br>
|
667 | 679 | <p>클래스는 객체를 정의하는 틀 또는 설계도와 같은 의미로 사용됩니다.</p>
|
668 |
| - <p>객체는 식별 가능한 개체 또는 사물입니다. 객체는 구별 가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가집니다.</p> |
| 680 | + <p>객체는 식별 가능한 개체 또는 사물입니다. 객체는 구별 가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가집니다. 인스턴스들을 통칭하는 용도로 사용합니다.</p> |
669 | 681 | </details>
|
670 | 682 |
|
671 | 683 | <details>
|
672 |
| - <summary>정적(Static)이란 무엇인가요?</summary> |
| 684 | + <summary>정적(static)이란 무엇인가요?</summary> |
673 | 685 | </br>
|
674 |
| - <p>Static은 클래스 멤버라고 하며, 클래스 로더가 클래스를 로딩해서 메소드 메모리 영역에 적재할 때 클래스별로 관리됩니다.</p> |
675 |
| - <p>Static 키워드를 통해 생성된 정적멤버들은 Static 영역에 할당되며 Static 영역에 할당된 메모리는 모든 객체가 공유하며 하나의 멤버를 어디서든지 참조할 수 있는 장점이 있습니다.</p> |
| 686 | + <p>static은 클래스 멤버라고 하며, 클래스 로더가 클래스를 로딩해서 메소드 메모리 영역에 적재할 때 클래스별로 관리됩니다.</p> |
| 687 | + <p>static 키워드를 통해 생성된 정적멤버들은 PermGen 또는 Metaspace에 저장되며 저장된 메모리는 모든 객체가 공유하며 하나의 멤버를 어디서든지 참조할 수 있는 장점이 있습니다.</p> |
676 | 688 | <p>그러나, GC의 관리 영역 밖에 존재하기 때문에 프로그램 종료시까지 메모리가 할당된 채로 존재합니다. 너무 남발하게 되면 시스템 성능에 악영향을 줄 수 있습니다.</p>
|
677 | 689 | </details>
|
678 | 690 |
|
|
703 | 715 | </br>
|
704 | 716 | <p>SRP(단일책임원칙)은 한 클래스의 하나의 책임만 가져야 합니다.</p>
|
705 | 717 | <p>OCP(개방-폐쇄 원칙)은 확장에는 열려 있으나 변경에는 닫혀 있어야 하며, 다형성을 활용해야 합니다.</p>
|
706 |
| - <p>LSP(리스코프 치환 원칙)은 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야하는 원칙으로 이 예시는 `List<Integer> intList = new ArrayList<>();` 와 같습니다.</p> |
707 |
| - <p>ISP(인터페이스 분리 원칙)은 클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안되는 원칙입니다. 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 더 낫습니다.</p> |
708 |
| - <p>DIP(의존관계 역전 원칙)은 구현 클래스에 의존하지 말고, 인터페이스에 의존해야 하는 원칙입니다. 자신보다 변하기 쉬운 구체에 의존하면 안됩니다.</p> |
| 718 | + <p>LSP(리스코프 치환 원칙)은 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야하는 원칙으로 상위 타입을 상속해서 재정의 했을 때 프로그램이 깨지지 않아야 합니다.</p> |
| 719 | + <p>ISP(인터페이스 분리 원칙)은 클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안되는 원칙입니다. 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 더 낫습니다. 즉, 비대한 인터페이스보단 더 작고 구체적인 인터페이스로 분리해야합니다.</p> |
| 720 | + <p>DIP(의존관계 역전 원칙)은 추상적인 것은 자신보다 구체적인 것에 의존하지 않고, 변화하기 쉬운 것에 의존해서는 안된다는 원칙입니다. 구체적으론 구현 클래스에 의존하지 말고, 인터페이스에 의존해야 하는 원칙입니다.</p> |
709 | 721 | </details>
|
710 | 722 |
|
711 | 723 | <details>
|
|
777 | 789 | <details>
|
778 | 790 | <summary>자바의 동시성 이슈(공유자원 접근)에 대해 설명해주세요.</summary>
|
779 | 791 | </br>
|
780 |
| - <p>하나의 객체를 여러 스레드에서 동시에 사용할 경우에 동기화를 사용합니다. Java에서는 synchronized 키워드를 사용하여 스레드를 통제합니다. Collections에서는 JDK1.7부터 concurrent package를 통해 ConcurrentHashMap이라는 구현체를 사용니다.</p> |
| 792 | + <p></p> |
781 | 793 | </details>
|
782 | 794 |
|
783 | 795 | <details>
|
|
0 commit comments