JAVA

주니어 JAVA 개발자를 위한 100가지 질문

개발중인 감자 2023. 11. 18. 17:38

질문 출처 : 커리어리 사이트 

 

조서희 / 주니어 자바 개발자를 위한 100가지 질문 1 | 커리어리

"주니어 자바 개발자를 위한 100가지 질문" 1편입니다. 주니어 자바 개발자를 위한 100가지 질문 (2)...

careerly.co.kr

 

 

1️⃣ 기초

📌 JDK와 JRE의 차이점은 무엇입니까?

더보기

jdk : java development kit - java를 개발할 수 있는 도구 키트 

=> 자바를 개발하고 컴파일할 수 있도록해줌. JRE + 컴파일러 등이 들어감.

jre : java runtime enviroment - java를 개발할 수 있도록 도와주는 환경을 설정하도록 해줌. ,  

=> 자바가 돌아갈 수 있는 환경을 만들어줌. JVM이 여기에 들어감. 

 

 

📌 ==와 equals의 차이점은 무엇입니까?

더보기

== : 주솟값 비교

equals : 값 비교

call by reference 일 경우, 즉 참조 변수인 경우 주솟값이 변수에 담긴다.

그래서 값 비교는 equals로 해야함. 다만 이 경우 hashcode() 도 재정의 해줘야한다

 

 

📌 두 객체가 동일한 hashCode를 가지면 Equals()가 참이어야 합니다, 그렇죠?

더보기

아니다. 주솟값을 해시처리한 값이 해시코드지만, 

만약 해시충돌이 일어나 서로다른 주솟값이 같은 해시값을 같게 된다면 

equals()는 참이 안나올 수도 있다. 

 

 

📌 자바에서 final의 기능은 무엇입니까?

더보기

변수 final은 한번만 초기화하고, 그뒤로는 초기화할 수 없는 상수의 값을 가진다. 

메소드의 final은 오버라이딩이 불가능하다. 

클래스 final은 상속이 불가능하다.

 

 

📌 자바에서 Math.round(-1.5)는 무엇을 의미합니까?

 

 

📌 String은 기본 데이터 타입입니까?

더보기

아니다. String은 참조형 데이터 타입이다. 

그래서 '==' 대신 'equals'를 사용한다. 

 

 

📌 자바에서 문자열을 조작하는 클래스는 무엇이 있습니까? 각 클래스의 차이점은 뭘까요?

더보기

String 클래스 -> 문자열 객체, 불변.

StringBuilder 클래스 -> 문자열 객체. 가변적임.

StringBuffer 클래스 -> 멀티스레드 환경에서 쓰이는 문자열 , 가변

 

 

📌 String str ="i"와 String str = new String("i")가 동일합니까?

더보기

"i" 라는 문자열 풀에 있는 글자를 가져와 씀. 없으면 새로 생성

new String("")은 강제로 문자열 객체를 생성.

첫번째 타입이 메모리 관리하는데 더 좋음.

 

 

📌 문자열을 반전시키는 가장 좋은 방법은 무엇인가요?

더보기

StringBuilder의 reverse()

 

 

📌 String 클래스의 일반적인 메서드는 무엇이 있나요?

더보기

length(), substring(), ..

 

 

📌 추상 클래스에서 추상 메서드는 필수적인가요?

더보기

아니요. 추상 클래스에 추상 메소드가 존재하지 않아도 됩니다. 다만 있을 경우 하위클래스에서 반드시 구현 필요하다. 

 

 

📌 보통의 클래스와 추상 클래스의 차이는 무엇인가요?

더보기

1) 추상 메소드의 유무

물론 추상 클래스도 추상 메소드를 가지지 않을 수 있지만, 일반클래스는 추상 메소드를 가지지 않는다.

2) 인스턴스화 불가능 

추상메소드는 인스턴스화가 불가능하다. 추상메소드가 있을 수 있기 때문에. 

 

 

📌 final은 추상 클래스를 수정할 때 사용할 수 있나요?

더보기

