ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 기술면접 - 1
    개발 면접/자바 2024. 10. 31. 16:11

    JSCODE 자바 기술면접 모의스터디에 참여하면서 정리한 자료입니다.

    잘못된 정보가 있다면 언제든지 지적해주시면 감사하겠습니다.

     

    Java의 특징에 대해서 설명해주세요.

    • 객체 지향 언어이다.
      • 객체: 실생활에서 사용되는 것들을 객체라고 볼 수 있다. 객체는 ‘상태’와 ‘행위’로 나타낸다.
      • 추상화: 여러 객체들의 공통적인 특성을 추출하는 행위를 의미한다.
      • 상속: 기존 클래스를 확장하여 새로운 상위 클래스를 만드는 것을 의미한다.
      • 캡슐화: 내부의 ‘상태’와 ‘행위’를 외부로부터 감추고, 외부에는 필요한 ‘행위’만 노출시키는 것을 의미한다.
      • 다형성: 하나의 타입이 상황에 따라서 다양한 타입으로 변할 수 있는 것을 의미한다.
    • JVM위에서 동작하기 때문에 OS로부터 독립적이다.
      • JVM: 자바 바이트 코드(.class 파일)를 OS에 특화된 코드로 변환(인터프린터, JIT 컴파일러)하여 실행
    • 자동으로 메모리를 관리해준다.
      • GC가 더 이상 참조하지 않은 객체를 관리하는 것을 의미한다.
      • 자바의 GC는 기본적으로 Mark And Sweep 방식으로 동작함
      • 하지만, STW(Stop-The-World) 최적화 이슈가 항상 존재
      • STW란?
        • GC를 실행시키기 위해 현재 실행중인 애플리케이션을 중단하는 것을 의미함
    • 인터프리터 방식과 컴파일 방식을 동시에 지원한다.
      • 기본적으로 인터프리터 방식으로 동작
      • 하지만, 반복적인 코드가 지속적으로 나오는 경우 컴파일 방식으로 동작

     

    Java의 단점에 대해서 설명해주세요.

    • JVM을 거쳐서 실행되기 때문에 타 언어에 비해서 느리다 (하지만, 체감할 정도는 아니라고 봄)
    • GC로 인해 메모리 소비량이 크다?

     

    Java 실행 과정에 대해서 설명해주세요.

    • 자바 코드를 작성한 후 자바 컴파일러에 의해 자바 바이트 코드를 생성
    • 클래스 로더가 바이트 코드를 읽어 JVM에 로딩
    • JVM에 로딩된 바이트 코드들은 실행엔진에 의해 해석된다
    • 해석된 코드들은 Runtime Data Area에 배치되어 실행된다.

     

    Java Bytecode에 대해서 설명해주세요.

    • 자바의 핵심인 “Write Once, run everywhere” 를 의미하며
    • JVM이 해석할 수 있는 언어이다.

     

    Java의 인터프리터(interpreter) 방식과 JIT 컴파일(compile) 방식에 대해서 설명해주세요.

    • 인터프리터: 바이트코드를 한줄씩 읽어서 네이티브 기계어로 변환하는 방식
    • JIT 컴파일러: 인터프리터로 읽은 기계어 중, 반복적으로 사용되는 바이트코드 시퀀스를 한번에 네이티브 기계어로 컴파일하고, 동일한 코드가 있다면 재사용할 수 있는 방식

     

    사용해본 Java 버전과 특징 그리고 왜 그 버전을 사용했는지 설명해주세요.

    • Java 8 버전
      • Stream API
    • Java 17 버전
      • Record 클래스
      • Spring Boot 3.0 버전부터 Java 17버전을 지원하기때문에 사용

     

    Java 8, 11, 17 버전에 대해 아는대로 설명해주세요.

    • 먼저 8, 11, 17 이 3가지 버전은 자바에서 LTS 버전으로 출시되었다.
    • 자바 8
      • 람다 표현식을 제공 → 함수형 프로그래밍 가능
      • Stream API 제공
      • 인터페이스 기능 추가 → default 메소드 추가
      • Optional API 제공 → null을 위한 Wrapper 클래스
    • 자바 11
      • 자바 표준 HttpClient API 추가 → 기존에는 아파치 외부 라이브러리를 사용했음
      • 람다 표현식에 매개변수로 var 키워드를 사용할 수 있다.
      • new Garbage Collector (ZGC) 추가
    • 자바 17
      • Record 클래스 추가
      • 텍스트 블록 기능 추가
      • 봉인 클래스 추가
      • Stream.toList() 기능 추가
        • 기존, Stream을 List로 변환 시 Collectors에서 기능을 찾아서 사용했지만, 17부터 Collectors을 사용하지 않고 바로 toList() 사용

     

    JDK와 JRE에 대해서 설명해주세요.

    • JRE는 JVM를 포함하여 자바 애플리케이션을 실행할 수 있도록 구성된 최소한의 배포 단위이다.
      • 단, 개발 도구를 포함하지 않는다.
    • JDK는 JRE와 개발에 필요한 도구들을 제공해주는 것을 의미한다.

     

    동일성과 동등성에 대해 설명해 주세요.

    • 동일성: 주소가 같냐
    • 동등성: 값이 같냐

     

    equals()와 ==의 차이점은 무엇일까요?

    • equals는 두 객체의 상태나 값이 같은지 비교
    • ==는 두 객체의 참조가 동일한지 비교

     

    HashCode를 설명하고, equals() 와 hashCode() 의 차이점에 대해 설명해 주세요.

    • HashCode
      • 객체를 식별하는 하나의 정수값
      • Object 클래스에 hashCode() 메소드를 통해 해시코드를 반환받는다.
    • eqauls()와 hashCode()의 차이점
      • equals(): 두 객체의 상태나 값이 같은지를 비교
      • hashCode(): 두 객체가 같은 객체인지 식별하는 정수값을 반환

     

    왜 equals() 외에 hashCode() 도 재정의해야 하나요?

    • equals 메소드를 오버라이딩 하는 경우는 참조타입에서 ‘값이 같은가’를 물어보기 위해 사용합니다. 그리고 hashCode가 자동으로 오버라이딩되는 이유는 원래 hashCode는 객체의 주소 값을 해시코드로 가지기 때문에 서로 다른 두 객체는 같은 해시 코드를 가질 수 없지만, 논리적으로 두 객체를 같음을 나타내기 위해 사용한다.

     

    toString()에 대해서 설명해주세요.

    • 객체가 가지고 있는 정보나 값들을 문자열로 만들어 리턴하는 메소드

     

    자바에서 메인 메서드는 왜 static으로 되어 있을까요?

    • 프로그램이 실행된 직후에는 어떠한 객체도 존재하지 않는다. 즉, main 메소드에 static 키워드를 사용하지 않으면 런타임 시점에 실행할 객체가 없다.
    • 결과적으로 static을 사용하여 객체 생성없이 메모리에 할당해야한다.

     

    상수(Constant)와 리터럴(Literal)에 대해서 설명해주세요.

    • 상수: 모든 곳에서 하나의 값을 일관되게 사용하는 값이다.
      • 자바에서는 이를 static final 키워드를 사용하여
    • 리터럴: 변수에 대입되는 값 자체를 의미한다.

     

    Primitive Type과 Reference Type에 대해서 설명해주세요.

    • Primitive Type
      • 실제 값을 저장하는 자료형이다.
      • Stack 영역에 저장된다.
      • null을 가지지않고, 기본값이 있다.
    • Reference Type
      • 객체의 주소를 저장하는 자료형이다.
      • Heap 영역에 저장된다.
      • null을 가질 수 있고 기본값이 null이다.

     

    Java는 Call by Value 일까요? 아님 Call by Reference 일까요?

    • 자바는 Call By Value
      • 기본형, 참조형 둘 다 값,주소값이 복사되기 때문이다.
      • 실제 프로그램이 동작할 때, stack 영역에서 이루어지기 때문이다.

     

    Java 직렬화(Serialization)에 대해서 설명해주세요.

    • 객체를 네트워크 통신에 사용하거나, 데이터베이스에 저장할 수 있도록 바이트 형태로 변환하는 것을 직렬화라고 부르고, 바이트 형태로 되어 있는 것을 다시 객체로 변환하는 것을 역직렬화라고 한다.

     

    오버로딩과 오버라이딩의 차이는 뭔가요?

    • 오버로딩 - 같은 이름의 메소드를 여러개 정의
      • 같은 기능을 하는 메소드를 다양한 형태로 호출하기 위해서
    • 오버라이딩 - 상속받은 클래스에 메소드를 재정의하는 것
      • 상위 클래스에서 정의한 메소드를 하위 클래스에서 재정의하여 자신에게 맞게 변경

     

    다형성이 무엇이고, 왜 필요할까요?

    • 하나의 객체가 상황에 따라서 다양항 형태로 지닐 수 있는 성질을 의미한다.
    • 이는 유지보수 향상을 위해 필요한 성질이다.
      • 먼저, ‘무엇을 해야 하는가’를 의미하는 역할을 인터페이스 혹은 추상클래스로 정의한다.
      • 이를 ‘어떻게 할 것인가?’를 의미하는 구현체 클래스는 이를 상속받아 구현한다.
      • 이렇게 된다면, 이를 사용하는 측(클라이언트)에서는 구체 클래스를 의존하지 않고 역할에 의존하기 때문에 새로운 기능이 추가되더라도 클라이언트에게는 아무런 영향을 미치지 않는다.
    • 이러한 성질로 인해, 자연스럽게 클라이언트 입장에서는 구현체에 대해 ‘캡슐화’가 이루어진다.

     

    상속은 무엇인가요?

    • 상위 클래스에 선언된 변수와 메소드를 그대로 하위 클래스에서 물려받는 것

     

    상속의 단점은 무엇이 있을까요?

    • 상속관계 있는 클래스끼리 강한 결합이 발생한다.
    • 즉, 상위 클래스에 변경사항이 발생한 경우 하위 클래스에 영향을 줄 수 있다.

     

    상속과 조합의 차이에 대해 설명해 주세요.

    • 객체간의 결합도
      • 상속: 계층 구조로 객체간의 관계를 나타내기 때문에 강한 결합이다.
      • 조합: 객체가 다른 객체를 포함시키는 관계를 가지기 때문에 약한 결합이다.

     

    instanceof 키워드란 무엇인가요?

    • 객체의 타입을 확인할 때 사용한다.

     

    instanceof 키워드를 사용할 때 문제점으로 무엇이 있을까요?

    • 인스턴스 오브를 사용하게 되면 구체적인 타입을 명시적으로 드러내기 때문에 추상화와 캡슐화가 깨진다.

     

    interface란 무엇일까요?

    • 객체의 행위를 정의하는 타입
    • 구현 클래스에서 반드시 구현해야 할 메소드를 명시

     

    interface와 abstract class는 어떤 차이가 있나요?

    • 상속
      • interface: 다중 상속 가능
      • abstract class: 단일 상속
    • 관계
      • interface: 서로 관계가 없는 객체들이 공통 동작을 해야할 때
        • 행위로 묶을 수 있다
      • abstract class: 관련된 객체들의 공통 기능을 구현할 때
        • 인터페이스와 마찬가지로 행위로 묶을 순 있지만, 가장 큰 차이는 ‘확장성’이다.

     

    언제 interface 사용하고, 언제 abstract class 사용 하나요?

    • interface
      • 완전히 다른 클래스들이 공통된 동작을 가져야 할 때
      • 다중 상속이 필요할때
      • 반드시 구현해야하는 메소드를 정의할 때
    • abstract class
      • 관련된 클래스들끼리 공통된 기능을 공유할 때
      • 상속받는 클래스에서 공통된 속성(필드)이 필요할 때
      • 일부 구현 로직은 제공하면서, 추상화가 필요로 할 때

     

    final 키워드에 대해 설명해 주세요.

    • 선언된 대상의 변경을 금지한다
    • 변수에 선언되는 경우 상수로 사용된다.
    • 메소드에 선언되는 경우 오버라이딩을 금지한다.
    • 클래스에 선언하는 경우 상속을 오버라이딩한다.
    • 메소드 파라미터에 선언되는 경우 메소드 내부에서 값을 변경할 수 없다.

    '개발 면접 > 자바' 카테고리의 다른 글

    자바 기술면접 - 2  (2) 2024.11.07
Designed by Tistory.