주니어 자바 개발자를 위한 질문(기초)

박재언·2023년 7월 20일
1

주니어 자바 개발자를 위한 인터뷰 질문이란 게시물을 보게 되어서 딱 나에게 알맞은 내용이라 생각하여 이것에 대한 답변을 정리해서 작성해보려고 한다.
또한 답변을 작성하면서 추가적으로 궁금한 내용을 '📌'을 통해 적어두고 추후에 다른 포스트로 정리해 보려고 한다.


질문

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

  • JDK(Java Development Kit)는 자발 애플리케이션을 개발하기 위한 환경을 지원하며 JRE, 컴파일러(javac), javadoc, jar 등 개발에 유용한 도구들을 포함하고 있는 자바 개발 도구이다.

    • JDK의 구성
  • JRE(Java Runtime Environment)는 자바 실행 환경으로 JVM, Java binaries, Java 클래스 라이브러리 등을 포함하고 있어 자바 프로그램의 실행을 지원한다.
    하지만 컴파일러나 디버거 등의 도구는 포함하지 않는다.

    • JRE의 구성

    • JDK와 JRE 비교

    • JDK, JRE, JVM 관계

  • 📌JVM에 대해서

사진출처: https://www.geeksforgeeks.org/difference-between-jdk-and-jre-in-java/

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

  • "=="는 객체의 주소값을 비교하는 연산자이고 equals는 값 자체를 비교하는 Object 클래스의 메서드이다.

  • String 변수 생성 시 리터럴을 이용한 방식, new 연산자를 이용한 방식이 있다.
    String을 리터럴로 선언할 경우 String constant pool이라는 영역에 존재하고 new를 통해 String을 생성하면 Heap영역에 존재하게 된다.
    이렇게 객체가 같은 값이더라도 주소값이 다를 수 있어서 String을 비교한다면 equals를 사용하여 비교해주어야 한다.

  • 📌힙(Heap)과 스택(stack)에 대해서

3. 두 객체가 동일한 hashCode를 가지면 Equals()가 참이어야 합니까?

  • 두 객체가 동일한 hashCode를 가진다고 Equals()가 항상 참은 아니다.
    하지만 두 객체가 동일하다면 Equals()는 항상 참이다.

사진출처: https://tecoble.techcourse.co.kr/post/2020-07-29-equals-and-hashCode/

  • 📌동일성(Identity)vs동등성(Equality)에 대해서

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

  • final은 변수, 메서드, 클래스에서 사용이 되며 사용되는 위치에 따라 다른 의미를 가지고 있는데 변수에서는 수정될수 없는 상수라는 의미를 가지고 있다.
    메서드에서 final은 override를 제한한다는 의미로 사용하며 해당 메서드를 수정해서 사용할수 없도록 한다. 클래스에서 final은 상속을 불가능하도록 만들며 이것에 대표적인 예시로는 Integer과 같은 랩퍼(Wrapper)클래스가 있다

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

  • Math.round()는 소수점 이하의 값을 반올림하고 그 값을 리턴하는 함수이다.
    -1.5일 경우 -1이 되는데 그 이유는 숫자 5는 반올림시 올림에 속하여 음수인 -1.5가 올림으로 -1이 결과값이 나온다.

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

  • String은 기본 데이터 타입이 아닌 클래스타입이이다.
    하지만 String 클래스 구성 내부 요소를 보자면, 결국 String도 char[] 배열로 이루어진 데이터 자료라고 볼수 있다.

  • 📌자바 자료형에 대해서

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

  • 문자열을 다루는 대표적인 클래스로 String, StringBuffer, StringBuilder가 있다.
    String과 다른 두개의 가장 큰 차이점은 String은 불변(immutable)의 속성을 갖고 StringBuffer, StringBuilder는 가변성의 속성을 가진다는 점이다.
    따라서 StringBuffer와 StringBuilder는 가변성을 가지기 때문에 append(), Delete() 등의 API를 이용하여 동일 객체 내에서 문자열을 변경하는것을 가능하게 한다.
    String의 경우 객체의 값을 변경할 경우 동일 객체 내에서 문자열이 변경이 되는 것이 아니라 새로운 메모리에 인스턴스가 생기고 기존의 메모리가 삭제되는 방식으로 작동한다.
    StringBuffer와 StringBuilder의 차이점은 동기화의 유무로써 StringBuffer는 동기화를 지원하여 멀티쓰레드 환경에서 안전하지만 StringBuilder는 동기화를 지원하지 않기 때문에 멀티쓰레드 환경에서 사용하는 것은 적합하지않고 단일쓰레드에서의 성능은 StringBuffer보다 뛰어나다.

    • String 동작
    • StringBuffer 동작
    • String, StringBuffer, StringBuilder 비교

사진 출처: https://ifuwanna.tistory.com/221

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

  • 두 변수는 겉보기엔 동일해보이지만 주소값이 다르기 때문에 동일하다고 볼 수 없고
    동등하다고 할 수 있다.

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

  • 문자열을 반전시키는 가장 좋은 방법은 StringBuffer나 StringBuilder의 reverse 메서드를 이용한 방식이 가장 좋은 방법이라고 생각한다. 그 이유는 간단하고 직관적인 방법으로 문자열을 뒤집을 수 있고 다른 사람이 코드를 볼 때 쉽게 이해할 수 있어서 가장 나은 방법이라고 생각한다. 만약 메모리 사용량이 가장 중요한 상황이라면 배열과 스왑을 이용해 문자열을 반전시키는 방법이 좋은 방법이라고 생각한다.

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

사진출처: https://hongong.hanbit.co.kr/java-%EC%9E%90%EB%B0%94-%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84-%EB%8B%A4%EB%A3%A8%EB%8A%94-string-%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%A9%94%EC%86%8C%EB%93%9C-%EC%B4%9D%EC%A0%95%EB%A6%AC/

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

  • 동작에 있어서 추상 클래스는 추상 메서드가 없어도 동작 할 수 있다.
    추상 클래스의 모든 메서드가 일반 메서드여도 추상 클래스로 선언할 수 있다.
    추상 클래스의 사용 목적은 클래스의 공통 사항을 한 곳에서 관리하여 개발 및 유지 보수가 편해지고 추상 메서드를 이용하여 표준화의 정도를 높이며 필수적으로 구현해야하는 부분을 지정하려는 의도를 가지고 사용한다. 하지만 추상 메서드가 아닌 일반 메서드로 추상 클래스를 구현 했을 경우 이러한 사용 목적을 잃어버리기에 추상 메서드가 필수적이진 않지만 추상 메서드를 구현하지 않고 추상 클래스를 사용한다는 것은 목적에 부합하지 않는다고 할 수 있다.

  • 📌추상클래스와 인터페이스에 대해서

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

  • 추상 클래스는 일반 클래스와 달리 인스턴스화가 불가능한 클래스이며, 오직 상속을 통해서 자손 클래스에 의해서만 완성된다.

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

  • final을 사용하면 상속이 불가능 하기때문에 반드시 상속되어야 사용가능한 추상 클래스에는 final 키워드가 사용될 수 없다.

질문 출처: https://medium.com/@xjpp22/top-100-java-interview-questions-for-1-to-3-years-experienced-programmers-63ad74069cb6

0개의 댓글