추상 클래스는 보통 상속을 하기 위한 용도로 많이 사용된다.

하지만 final을 붙이게되면, 상속이 불가능해지므로,

추상클래스의 용도를 하지 못하게 된다. 

 

 

2️⃣ Container

📌 자바 컨테이너란 무엇인가요?

더보기

자바 컨테이너란, 자바를 실행시킬 수 있는 환경을 의미한다.

JVM : 자바 어플리케이션을 실행시킬 수 있는 자바 가상 머신. 이 존재로 인해 어느 OS에서도 자바는 돌아간다. 

웹서버 : 자바를 웹에 실행시킬 수 있는 환경. 대표적으로 아파치 톰캣이 있음.

 

 

📌 Collection과 Collections의 차이는 무엇인가요?

더보기

Collection : List, Map, Set 같은 자료구조를 표현한 인터페이스 .

Collections : 컬렉션을 활용할 수 있는 유틸 클래스. 대표적으로 Collections.sort()가 있음.

 

 

📌 List, Set, Map의 차이점을 말해주세요.

더보기

List : 중복이 허용되는 집합. 또한 순서가 있다.  

Set : iterator로 이루어진 값들의 집합. 단, 중복이 허용되지 않는다. 

Map : key-value 쌍으로 이루어진 컬렉션이다. key 값은 Set과 같이 중복이 허용되지 않고, 그에 따른 value를 가진다. 

 

 

📌 HashMap과 HashTable의 차이는 무엇인가요?

더보기

둘 다 key-value 쌍을 저장할 수 있는 자료구조이다. 단, 동기화 측면에서 차이가 있다. 

HashMap : 동기화되지 않음. 단일 스레드 환경에서 최적화됨. 

HashTable : 동기화된 환경을 제공. 멀티 쓰레드 환경에서도 안전하게 사용 가능. 또한 value로 null 값 허용 안함. 동기화된 환경에서 작동할 수 있기 때문에, hashMap보다 성능상 느림. 

 

 

📌 각각 어떤 상황에서 HashMap과 TreeMap을 선택하나요?

더보기

HashMap 은 값들의 순서가 정돈되어 있지 않음. 시간 복잡도가 O(1)이라서, 어떠한 값을 찾거나할 때 사용.

TreeMap은 값들의 순서가 정렬되어 있어, O(logN)이 걸림. 정렬된 값들의 모음이 필요시 사용. 

 

 

📌 HashMap 구현 원칙은 무엇인가요?

더보기

해시 충돌이 일어나지 않도록, 키들이 유니크한 값들을 가지도록 해야한다.

해시 충돌이란, 두개 이상의 키들이 같은 해시값을 가지는 것이다. 

해시 함수 사용. 

 

 

📌 HashSet 구현 원칙은 무엇인가요?

더보기

중복된 값들을 담지 않도록 해야한다. 

해시 함수 사용

 

 

📌 ArrayList와 LinkedList의 차이점은 무엇인가요?

더보기

ArrayList : 메모리에 값들이 순차적으로 저장됨. 인덱스 적 접근이 가능. 그러나 중간 값 삭제하면 비용이 LinkedList보다 많이 들음. 

LinkedList : 하나의 노드에 다음 값의 주소가 담김. (순차적으로 메모리에 저장되지 않음) 인덱스 접근이 불가능.

 

 

📌 Array에서 List로 전환하려면 어떻게 해야하나요?

더보기

Arrays.asList, stream 의 toCollect() 가 있다. 

 

 

📌 ArrayList와 Vector의 차이점을 말해주세요.

더보기

둘 다 데이터를 순차적으로 저장할 수 있는 List 인터페이스 구현체임. 

ArrayList : 단일 스레드 환경에서 사용하면 좋음. 왜냐면 동기화 처리가 안 되어 있음. 

Vector : 각 메소드에 동기화 처리가 되어 있어 멀티 스레드 환경에서 좋음. 그러나, 위보다 성능상 느림. 

 

 

📌 Array와 ArrayList의 차이점을 말해주세요.

더보기

