Java 면접대비 질문
Data type
종류
string ?
primitive : stack에 저장. byte, char, short, int, long, float, double, boolean
reference : 주소값 가리킴.
string : reference이지만 primitive처럼 동작. immutable이기 때문
new로 생성: heap에 새 객체, literal : string constant pool에서 intern() method 호출
Pass by value
primitive, reference, wrapper, string은 각각 어떻게 넘어가는지
primitive는 값 자체를 복사해 넘김
reference는 참조하는 주소를 복사해서 넘김
string을 넘긴 후 assign하면 주소가 바뀐 것이기 때문에 원래 값은 불변. immutable이기 때문.
Identity & Equality & hashCode()
각각의 정의
identity : 참조 비교. 동일한 객체를 가리키는지
equality : logical equality. 내용이 같은지
override하지 않는 경우 equals() method가 작동, ==와 같게 동작. (identity 비교)
address를 hash해 추출한 값. 사용 이유 : hash 값을 사용하느s collection에서 사용하기 때문.
1) hashCode() 비교 -> 이후 equals() 비교
객체 & class
객체, class, instance?
method signature?
overloading
access modifier
객체란 개념을 추상화하고 모델링한 요소. state와 behavior를 가짐.
class는 instance를 만들기 위한 설계도, instance는 class라는 설계도로 만들어진 메모리에 할당된 실체.
method signature : 이름과 parameter로 identify
overloading : 같은 이름의 method 여러 개 정의
access modifier : default, private, protected, public
Static & Final
각각의 정의,
final 종류 및 정의
static : 모든 instance에서 같은 값, class가 memory에 올라갈 때 heap으로 올라감.
final variable : 상수
static final : class의 유일 상수.
final method : override 불가
final class : extend 불가
Inheritance
overriding
다중상속
parent method를 재정의, dynamic binding. private override 시, 그냥 새로 정의 한 것이 됨.
다중상속 : diamond problem, A-B, A-C, B-D, C-D면 D는 B/C 중 골라 상속해야 하는데 뭘 고를지 모름.
Polymorphism
overloading vs overriding
static의 overloading vs overriding
overloading : 이름만 같게, static polymorphism, (정해짐)
overriding : 부모 method를 child method에서 재정의해 dynamic binding하는 것. (dynamic polymorphism) runtime에 어떤 게 실행될지 결정됨. upcasting / downcasting
static은 overloading만 가능.
abstract class, interface
추상화의 정의
abstract class 정의, interface 정의
abstraction : 불필요한 정보를 숨기고 중요한 정보만을 보여주는 것.
객체에서 : 공통된 속성, 행위 추출하는 것.
abstract class : abstract 로 정의됐거나 method 중 하나가 abstract인 것. extend한 것에서 abstract method를 구현 강제시킨다. instantiation 불가.
interface : 모든 method가 abstract method. default, static 정도는 가질 수 있다. method 구현 강제.
- 같은 default method를 interface를 다중상속하는 경우 override 필수.
둘 다 abstraction, upcasting으로 polymorphism 구현.
abstract class는 상속 관계, 따라서 확장에 주로 사용.
interface는 공통 행위 지정 시 유용.
1. interface 사용
2. 공통 함수만 필요한 경우, static이나 default 사용
- 만약 static으로 처리 가능하면 interface
- 불가능하면 abstract 사용 고려.
Exception handling
error vs exception
처리 방식
예외처리 방법
error: 치명적 오류, 수습 불가.
exception : 프로그램 내에서 수습 가능
try-catch-finally : return문 직전까지 수행하다 finally문을 수행.
try-with-resource : 괄호 안에 resource 넣음. 그러면 try 끝난 후 알아서 정리.
예외처리 방법
- 복구 : while + try-catch 사용해 복구
- 회피 : 위로 올려줌.
JVM
java virtual machine
구성요소
java 실행 과정
class loader : loading, linking, initializing
컴파일된 class 파일을 참조되는 순간에 올려줌.
runtime data area : thread (pc register, stac, native method stack), heap (object + static + runtime constant pool), metaspace (method)
- pc register : 실행 중인 instruction 주소값 담음
- stack : paramter, local variable, 리턴값 (method frame)
- native method stack : native code.
- heap : object, static, runtime constant pool. static이나 constant pool 많아지면서 바뀐 걸로.
execution engine : interpreter, JIT co mpiler, GC
1. 작성한 .java 파일을 java compiler가 .class 파일(byte code)로 변경한다.
2. JVM의 class loader가 .class 파일을 JVM에 로딩한다.
3. Execution engine이 로딩된 .class 파일을 실행한다.
Java에서 main 실행 과정
0. App.java 파일을 compiler가 .class 파일로 변환한다.
1. JRE가 static void main() method를 찾는다.
2. JVM이 실행된다.
- Class Loader가 App.class 파일을 JVM에 로딩한다.
- 추가로 App.class에서 import하는 java.lang package를 method area에 올린다.
3. main method가 stack에 올라간다.
- 이 때, main의 리턴 타입과 parameter 등이 frame으로 묶여 stack에 올라간다.
- Hello World!가 출력된다.
- 이후에는 main method가 실행 종료되었기 때문에 stack에서 해제된다.
4. main method가 끝났기 때문에 JRE는 JVM을 종료시키고 JRE도 종료된다.
GC
구조
삭제 방법
young : eden, survivor 0, survivor 1
old : old
삭제 방법 : reachability 사용. 참조되면 살리고 아니면 냅둠
minor gc : eden이 가득 차면 GC 수행. 살아남은 것은 survivor 0으로 이동, survivor 0에서 산 것은 survivor 1로 이동. survivor 1에서 산 것은 old로 이동.
major jc : old가 가득 차면 GC 수행. mark-sweep-compact. 지울 것 마킹, 삭제, memory fragmentation 막기 위한 compact.
Generic
type을 parameter화하는 것.
wildcard
memory pollution
유의점 : static은 generic 불가. 정의되기 전부터 사용하기 때문.
wildcard : 아무 타입 가능. ? extend T : T를 상속하는 것, ? super T : T 상위의 것.
?로 쓰는 경우에는 type 사용 불가
컴파일 한 후에는 T로 적은 것들도 다 Object로 변경. 그래서 잘못된 메모리 참조 가능할 수도 있음. 막기 위해서는 checkedList() 사용.
Wrapper class
정의
특징
constant pool
primitive type을 object로 감싼 것. boxing / unboxing 일어나며 성능 떨어질 수도 있음.
특징
- immutable
- wrapper class 비교는 ==가 아니라 equals() 사용.
constant pool
boolean은 t, f
숫자는 -128 ~ 127까지 constant pool에 들어가서 string과 같은 방식으로 동작. 때문에 127 비교는 true지만 128 비교는 false로 뜸.
String vs StringBuffer vs StringBuilder
비교
string : immutable, literal 사용 시 constant pool 사용. new 사용 시 heap 사용. thread-safe.
stringbuffer : mutable. 직접 값 변경, synchronization 보장.
stringbuilder : synchronization 보장 X
Java Thread
JVM은 static main() method class를 찾아 main thread를 만들고, 내부 코드 따라 thread 필요 시 thread 생성함.
java app은 모든 thread가 종료되어야 종료함. thread 끝 대기 함수는 .join()
Thread class를 override하거나 lambda function 사용하는 방식 : start() 호출. return value X, exception X
Callable interface를 implement하는 방식 : start() 호출. return value O, exception O
시작 method 호출 시 ready queue에 넣음.
java thread scheduling : first come, first serve / priority가 높은 것부터 처리 / round robin (quantum 값은 JVM이 조절)
너무 많은 thread로 성능 저하가 발생할 수 있기 때문에 thread pool에서는 thread 개수를 정해두고 ready queue에 있는 thread를 처리. 동시 처리 속도를 보장한다.
Collection
List
- arraylist : index. 조회 빠름, thread unsafe
- linkedlist : doubly linked list
- vector : thraed safe
- stack : vector의 구현체
Queue
- priorityqueue : heap, thread unsafe
- arraydeque : thread unsafe
Set : 중복 허용 X
- hashset : hash 사용, thread unsafe, hashCode() method 사용
- linkedhashset : 순서 O, thread unsafe
- treeset : thread unsafe, rb tree
Map : key 중복 X
- hashmap : hashCode(), equals() 사용해 equality 판단, thread unsafe
- linkedhashmap : 순서 O, thread unsafe
- hashtable : thread safe
thread safe를 위해서는 synchroizeXXX() 쓰면 됨.