Skip to content

Commit 93e128c

Browse files
committed
docs: Java 문항 수정 (동시성이슈는 삭제)
- JVM의 구조, Java 실행방식 - 컬렉션 프레임워크 - 애노테이션 - 추상클래스와 인터페이스 - 객체 재정의 - static - 동시성 이슈는 내용이 부족하여 삭제하고 다시 추가해야합니다. 이 부분은 추가적 공부가 필요.
1 parent 621f59e commit 93e128c

File tree

1 file changed

+31
-19
lines changed

1 file changed

+31
-19
lines changed

README.md

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -592,18 +592,24 @@
592592
<summary>JVM의 구조와 Java의 실행방식을 설명해주세요.</summary>
593593
</br>
594594
<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>
596596
<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>
601605
<ul>
602606
<li>PC Register: Thread가 시작될 때 생성되며 현재 수행 중인 JVM 명령의 주소를 갖고 있습니다.</li>
603-
<li>Stack Area: 지역 변수, 파리미터 등이 생성되는 영역. 실제 객체는 Heap에 할당되고 해당 레퍼런스만 Stack에 저장됩니다.</li>
607+
<li>Stack Area: 지역 변수, 파라미터 등이 생성되는 영역. 실제 객체는 Heap에 할당되고 해당 레퍼런스만 Stack에 저장됩니다.</li>
604608
<li>Heap Area: 동적으로 생성된 오브젝트와 배열이 저장되는 곳으로 GC의 대상 영역입니다.</li>
605609
<li>Method Area: 클래스 멤버 변수, 메소드 정보, Type 정보, Constant Pool, static, final 변수 등이 생성됩니다. 상수 풀(Constant Pool)은 모든 Symbolic Reference를 포함하고 있습니다.</li>
606610
</ul>
611+
<li>JNI(Java Native Interface): 자바 애플리케이션에서 C, C++, 어셈블리어로 작성된 함수를 사용할 수 있는 방법을 제공해줍니다. Native 키워드를 사용하여 메서드를 호출합니다. 대표적인 메서드는 Thread의 currentThread()입니다.</li>
612+
<li>Native Method Library: C, C++로 작성된 라이브러리 입니다.</li>
607613
</ul>
608614
<p>Java의 실행방식
609615
<ul>
@@ -629,8 +635,8 @@
629635
<details>
630636
<summary>컬렉션 프레임워크에 대해서 설명해주세요.</summary>
631637
</br>
632-
<p>Java Collection은 널리 알려져 있는 자료구조를 바탕으로 객체, 데이터들을 효율적으로 관리 할 수 있는 자료구조들이 있는 라이브러리를 컬렉션 프레임워크라고 합니다. 배열과 다르게 객체의 수를 상황에 따라 동적으로 정할 수 있습니다.</p>
633-
<p>List, Map, Set 인터페이스를 기준으로 여러 구현체가 존재합니다.</p>
638+
<p>Java Collection은 널리 알려져 있는 자료구조를 바탕으로 객체, 데이터들을 효율적으로 관리 할 수 있는 자료구조들이 있는 라이브러리를 컬렉션 프레임워크라고 합니다.</p>
639+
<p>List, Set은 Collection 인터페이스을 상속받지만, Map 인터페이스는 구조상의 차이라 별도로 정의합니다.</p>
634640
</details>
635641

636642
<details>
@@ -642,7 +648,13 @@
642648
<details>
643649
<summary>애노테이션에 대해서 설명해주세요.</summary>
644650
</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>
646658
</details>
647659

648660
<details>
@@ -657,22 +669,22 @@
657669
<details>
658670
<summary>인터페이스와 추상클래스의 차이점에 대해 설명해주세요.</summary>
659671
</br>
660-
<p>추상클래스의 목적은 공통적인 기능을 하는 객체들의 추상화입니다. 일반 메소드는 상속받을 클래스에서 다시 재정의할 필요가 없습니다.</p>
661-
<p>인터페이스는 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용합니다. 다중 상속이 가능합니다.</p>
672+
<p>추상클래스는 객체의 추상적인 상위 개념으로 공통된 개념을 표현할 때 사용합니다. 단일 상속만 가능합니다. 추상클래스를 상속하는 집합간에는 연관관계가 있습니다.</p>
673+
<p>인터페이스는 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용합니다. 다중 상속이 가능합니다. 인터페이스를 구현하는 집합간에는 관계가 없을 수 있습니다.</p>
662674
</details>
663675

664676
<details>
665677
<summary>클래스는 무엇이고 객체는 무엇인가요?</summary>
666678
</br>
667679
<p>클래스는 객체를 정의하는 틀 또는 설계도와 같은 의미로 사용됩니다.</p>
668-
<p>객체는 식별 가능한 개체 또는 사물입니다. 객체는 구별 가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가집니다.</p>
680+
<p>객체는 식별 가능한 개체 또는 사물입니다. 객체는 구별 가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가집니다. 인스턴스들을 통칭하는 용도로 사용합니다.</p>
669681
</details>
670682

671683
<details>
672-
<summary>정적(Static)이란 무엇인가요?</summary>
684+
<summary>정적(static)이란 무엇인가요?</summary>
673685
</br>
674-
<p>Static은 클래스 멤버라고 하며, 클래스 로더가 클래스를 로딩해서 메소드 메모리 영역에 적재할 때 클래스별로 관리됩니다.</p>
675-
<p>Static 키워드를 통해 생성된 정적멤버들은 Static 영역에 할당되며 Static 영역에 할당된 메모리는 모든 객체가 공유하며 하나의 멤버를 어디서든지 참조할 수 있는 장점이 있습니다.</p>
686+
<p>static은 클래스 멤버라고 하며, 클래스 로더가 클래스를 로딩해서 메소드 메모리 영역에 적재할 때 클래스별로 관리됩니다.</p>
687+
<p>static 키워드를 통해 생성된 정적멤버들은 PermGen 또는 Metaspace에 저장되며 저장된 메모리는 모든 객체가 공유하며 하나의 멤버를 어디서든지 참조할 수 있는 장점이 있습니다.</p>
676688
<p>그러나, GC의 관리 영역 밖에 존재하기 때문에 프로그램 종료시까지 메모리가 할당된 채로 존재합니다. 너무 남발하게 되면 시스템 성능에 악영향을 줄 수 있습니다.</p>
677689
</details>
678690

@@ -703,9 +715,9 @@
703715
</br>
704716
<p>SRP(단일책임원칙)은 한 클래스의 하나의 책임만 가져야 합니다.</p>
705717
<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>
709721
</details>
710722

711723
<details>
@@ -777,7 +789,7 @@
777789
<details>
778790
<summary>자바의 동시성 이슈(공유자원 접근)에 대해 설명해주세요.</summary>
779791
</br>
780-
<p>하나의 객체를 여러 스레드에서 동시에 사용할 경우에 동기화를 사용합니다. Java에서는 synchronized 키워드를 사용하여 스레드를 통제합니다. Collections에서는 JDK1.7부터 concurrent package를 통해 ConcurrentHashMap이라는 구현체를 사용니다.</p>
792+
<p></p>
781793
</details>
782794

783795
<details>

0 commit comments

Comments
 (0)