기록물 저장소/활동

[SW 마에스트로] 면접 대비 JAVA의 이론과 예상 질문

모영이 2021. 3. 22. 23:54

아래의 사이트의 정리된 내용을 정리했습니다. 후에 정보가 추가되면 출처를 밝히도록 노력하겠습니다. 누락된 출처가 있고 정보가 섞여서 정리 될 수 있습니다. 저는 JAVA언어의 이론을 1도 모르기 때문에 여기 적힌 내용은 모두 구글링한 것입니다.

github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/Java

구체적인 질문 LIST 1

기본용어 추가설명1

인터페이스 추가설명1

기본 용어정리 1

 

JAVA

JVM(JAVA Virtual Machine)

JVM
자바 가상 머신(가상머신 : 프로그램의 물리적 머신과 유사한 머신을 소프트웨어로 구현)의 약자를 딴 용어. 자바 애플리케이션을 클래스 로더를 통해 읽어들여 자바 API와 함께 실행한다. JVM JAVA OS사이에서 중개자 역할을 수행하여 OS에 구애받지 않고 재사용을 가능하게 해준다. 메모리 관리, Garbage Collection을 수행한다. 스택기반의 가상머신이다. (ARM 아키텍쳐 같은 하드웨어는 레지스터 기반으로 동작)
한정된 메모리를 효율적으로 사용하여 최고의 성능을 내기 위해서, 메모리 구조를 알아야 한다

 

실행과정
1)
프로그램이 실행되면 JVM OS로부터 이 프로그램이 필요로 하는 메모리를 할당 받는다.
2)
자바 컴파일러(javac)가 자바 소스코드(.java)를 읽어들여 자바 바이트코드(.class)로 변환시킨다.
3) Class Loader
를 통해 class파일들을 JVM으로 로딩한다.
4)
로딩된 class파일들은 Execution Engine을 통해 해서된다.
5)
해석된 바이트코드는 Runtime Data Areas에 배치되어 실질적인 수행이 이루어진다.
이런 과정 속 JVM Tread Synchronization GC같은 관리작업을 수행한다.

 

Class Loader(클래스 로더) : JVM내로 클래스(.class파일)를 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈. Runtime시에 참조. 클래스를 처음 참조할때, 해당 클래스를 로드하고 링크.


Execution Engine(
실행 엔진) : 클래스를 실행시키는 역할. 클래스 로더가 JVM내의 런타임 데이터 영역에 바이트 코드를 배치시키고, 실행엔진에 의해 실행된다. 바이트코드를 실제 JVM내부에서 실행할 수 있는 형태로 변경한다.
1) Interpreter(
인터프리터) : 자바 바이트 코드를 명령어 단위로 읽어서 실행한다. 한 줄씩 수행하여 느리다.
2) JIT(Just-In-Time) :
해당 메서드가 얼마나 자주 수행되는지 체크하고 일정 정도가 넘을 때, 바이트 코드 전체를 네이티브 코드로 변경하여, 이후부터는 네이티브 코드로 직접 실행하는 방식이다.


Garbage Collector(
가비지 콜렉터) : GC를 수행하는 모듈(스레드)이 있다.

 

Runtime Data Area
프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간.
1) PC Register :
스레드가 시작될 때 생성, 스레드마다 하나씩 존재. 어떤 부분을 어떤 명령으로 실행해야 할지 기록. 현재 수행중인 JVM명령의 주소를 갖는다.
2) JVM
스택 영역 : 프로그램 실행과정에서 임시로 할당되었다가 메소드를 빠져나가버리면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역. 임시 데이터 저장.
3) Native method stack :
기계어로 작성된 프로그램을 실행 시키는 영역
4) Method Area(Class area, Static area) :
클래스 정보를 처음 메모리 공간에 올릴 때, 초기화 되는 대상을 저장하기 위한 메모리 공간.
4-1) Field Information :
멤버변수의 이름, 데이터 타입, 접근 제어자 정보.
4-2) Method Information :
메소드의 이름, 리턴타입, 매개변수, 접근 제어자 정보.
4-3) Type Information : class
인지 interface인지의 여부 저장.
5) Heap(
힙 영역) : 객체를 저장하는 가상 메모리 공간. new연산자로 생성된 객체와 배열 저장.