Array : 길이가 정해져 있는 배열, 선언할 때부터 길이를 알고가야한다. 

ArrayList : 길이가 정해져 있지 않는 가변적인 배열. 

 

 

📌 Queue에서, poll()과 remove()의 차이는 무엇인가요?

더보기

둘다 값을 비워내는 것은 똑같으나, 

poll()은 큐가 비워져 있을 떄 null을 반환하나, remove()는 예외를 발생시킨다. 

 

 

📌 thread-safe한 컬렉션 클래스들은 무엇이 있을까요?

더보기

HashTable, BufferString, Concurrent붙은 것들.. 

 

 

📌 iterator란 무엇인가요?

더보기

컬렉션을 구성하는 요소로, hasNext(), next(), remove() 등이 있음. 

for문을 쓰지 않고도 위의 메소드로 순회할 수 있다.

 

 

📌 iterator의 사용 목적은 무엇인가요? 어떤 특징이 있죠?

더보기

컬렉션을 구성하는 요소로, 컬렉션에 있는 값들을 순회하고 싶을 때 사용한다. 

또한 요소의 자료형이 무엇이든 간에, 접근이 가능하다. 

 

 

📌 iterator와 listIterator의 차이는 무엇인가요?

더보기

사용하는 곳이 다르다.

Iterator는 Queue, Stack 같은 일반적인 컬렉션의 순회를 나타내고, 

ListIterator는 List 컬렉션을 순회하는데 사용합니다. 

 

 

3️⃣ multi-threading

📌 병렬과 동시성의 차이점을 말해주세요.

더보기

 

병렬 : 멀티 코어 환경에서 멀티 스레드 방식 - 

동시성 : 단일 코어 환경에서 멀티 스레드 방식 

하나의 프로세스 안에서 스레드가 멀티로 작용되기 때문에 컨텍스트 스위칭 작업이 일어난다. 

 

📌 스레드와 프로세스의 차이를 말해주세요..

더보기

프로세스는 CPU에서 수행되는 프로그램의 단위이고, 

스레드는 하나의 프로세스 안에서, 프로세스의 자원을 공유하는 일, 흐름의 단위

 

 

📌 데몬 스레드는 무엇인가요?

더보기

데몬(daemon) : 백그라운드에서 진행하는 작업

주 스레드의 일을 돕는 보조적인 역할을 수행하는 스레드이다. 즉 주 스레드가 끝나면 데몬 스레드도 종료된다. 

 

📌 스레드를 만드는 방법을 나열해주세요.

더보기

Runnable 인터페이스로 스레드를 구현하는 방법

Thread로 스레드 생성하는 방법이 있다. 

 

 

📌 runnable과 callable의 차이는 무엇인가요?

더보기

둘다 스레드를 실행할 수 있는 메소드이다. 

runnable : 반환값 없고, 예외 불가능. execute() 에 전달.

callable : 반환값이 있고, 예외 날릴 수 있음. submit()에 전달. Future 객체를 반환해 스레드의 작업 추적이 가능함. 

 

 

📌 스레드의 여러가지 상태에 대해 말해주세요.

더보기

new : 스레드를 생성

runnable : 스레드 실행 대기

run : 스레드 실행

blocking : 스레드 차단

wait : 스레드 대기

time_waiting : 스레드 제한 시간동안 대기

terminate : 스레드 끝남. 

 

 

📌 sleep()과 wait()의 차이는 무엇인가요?

더보기

sleep : 특정 시간동안 대기

wait : 대기지만, 다른 스레드에서 notify()로 깨울 때까지 기다려야함. 

 

 

📌 notify()와 notifyAll()의 차이는 무엇인가요?

더보기

notify() : wait 중인 스레드를 깨우는 역할. 하나만 실행 대기로 넘어감. 

notifyAll() : wait 중인 모든 스레드를 깨우는 역할. 전부 실행 대기로 넘어감. 

 

 

📌 thread run()과 tnread start()의 차이는 무엇인가요?

더보기

둘다 스레드를 실행시키는 것은 장점이지만, 

