컴파일 과정에 대해 설명해보라
- 개발자가 .java파일을 생성한다
- build를 한다.
- java compiler의 javac의 명령어를 통해 바이트코드(.class)를 생성 (Compiler)
- class loader를 통해 jvm내로 로드 (Interpreter)
- 실행 엔진을 통해 컴퓨터가 읽을수 있는 기계어로 해석되어 Runtime Data Area에 배치
- Runtime Data Area : JVM 메모리 영역 (Heap + Stack + PC 레지스터 등)
- JVM 메모리 구조
- 스레드별 : PC register , JVM Stack , Native Method Stack
- PC 레지스터 : 현재 수행중인 JVM 명령어가 들어가 있고 다음 명령어의 주소를 가지고있다
- JVM Stack : 호출된 메소드의 매개변수, 지역변수, 리턴 정보들이 저장됨
- Native Method Stack : 자바 외의 언어인 C나Cpp를 수행하기 위한 영역
- 공통 : Method Area, Heap
- Method Area : 클래스별로 전역변수, 정적 변수, 메소드 정보들이 저장
- Heap : 런타임중 생성되는 객체들이 동적으로 할당되는 곳
- 스레드별 : PC register , JVM Stack , Native Method Stack
- JVM 메모리 구조란? (JAVA)
Compiler vs Interpreter
- 고급 언어를 기계어로 번역하여 프로그램을 실행하는 것은 동일하다.
- Complier
- 고급언어를 한번에 번역을한다. → 번역 시간이 오래걸림
- 그러나 한번만 번역을 하고 나면 실행만 하면 되기때문에 실행시간이 빠름
- 하드웨어에 종속적
- Interpreter
- 고급언어를 한줄씩 번역을 한다. → 번역 시간은 빠른 편
- 그러나 실행 파일을 생성하지 않았기 때문에 매번 번역해야함 → 실행 속도가 느림
- 하드웨어에 종속적이지 않음
String, StringBuilder, StringBuffer의 차이
- String
- 객체 불변이기 때문에 변하지 않는 문자열은 String을 사용
- java String 불변객체인 이유
- heap에 프로그램 사용중에 선언했던 String의 객체 값이 사라지지않고 heap에서 존재하고있다.
- 문자열이 가장 많이 사용되는 변수이기 때문에 heap을 절약하기 위해 불변성을 가지고 사용
- 캐싱기능, 보안 기능. 스레드 안정성
- StringBuilder
- 비동기방식이기 때문에 single thread 환경하에서, 변화되는 문자열에 사용됨
- 처리속도가 빠름
- StringBuffer
- 동기방식으로 저장되기 때문에 멀티스레드로 접근하거나 문자열이 변경될때 사용
자바의 접근 제어자와 특징
- public
- 어떤 클래스에서라도 접근이 가능
- protected
- 동일 패키지내의 클래스 또는 해당 클래스를 상속받은 외부 패키지의 클래스에서 접근 가능
- default
- 동일 패키지 내에서만 접근이 가능
- private
- 해당 클래스에서만 접근이 가능
💡 private < default < protected < public 순으로 접근 범위 넓음
Garbage Collector가 무엇인가?
- GC는 JVM에서 메모리를 관리해주는 모듈이다
- Heap 메모리를 재활용 하기 위해 더이상 참조되지 않은 객체를 메모리에서 제거
- 개발자의 개발 속도는 향상되지만 Mark and Sweep 이라는 과정에서 참조되지 않은 객체를 찾는 과정이 있는데, 이때 스레드가 중단되는 시점이 있어 성능이 떨어지는 단점도 있다.
클래스, 객체, 인스턴스의 차이
- Class
- 연관되어있는 변수와 메서드의 집합
- 객체를 만들어 내기 위한 틀
- Object
- 소프트웨어 세계에 구현할 대상
- Instance
- 구현되어 메모리에 올라간 구체적인 실체
- 인스턴스는 객체에 포함된다
💡 객체 vs 인스턴스 클래스 타입으로 선언되었을 때 객체라고 부르고 그 객체가 메모리에 할당되어 실제로 사용될때 인스턴스라고 부름
💡 클래스 vs 객체 클래스는 설계도 , 객체는 설계도로 구현한 모든 대상
Interface와 abstract class 차이 (목적의 차이)
- Interface : 확장, 함수의 구현을 강제해 같은 동작을 하도록 하는 목적
- abstract class : 공통된 부분을 모으는 것 , 상속 & 재사용
Call by Reference 와 Call by Value의 차이
- 직접 참조 와 복사의 차이
- 자바는 어디에 해당하는가?
- Call by Value
HashMap vs HashTable vs ConcurrentHashMap의 차이
- HashMap
- 동기화(thread-safe) 보장 안됨
- null 허용
- HashTable , ConcurrentHashMap
- 동기화 보장
- null 허용 x
- 성능은 ConcurrentHashMap이 더 우수하다
- 두 개의 구현 방식이 다르기 때문에
- HashTable : 메소드 전체에 락을 걸어서 사용
- ConcurrentHashMap : 세그먼트 별로 락을 사용
- 두 개의 구현 방식이 다르기 때문에
java immutable Object (불변객체)
- 불변객체는 재할당은 가능하지만, 한번 할당하면 내부 데이터를 변경할 수 없는 객체
- 장점
- 객체에 대한 신뢰도가 높아진다. 객체가 한번 생성되어 변경되지 않으면 transaction내에서 변경이 없다라고 할 수 있기 때문
- 생성자, 접근 메소드에 대한 방어 복사가 필요없다.
- 멀티스레드 환경에서 동기화 처리 없이 객체를 공유할 수 있음
- 단점
- 객체가 가지는 값마다 새로운 객체가 필요함
- 따라서 메모리 누수와 새로운 객체를 계속 생성해야하기 때문에 성능 저하 발생
- 객체가 가지는 값마다 새로운 객체가 필요함
- 불변 class 만드는 방법
- 모든 class field 변수는 final로 선언
- 모든 class field 변수의 setter 메서드 선언 X
- class를 상속하지 못하도록 선언(class를 final로 선언 / 생성자를 private로)
- 모든 field 변수가 final이 아닐때, 즉 가변객체타입의 필드 변수가 있을 경우 그 가변객체타입의 필드 변수에 대해 직접적으로 접근하지 못하도록
- copy객체를 생성하여 새로운 인스턴스를 반환하도록 방어적 복사본 전략 사용
new String() 과 “ ”으로의 선언 차이
- 리터럴을 이용한 방식 : String s1 = “”;
- string constant pool 영역에 생성
- String의 intern()메소드 호출
- intern() : 주어진 문자열이 pool에 존재하는지 검색하고, 있다면 주소값 반환 / 없다면 pool에 넣고 새 주소값 반환
- new 연산자를 이용한 방식 : String s2 = new String(””);
- heap영역에 생성
java ==와 equals의 차이
- “==” : 비교하고자 하는 두 개의 대상의 주소값을 비교
- String 클래스의 equals메소드 : 비교하고자 하는 두개의 대상의 값 자체를 비교
- 자바에서 문자열을 비교하기 위해서는 equals를 사용해야함
제네릭이란? , 왜 쓰는지?
- 제네릭을 지원하기전에는 컬렉션에서 객체를 꺼낼때마다 형변환을 해야했다
- 제네릭을 사용하면 컬렉션이 담을 수 있는 타입을 컴파일러에 알려준다
- 컴파일 과정에서 오류를 차단 할 수 있다(안전하고 명확한 프로그래밍 가능)
라이브러리와 프레임워크의 차이
- 라이브러리는 개발자가 필요한 기능만 사용해도 된다
- 프레임워크는 개발 주도권이 프레임워크에게 있음
- 프레임워크가 정해놓은 개발 방법대로 그대로 따라야함
지식 출처
https://www.youtube.com/watch?v=a-f0HxYRNiM
반응형
'이론 공부! > 기술 면접 준비' 카테고리의 다른 글
[Data Strucutre] 면접 질문 대비 (0) | 2022.08.24 |
---|---|
[Data Structure] Hash Table, Graph 정리 (0) | 2022.08.24 |
[Data Structure] Tree 관련 정리 (0) | 2022.08.24 |
[Data Structure] Array, ArrayList, Stack, Queue (0) | 2022.08.24 |
[개발 지식] 객체 지향 4대 특징과 설계 원칙 (0) | 2022.08.24 |