5-1) Permanent Generation : 생성된 객체들의 정보의 주소값이 저장된 공간.
5-2) New/Young
영역 :
Eden –
객체들이 최초로 생성되는 공간.
Survivor 0/1 - Eden
에서 참조되는 객체들이 저장되는 공간
5-3) Old
영역 : New area에서 일정 시간 참조되고 있는, 살아남은 객체들이 저장되는 공간. Eden영역에 객체가 가득차게 되면 첫번째GC가 발생. Eden영역에 있는 값들을 Survivor영역에 복사, 이 영역을 제외한 나머지 영역의 개체 삭제.
인스턴스는 소멸 방법과 소멸 시점이 지역 변수와는 다르기에 힙이라는 별도의 영역에 할당된다. JVM은 매우 합리적으로 인스턴스를 소멸시킨다.

기본 용어 : 클래스, 객체, 인스턴스, 메소드, 생성자, 

클래스(Class)

객체를 정의하는 틀, 설계도. 객체의 상태를 나타내는 필드(field)와 객체의 행동을 나타내는 메소드(method)로 구성.

 

객체

물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신과 다른 것을 식별가능한 것을 말한다. 상태와 행동( 또는 속성과 동작)으로 구성되어 있다.

 

인스턴스

클래스를 사용하기 위해서는 해당 클래스 타입의 객체를 선언해야 한다. 클래스로부터 객체를 선언하는 과정을 클래스의 인스턴스화 라고 하고, 이렇게 선언된 해당 클래스 타입의 객체를 인스턴스(Instance)라고 한다. 즉, 메모리에 할당된 객체를 의미.

 

메소드

클래스는 멤버로 속성을 표현하는 필드와 기능을 표현하는 메소드를 갖는다. 메소드란 어떠한 특정 갖업을 수행하기 위한 명령문의 집합을 의미. 하나의 클래스에 같은 이름의 메소드를 둘 이상 정의할 수 없다. 하지만 메소드 오버로딩을 이용하면 같은 이름의 메소드를 중복하여 정의할 수 있는데, 매개변수의 개수나 타입을 다르게 하여 같은 메소드 오버로딩을 한다. 아래에서 public이 접근 제한자, void가 return 타입, (    )가 parameter, return이 리턴.

public class TestClass{

     public void testMethod(   ) {

 

          return;

         

          }

}

 

생성자

클래스 이름의 메소드 형태이고, 객체를 생성할 때 단 한번 실행한다. 

GC(Garbage Collection)

가비지 컬랙션(GC, Garbage Collection)
Minor GC :
새로 생성된 대부분의 객체는 Eden영역에 위치. Eden영역에서 GC가 한번 발생 후 살아남은 객체는 Survivor영역 중 하나로 이동. 이 과정을 반복하다 계속해서 살아남은 객체는 Old영역으로 이동.
Major GC : Old
영역의 모든 객체를 검사하여 참조되지 않은 객체를 한꺼번에 삭제. 시간이 오래걸림, 프로세스 정지됨(stop-the-world). Major GC가 발생하면 GC를 실행하는 스레드를 제외한 나머지 스레드 STOP. GC 완료 이후에 작업 재개.

원리
힙 내의 객체 중에서 가비지(Grabage)를 찾아내고 처리해서 힙의 메모리를 회수한다. 참조되고 있지 않은 객체(Instance)를 가비지라고 하며, 가비지의 판단은 reachability라는 개념을 사용. 힙 영역에 할당된 객체가 유효한 참조가 있으면 reachability, 없다면 unreachablity로 판단한다. 참조 사슬 중 최초의 참조한 것을 Root Set이라고 칭한다.

Collection

