면접 준비도 할겸 Java 관련 면접 리스트를 정리해 보려고 합니다.
java는 객체지향, 컴파일하면 가상 운영체제인 JVM에서 실행가능한 바이트코드 형태의 클래스 파일이 생성되고, JVM을 통해 실행. 링크 과정없이 컴파일러가 바로 바이트 코드 생성. (운영체제가 바뀌어도 소스코드를 새로 작성하지 않아도 된다.)
C/C++은 절차지향, 소스를 컴파일하면 바로 실행될 수 있는 실행파일 생성. 컴파일러가 오브젝트 코드 생성 후, 라이브러리를 링크하여 최종 실행파일 생성.
절차지향
: 실행하고자 하는 절차를 정하고 절차대로 프로그래밍, 일의 흐름에 중점.
객체지향
: 실제 물체를 객체로 표현하고, 이들의 관계, 상호 작용을 프로그램으로 나타낸다. 함수나 변수, 재활용성(하나의 클래스가 여러 개의 인스턴스가 될 수 있다)
=> 상속, 재사용성, 유지보수에 좋다, 코드 변경 용이
=> 자바의 경우 항상 call by value로 값을 넘긴다. (reference는 주소값을 복사함). 객체를 메소드로 넘길 때 객체를 참조하는 지역변수의 실제 주소를 넘기는 것이 아니라 그 지역변수가 가리키고 있는 힙 영역의 객체를 가리키는 새로운 지역변수를 생성하여 같은 객체를 가리키도록 한다. 따라서 call by value만으로도 처리 가능하다.
Call by value의 경우, 데이터 값을 복사해서 함수로 전달하기 때문에 원본의 데이터가 변경될 가능성이 없다. 하지만 인자를 넘겨줄 때마다 메모리 공간을 할당해야해서 메모리 공간을 더 잡아먹는다.
Call by reference의 경우 메모리 공간 할당 문제는 해결했지만, 원본 값이 변경될 수 있다는 위험이 존재한다.
Overriding
임의의 클래스가 다른 클래스를 상속 받거나 인터페이스를 구현했을 때, 상위 클래스 또는 인터페이스에 정의되어 있는 메소드를 재정의 하여 사용하는 것이다. 메소드 호출 시 재정의되어 있지 않다면 상위 클래스의 메소드가 호출된다. (인터페이스는 오버라이딩이 강제된다.)
Overloading
메소드에 주어진 인자(parameter)에 따라 동작을 다르게 구현할 수 있다. 코드의 중복이 줄어들고, 가독성이 늘어난다. 반환 형(return type)은 관계가 없지만, 인자의 개수, 인자의 타입에 따라 다르게 구현할 수 있다.
검색할 수 있는 인터페이스
데이터를 삽입할 때 Key와 Value의 형태로 삽입되며, Key를 이용해서 Value를 얻을 수 있다.
HashMap: key와 value로 이루어지고 중복을 허용하지 않으며 순서가 없다. O(1)
TreeMap: Tree구조이기에 순서를 보장한다. O(logn)
LinkedHashMap: LinkedList로 구현된 HashMap으로 List로 되어있기에 순서는 보장되나 랜덤접근에서는 느릴 수 있다. O(n)
순서가 있는 Collection, 데이터를 중복해서 포함할 수 있다. 구현 방법에 따라 ArrayList, LinkedList가 들어갈 수 있다.
ArrayList: 자바의 Vector를 개선한, 배열로 구현된 List로 리스트의 연산 수행시간 속도는 배열과 같다. 데이터에 대한 인덱스를 가지고 있어 데이터 검색에 적합하다.
LinkedList: 다음 노드의 주소를 기억하는 List로, 배열에 비해 삽입과 삭제가 간단하다. 탐색의 경우에는 처음부터 탐색하기 때문에 느리다.
집합적인 개념의 Collection. 순서의 의미가 없다.
데이터를 중복해서 포함할 수 없다.
HashSet : Key값이 없는 자료형. 순서 보장X, 중복허용 X, 해쉬 알고리즘을 사용하여 검색 속도가 빠르다.
TreeSet : 이진 탐색 트리 형태로 요소를 저장한다. 레드-블랙 트리로 구현되어 있다.
stack: 나중에 들어온애를 먼저 뽑기
Queue: 먼저 들어간애를 먼저 뽑기
객체의 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안전성을 높이고 형변환의 번거로움을 줄여준다
한 자원에 동시에 접근하는 것 제한
순차적으로 진행
다음에 실행될 명령은 현재 실행 중인 명령 종료 시까지 대기 (대기시간 버퍼링 발생)
서버와 클라이언트가 주고 받는 것이 동시에 이루어지는 형태
시간적인 동기화가 필요한 곳에 많이 사용
ex. 현금인출기
Java에서 synchronized 키워드 사용
자바에서 멀티 스레드 접근 제한 키워드
메소드 단위, 블록 단위 적용 가능
단, 메소드 단위로 지정할 경우 메소드 전체에 lock이 걸리기 때문에 가능하면 블록 활용 (임계 영역은 작을 수록 좋음)
현재 실행 중인 명령이 종료되지 않아도 다음 명령 실행 가능
Callback 함수를 통해 결과 확인
ex. Ajax, Thread
main이 static인 이유는 가장 먼저 실행되어야 하기 때문에 객체 생성 없이도 메모리에 할당시켜 프로그램을 실행하기 위해 static으로 해야한다.
Public – 접근 제한이 없다.(같은 프로젝트 내에 어디서든 사용 가능)
Protected – 같은 패키지 내, 다른 패키지에서 상속 받아 자손 클래스에서 접근 가능
Default – 같은 패키지 내에서만 접근 가능
Private – 같은 클래스 내에서만 접근 가능
StringBuffer/StringBuilder: 가변성. 동일 객체 내에서 문자열 변경 가능. StringBuffer는 동기화 지원(멀티쓰레드), StringBuilder는 동기화 지원하지 않기에 단일쓰레드에서 사용
동기(Synchronous) 방식
요청을 보내고 실행이 끝나면 다음 동작을 처리하는 방식
순서에 맞추어 진행되기 때문에 제어하기 쉽다.
여러가지 요청을 동시에 처리할 수 없어 효율이 떨어진다.
동기 방식의 예시로는 콜센터 종업원이 일을 처리하는 방식이 될 수 있다. 콜센터의 직원은 한 손님의 전화 응대가 끝난 후에 다음 손님의 응대를 진행할 수 있다.
비동기(Asynchronous) 방식
요청을 보내고 해당 동작의 처리 여부와 상관없이 다음 요청이 동작하는 방식
작업이 완료되는 시간을 기다릴 필요가 없기 때문에 자원을 효율적으로 사용할 수 있다.
작업이 완료된 결과를 제어하기 어렵다.
비동기 방식의 예제로는 이메일이 있다. 우리는 한 사람에게 이메일을 보냈을 때 답변을 받지 않고도 이메일을 다시 보낼 수 있다.
출처: https://mangkyu.tistory.com/88 [MangKyu's Diary]
https://mangkyu.tistory.com/94
테코톡 유튜브 강의
Garbage Collector 과정
1) Stack 영역의 모든 변수를 스캔하면서 어떤 객체를 참조하고 있는지 마킹한다. => Mark
2) 마킹한 객체(Reachable Object)가 참조하고 있는 객체도 찾아서 마킹한다. 연결-연결 => Mark
3) 마킹되지 않는 객체는 heap영역에서 제거한다. => Sweep
Q. 언제 Garbage Collector가 일어날까?
- Eden 영역에 새로운 객체들이 할당되는데 Eden이 가득 차게 되면 GC가 발생한다. (Minor) Eden 영영의 Reachable 객체는 Survival 0으로 옮겨지고 Unreachable 객체는 메모리에서 해제된다.
- Survival 0영역도 가득차면 GC가 발생한다. 연결되어 남은 객체는 Survival 1로 이동한다. Age 증가.
- Survival 1도 가득차면 Survival 0으로 이동되고 Age가 증가한다.
- 특정 Age값 이상이 되면 Old Generation으로 이동하게 되는데 이를 Promotion이라고 한다. Old도 가득 차면 GC 발생 (Major)
Garbage Collector의 종류
1) Serial GC
2) Parallel GC
3) Concurrent Mark Sweep GC
4) G1 GC
JAVA SE (Java Platform Standard Edition)
데스크톱, 서버, 임베디드시스템을 위한 표준 자바 플랫폼. JAVA EE,ME는 목적에 따라 SE를 기반으로 기존의 일부를 택하거나 API를 추가하여 구성된다. SE는 가장 일반적으로 사용된다. JDBC나 기본적인 기능이 모두 포함되어 있기 때문에 Android개발할때 주로 SE를 사용한다.
JAVA EE (Java Platform EnterPrise Edition)
자바를 이용한 서버측 개발을 위한 플랫폼. 기존 SE에 웹 애플리케이션 서버에서 동작하는 분산 멀티미디어를 제공하는 자바의 기능을 추가한 서버를 위한 플랫폼. JAVA SE에 서버측을 위한 기능을 부가하였기 때문에 SE기능을 모두 포함한다.
JAVA ME (Java Platform Micro Edition)
이름에서 알 수 있듯이 임베디드를 위한 자바 플랫폼이다. 제한된 자원을 가진 휴대전화, PDA, 세트톱박스 등에서 Java프로그래밍 언어를 지원하기 위해 만들어진 플랫폼이다.
참고 링크
https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/Java
https://github.com/WeareSoft/tech-interview/blob/master/contents/java.md
https://gmlwjd9405.github.io/2017/10/01/basic-concepts-of-development-java.html
10분 테크톡