run() : 존재하고 있는 스레드가 실행됨. 

start() : 새로운 스레드가 만들어지고, 해당 스레드에서 run()이 병렬적으로 실행됨. 

 

 

📌 스레드 풀을 생성할 수 있는 여러가지 방법을 말해주세요.

더보기

스레드 풀이란 다수의 스레드들을 재사용할 수 있도록 스레드를 모아둔 곳이다. 

ExecutorService excutor = Executors.newFixedThreadPool(10);

10개의 스레드 풀을 만든다. 

 

 

📌 스레드 풀의 상태에 대해 말해주세요.

더보기

작업 대기 상태 : 스레드들이 실행대기 중인 상태이다. 

실행 중인 상태 : 스레드들이 실행중인 상태이다. 

종료한 상태 : 스레드 풀이 종료되거나 종료 중인 상태. shutdown()을 통해 종료한다. 

 

 

📌 스레드 풀에서 submit()과 execute()의 차이는 무엇인가요?

더보기

submit : Runnable(), Callable() 모두 작업할 수 있음. Future를 통해 결과를 받아올 수 있다. 

execute() : Runnable()만 실행 가능. 반환값 x. 

 

 

📌 자바 프로그램에서 멀티 스레드 작업의 안전성을 어떻게 보장할 수 있을까요?

더보기

1) 메소드에 동기화를 걸어주어 안전하게 작업을 저장해야합니다. 

여기서 동기화란 공유 자원에 여러 스레드가 접근을 하지 못하도록 막는 것.

2) 'Lock' 을 활용하여 특정 코드 영역을 보호해야함. 

3) 'ConcurrentLinkedQueue', 'ConcurrentHashMap', 'CopyOnWriteArrayList' 같이 자바에서 제공하는 동시성 작업이 가능한 컬렉션 자료구조를 활용하기. 

4) 인스턴스 변수를 사용하지 않는다. 

5) 싱글톤 패턴을 사용한다. 

 

 

📌 프로세스 동기화에 대해 알려주세요 (개인 추가)

더보기

Race Condition(경쟁 상태): 여러 프로세스나 스레드가 동기화 메커니즘 없이 자원에 접근하려는 상황을 가리킵니다. 공유된 자원에 대한 접근 순서에 따라 실행 결과가 달라질 수 있는 상황을 의미합니다.

Critical Section(임계 구역): 여러 스레드가 동시에 접근해서는 안되는 공유자원에 접근하는 코드 블럭을 얘기합니다. 한 임계구역에 하나의 스레드 혹은 프로세스만 접근이 가능합니다. 임계 구역에 접근하는 것을 제어하기 위해 세마포어, 뮤텍스와 같은 매커니즘을 사용합니다.

임계 구역 문제를 해결하기 위한 조건(모두 충족해야함)

  • 상호 배제(Mutual Exclusion): 한 프로세스가 임계구역에서 동작중이면 다른 프로세스는 접근할 수 없다.
  • 진행(Progress): 임계구역에서 작업중인 프로세스가 없다면 입계구역으로 진입하려는 프로세스를 적절히 선택해서 진입할 수 있도록 합니다.
  • 유한 대기(Bounded Waiting): 한 프로세스가 임계영역으로 진입을 요청한 후 다른 프로세스는 진입이 유한한 횟수로 제한되어야 합니다. (기아상태 방지)

 

 

4️⃣ reflection

 

📌 reflection이란 무엇인가요?

 

 

📌 자바 직렬화란 무엇인가요? 어떤 상황에서 필요한가요?

더보기

객체를 바이트 스트림으로 변환하는 과정. 반대의 과정도 됨.

 

 

📌 동적 프록시란 무엇인가요?

 

 

📌 동적 프록시는 어떻게 사용하나요?

 

 

5️⃣ object copy

 

📌 복사가 사용되는 이유는 무엇인가요?

 

 

📌 객체 복사는 어떻게 할 수 있나요?

 

 

📌 깊은 복사와 얕은 복사의 차이를 말해주세요.