DataStructure를 직접 구현하지 않고 편하게 사용할 수 있다. 객체를 보관하기 위한 공간을 미리 정하지 않아도 되므로, 상황에 따라 객체의 수를 동적으로 정할 수 있다.
List :
직접 @Override를 통해 사용자가 정의할 수 있다. 대표적 구현체로는 ArrayList가 존재한다. 이는 기존에 있었던 Vector를 개선한 것이다.
Map : HashMap
존재. Key-Value구조, 중복 X, 순서 X. LinkedHashMap은 순서를 보장한다.
Set : HashSet
존재. MapKey-Value구조에 Key대신 Value가 들어가 ValueKey로 하는 자료구조일 뿐. LinkedHashSet은 순서를 보장한다.
Stack
Queue : Stack 객체는 직접 new 키워드 사용가능. Queue 인터페이스는 LinkedListnew 키워드를 적용하여 사용 가능.

Annotation

주석과는 역할이 다르지만, 주석처럼 코드에 달아 클래스에 특별한 의미를 부여하거나 기능을 주입할 수 있다. 해석되는 시점을 정할 수 있다.
built-in- annotation : JDK
에 내장 되어있음
Meta annotation :
어노테이션에 대한 정보를 나타내기 위한 어노테이션
Custom Annotation :
개발자가 직접 만들어 냄

Generic

제네릭은 자바에서 안정성 담당. 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에서 사용. 컴파일과정에서 타입체크를 해주는 기능이다. 객체의 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안전성을 높이고 형변환의 번거로움을 줄여진다. Collection에 특정 객체만 추가될 수 있도록. Collection 내부에서 들어온 값이 내가 원하는 값인지 별도의 로직처리를 구현할 필요가 없어진다. API를 설계하는데 있어서 보다 명확한 의사전달이 가능해진다.

Final Keyword

final class : 다른 클래스에서 상속하지 못한다.
final method :
다른 메소드에서 오버라이딩하지 못한다.
final variable :
변하지 않는 상수값이 되어 새로 할당할 수 없는 변수가 된다.
finally : try-catch or try-catch-resource
구문을 사용할 때, 정상적으로 작업을 한 경우와 에러가 발생했을 경우를 포함하여 마무리 해줘야 하는 작업지 존재하는 경우에 해당하는 코드를 작성해주는 코드 블록.
finialize() : keyword
도 아니고 code block도 아닌 메소드이다. GC에 의해 호출되는 함수. 절대 호출하면 안됌. 오버라이딩 되어 있으면 GC가 지연, OOME(Out of Memory Exception)이 발생할 수 있다.

Overriding VS Overloading

둘 다 다형성을 높여주는 개념. 같은 이름의 다른 함수를 호출한다는 것.
Overriding(
오버라이딩) : 상위 클래스, 인터페이스에 존재하는 메소드를 하위 클래스에서 필요에 맞게 재정의하는 것. 자바는 오버라이딩 시 동적바인딩된다.
Overloading(
오버로딩) : 메소드 이름과 return 타입은 동일하지만, 매개변수만 다른 메소드를 만드는 것. 자바는 오버로딩 시 정적바인딩 된다.

Access Modifier

변수 또는 메소드의 접근 범위를 설정해주기 위해서 사용하는 JAVA의 예약어.
public :
어떤 클래스에서라도 접근 가능.
protected :
클래스가 정의되어 있는 해당 패키지 내, 해당 클래스를 상속받은 외부 패키지 접근 가능.
(default) :
클래스가 정의되어 있는 해당 패키지 내에서만 접근 가능.
private :
정의된 해당 클래스에서만 접근 가능.

Wapper class

기본 자료형에 대한 클래스 표현. Integer, Float, Boolean. 컬렉션에서 제네릭을 사용하기 위해서 Wrapper class를 사용해줘야 한다. 자바 내부에서 AutoBoxing해준다.

Multi-Tread환경에서의 개발

Field member : 필드(field)는 클래스에 변수를 정의하는 공간. 객체가 여러 스레드가 접근하는 싱글톤 객체라면 field에서 상태값을 갖고 있으면 안된다. 모든 변수를 parameter로 넘겨받고 return하는 방식으로 해야한다.
동기화(Synchronized) : 필드에 Collection이 불가피하게 필요할 때, synchronized 키워드를 사용하여 스레드 간 race condition을 통제한다. List를 대신하여 Vector를 사용할 수 있고, Map을 대신하여 HashTable
사용할 수 있다. Collections라는 util클래스에서 제공되는 static메소드를 통해 이를 해결할 수 있다. Collections.synchronizedList()Collections.synchronizedSet()Collections.synchronizedMap() -> ConcurrentHashMap이라는 구현체 사용이 좋은 성능을 낸다.

