면접을 준비하자 - 자바편
클래스와 객체에 대해서 설명해보세요.
객체는 실제하는 사물, 대상을 말합니다. 클래스는 이런 객체의 설계도이며 틀 입니다.
예를 들어, 학생이라는 객체를 위해서 클래스는 이름과 공부하기 같은 속성 행위에 대한 설계를 가집니다.
클래스라는 설계를 통해 실체를 가지는 객체를 구현 할 수 있습니다.
<br/>
<br/>
OOP에 대해서 설명해보세요.
OOP는 객체지향언어의 약자입니다.
객체지향 언어와 상반되는 절차지향언어가 있습니다.
예를 들어, 자판기프로그래밍을 설계한다면 절차지형언어는 돈을 넣고, 버튼을 누르고, 커피를 선택하는 것과 같이 절차적인 관점에서 프로그래밍한다면
객체지향연어는 돈, 버튼, 자판기, 커피등 객체를 추출하여, 이들간의 관계와 상호작용에 연관을 두어 프로그래밍 합니다.
<br/>
<br/>
자신을 OOP관점에서 설명해보세요.
OOP 관점에서 객체를 추출하며 이들간의 상속관계로 정의합니다.
예를 들어, 사람, 프로그래머, 컴퓨터라는 객체를 추출합니다.
프로그래머 객체는 사람객체를 상속받고, 컴퓨터와 연간관계를 맺으며 코딩한다는 행위를 수행합니다.
프로그래머 클래스의 설계도를 가지고 실체를 구현하여 저를 정의합니다.
<br/>
<br/>
OOP의 장점이란?
????
<br/>
<br/>
OOP의 특징에 대해서 설명해보세요.
OOP는 상속, 다형성, 캡슐화의 특징을 가집니다.
상속은 상위객체의 속성 행위를 하위개체가 물려받아 코드를 재사용 할 수 있습니다.
다형성은 하나의 행위가 여러 환경에서 다양하게 동작하는 것을 말합니다. 오버로딩, 오버라이딩과 관련있습니다.
캡슐화는 공통된 속성과 행위를 하나로 묶는 것을 말합니다. 캡슐화로 인하여 외부로부터의 접근이 차단되며 은닉화라고 명칭합니다.
<br/>
<br/>
JAVA의 메모리영역에 대해서 설명해보세요.
java는 세 가지 메소드, 스택, 힙영역으로 구분됩니다.
메소드 영역에는 클래스, 메소드, static 변수가 올라가며,
스택영역에는 기본형과, 지역변수, 매개변수, 힙영역의 객체를 가리키는 주소값들이 저장됩니다.
힙영역에는 실제 객체가 저장됩니다.
<br/>
<br/>
추상화란 무엇인가요?
추상화는 필요한 부분을 보여주고, 필요하지 않는 부분을 감추는 것을 말합니다.
<br/>
<br/>
일반화란 무엇인가요?
일반화는 하위개체에 공통된 특성을 추출하여, 상위개체로 정의하는 것을 말합니다.
<br/>
오버로딩 오버라이딩에서 대해서 설명해보세요.
오버로딩은 하나의 클래스 내부에서 동일한 메소드를 매개변수 타입과 개수를 달리하여 여러정의 할 수 있는 것을 말합니다.
오버라이딩은 상속관계에서 하위클래스가 상위클래스의 행위를 재정의하는 것을 말합니다.
<br/>
<br/>
JVM의 역할에 대해서 설명해보세요.
JVM은 자바프로그램을 실행시키는 주체입니다.
자바컴파일러는 .java파일을 .class파일인 자바바이트코드로 컴파일합니다.
OS는 이를 이해 할 수 없기에, JVM은 OS가 이를 이해할 수 있도록 도와주며, 따라서 OS에 상관없이 자바프로그램이 구동이 가능합니다. 또한 JVM은 메모리관리, 가비지컬렉션을 수행합니다.
<br/>
<br/>
JVM 구조에 대해서 설명해보세요.
JVM은 크게 4가지 구조로 나뉘어 집니다.
GC, Excution Engine, Class Loader, Runtime Data Area 입니다.
ClassLoader는 자바바이트코드파일인 .class파일을 엮어써, JVM이 운영체제로부터 할당받은 Runtaime Data Area에 적재하는 역할을 합니다.
Excution Engine은 ClassLoder에 의해 적재된 바이트코드들을 기계어로 변경해 명령어 단위로 실행하는 역할을 합니다.
Runtime Data Area는 JVM의 메모리 영역으로 자바어플리케이션을 실행할 때 사용되는 데이터들이 적재된 영익입니다.
GC는 가비지 컬렉터로 참조되지 않는 가비지를 메모리 해제 하는 역할을 합니다.
<br/>
<br/>
가비지컬렉션(GC)의 구동원리에대해서 설명해보세요.
GC는 사용하지 않는 객체에 메모리 자원을 회수 하는 것을 말합니다.
가비지컬렉터를 수행할 때 stop-the-world라는 동작을 수행하는데, 해당 동작이 수행될때 모든 명령이 중지됩니다.
따라서, GC는 보수적인 관점에서 동작하는 데, "생성된 객체는 짧게 사용되어진다"라는 관점을 가집니다.
이에, 마이너영역과 올드영역으로 나누어 마이너영역에는 잦은 GC를 합니다.
마이너 영역은 Eden, Survive1, Survive2라는 영역을 가지고, GC가 호출될때 Edend에서 Survive영역으로, 오랜객체는 Old 영역으로 이동합니다.
<br/>
<br/>
자바의 자료형에대해서 설명해보세요.
자바의 자료형은 기본형과, 레퍼런스타입으로 나눕니다.
기본형은 8가지 boolean, char, byte, short, int, long, float, double이 있습니다.
레퍼런스 타입은 배열, 객체등 주소값을 가지는 타입을 말합니다.
<br/>
<br/>
자바는 Call-by-value인가요? Call-by-reference 인가요?
자바는 Call-by-value입니다.
많이 혼동되는 부분인데, 레퍼런스 타입을 매개변수로 전달하였을 때 주소를 넘기는 것이 아닌 주소값을 복사하므로 Call-by-value가 맞습니다.
이를 증명하기위해 A객체를 매개변수로 받는 메소드에서 A객체에 NULL값을 주입해도,
전달하는 메소드에서는 객체의 값은 NULL이 아닙니다.
<br/>
<br/>
String, StringBuffer, StringBuilder의 차이는 무엇인가요?
String은 고정값을 가지지만, StringBuffer, StringBuilder는 가변적인 길이를 가집니다.
String은 고정값을 가지기에 + 연산, 또는 concat() 메소드를 호출한다면 새로운 String을 생성합니다.
따라서 길이가 가변적인 경우에는 StringBuffer, StringBuilder를 사용해야합니다.
StringBuffer는 동기화를 지원하며, StringBuilder는 동기화를 지원하지 않습니다.
<br/>
<br/>
정적바인딩과 동적바인딩에서 설명해보세요.
정적바인딩은 클래스 로딩시에 바인딩되며, 동적바인딩은 실행 시에 바인딩 됩니다.
실행 시에 바인딩은 즉 실행 시에 어떤 메소드를 호출 할지 결정되기 때문에 오버헤드가 발생합니다.
<br/>
<br/>
static 키워드에 대해서 설명해보세요.
static 키워드는 공통으로 사용할 변수와 행위에 사용하는 키워드입니다.
static 키워드는 클래스로딩시에 적재 됩니다.
때문에 static 키워드 내부에서는 아직 생성되지도 않았을지도 모르는 not-static 타입의 객체를 사용 할 수 없습니다.
<br/>
<br/>
final 키워드에서 설명해보세요.
final은 단어 뜻 그대로, 그대로 사용하라는 것입니다.
클래스, 메소드, 변수에 키워드를 붙여 사용할 수 있습니다.
클래스의 경우에는 상속이 불가, 메소드에는 오버라이딩 불가, 변수에 경우에는 값 변경이 불가합니다.
<br/>
<br/>
==, Equals()의 차이는 무엇인가요?
==연산은 레퍼런스타입인 경우 주소값을 비교합니다. 기본형인경우 값을 비교합니다.
Equals() 메소드는 내용을 비교합니다.
<br/>
<br />
**자바의 접근지정자에 대해서 설명해보세요?
자바의 접근지정자는 public, default, protected, private로 4가지가 있습니다.
public 지정자는, 모든 패키지내에서 자유롭게 접근가능합니다.
protected 지정자는 동일 패키지내에서, 또는 타패키지에서 상속받은 객체에서 접근가능합니다.
default 지정자는 동일 패키지내에서 접근가능합니다.
private 지정자는 클래스 내부에서 접근가능합니다.
<br/>
<br/>
제네릭이란 ? 쓰는 이유?
제네릭은 클래스에서 사용할 타입을, 외부에서 지정하는 기법을 말합니다.
??
<br/>
<br/>
컬렉션 프레임워크란?
자바에서 컬렉션 프레임워크란 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 방법을 제공하는 클래스의 집합을 의미합니다.
<br/>
<br/>
HashMap vs HashTable vs ConcurrentHashMap 차이점
우선 셋 모두 Map인터페이스를 구현한 Key,Value 구조의 컬렉션입니다.
HashTable은 동기화를 지원하며, Key, Value에 null을 허용하지 않습니다.멀티쓰레딩 환경에서 사용에 적합하며, 동기화 Lock 작업이 느리기 때문에 속도가 느립니다.
HashMap은 동기화를 지원하지 않습니다. 때문에 속도가 빠릅니다 .또한 Key, Value에 null을 허용합니다.
ConcurrentHashMap은 동기화를 지원하며, Key, Value에 null값이 허용되지 않습니다 .하지만 Map전체에 Lock을 걸지 않기 때문에, HashTable보다는 더 빠른 작업이 가능합니다.
<br/>
<br/>
List vs Set vs Map
Set은 데이터 집합이지만, 자료의 중복을 허용하지 않으며, 순서가 없습니다.
List는 데이터 집합이며, 자료의 중복을 허용하며, 순서가 있습니다.
Map은 Key, Value 구조를 가지며, 순서가 없고, Key의 중복을 허용하지 않습니다.
<br/>
<br/>
<br/>
final / finally / finalize
final 키워드는, 불변함을 의미 하는 키워드로 클래스, 메소드, 변수에 사용할 수 있습니다.
클래스에 사용하면 상속 불가, 메소드에 사용하면 오버라이딩 불가, 변수에 사용하면 상수로 지정됩니다.
finally는 try-catch 구문에서, 구문이 마치고 수행되어야 할 작업을 삽입하는 구문입니다. 예를 들어, 커넥션을 close()하는 작업을 구문에 삽입합니다.
finalize는 Object 클래스의 메소드이며, GC가 객체의 메모리를 해제하기 직전에 호출되는 메소드입니다.
<br/>
<br/>
자바의 얕은 복사, 깊은 복사
얕은 복사는 자바 레퍼런스 타입을 다루를 때 = 으로 값을 복사 할때 발생합니다. 주소값을 복사하기 때문에 결국 같은 객체를 가리키게 되고, 복사된 객체를 수정하면 , 복사되어진 객체 또한 값이 수정됩니다.
깊은 복사는 객체의 실제 값을 복사하여 값이 같은 새로운 객체를 생성합니다. 이는 값 복사이기 때문에 복사된 객체를 수정하더라도, 복사되어진 객체에는 영향이 없습니다.
<br/>