ThreadLocal

스레드 사이에 간섭이 없어야 하는 데이터에 사용한다. 멀티스레드 환경에서는 클래스의 필드에 멤버를 추가할 수 없고 매개변수로 넘겨받아야 하기 때문이다. , 스레드 내부의 싱글톤을 사용하기 위해 사용한다.
1) ThreadLocal
객체를 생성한다.
2) ThreadLocal.set()
메서드를 이용해서 현재 스레드의 로컬 변수에 값을 저장한다.
3) ThreadLocal.get()
메서드를 이용해서 현재 스레드의 로컬 변수 값을 읽어온다.
4) ThreadLocl.remove()
메서드를 이용해서 현재 스레드의 로컬 변수 값을 삭제한다.

기본 용어 정리

JDBC : JAVA언어를 통해 데이터 베이스에 접근 할 수 있는 프로그래밍을 의미.

 

servlet : container가 이해할 수 있게 구성된 순수 자바 코드로만 이루어진 것.

 

JSP : html기반에 java코드를 블록화 하여 삽입한 것.

 

JDK : 자바 프로그램 개발 도구로써 개발을 위한 클래스, 컴파일러, 실행 및 배포도구를 포함한 개발 전반의 환경 제공.

구체적인 질문 LIST

Vector VS ArrayList

1. 동기화(Synchronize)
Vector –
동기 : 한번에 하나의 스레드만 접근 가능
ArrayList –
비동기 : 동시에 여러 스레드 접근 가능. 그럴 경우, 명시적으로 동기화하는 코드를 추가해야함.
2.
스레드 안전(Thread Safe)
멀티 스레드시 Vector는 한번에 하나의 스레드만 접근 가능해서 안전하지만, ArrayList는 동기화할 필요가 있다.
3.
성능
ArrayList
는 비동기여서 동기화된 벡터보다 빠르다.
4.
크기 증가
Vector
는 현재 크기의 100%증가 가능.
ArrayList
는 현재 크기의 50%증가 가능.

 

자바의 특징

1) OOP(객체 지향 언어) : 부품에 해당하는 객체들을 먼저 만들고, 이것들을 하나씩 조립해 전체 프로그램을 완성하는 개발 기법.

2) GC(가비지 컬렉션)에 의한 메모리 자동 관리

3) 멀티 스레드 지원.

4) JVM위에서 동작. 특정 OS에 종속적이지 않고 이식성(하나 이상의 OS에서 사용 가능한지 여부)이 좋으며, 보안성이 좋다.

5) 다양한 Open 라이브러리 존재.

 

자바를 만든 사람

제임스 고슬링 : 자바 커피를 10여잔씩 마심. 유명한 커피 재배지인 인도네시아 섬 이름인 자바섬에서 따옴.

 

변수

하나의 값을 저장할 수 있는 메모리 공간.

 

객체와 클래스의 차이점

클래스 : 현실 세계의 객체의 속성과 동작을 추려내 필드와 메서드로 정의한 것. 아직 메모리가 할당되지 않은 상태.

객체 : 이 클래스라는 설계도를 기반으로 실제 메모리가 잡힌 것을 의미. 

 

자바의 메모리 영역

메서드 영역 : static 변수, 전역변수, 코드에서 사용되는 Class정보.

스택 : 지역변수, 함수

힙 : new연산자를 통한 동적할당된 객체. GC에 의해 메모리 관리.

 

추상메서드, 추상 클래스

추상 메서드 : 메서드의 정의부만 있고 구현부는 없는 메서드

추상 클래스 : 추상 메서드를 적어도 하나 이상 가지고 있는 클래스. 자식 클래스에서 오버라이딩이 필요한 추상메서드를 가지고 있기 때문에 객체화 할 수 없다.

 

인터페이스

모든 메서드가 구현부가 없는 추상메서드로 이루어진 클래스. 자바의 다형성을 극대화하여 개발코드 수정을 줄이고 프로그램 유지보수성을 높이기 위해 인터페이스를 사용한다.