백엔드 개발직 면접 예상 질문

4. Java

계란💕 2023. 1. 24. 00:56

 

JVM(Java Virtual Machine)

 

Java

  • 객체 지향 프로그래밍이란?
    • 실제 세계를 모델링해서 소프트웨어를 개발하는 방법이다. ex) Java, Python, C++, Swift
    • 객체 지향의 특성 4가지: 캡슐화, 추상화, 다형성, 상속
    • https://brownbears.tistory.com/407
    • 객체 지향을 정의하자면 의존성 관리이다.
    • 객체지향으로 의존성을 관리함으로써 변경 영향을 최소화하고 독립적인 배포가 가능해지며 독립적인 개발이 가능해진다. 따라서 객체 지향에서 가장 중요한 것은 의존 역전 원칙을 통한 고수준 정책과 저수준 구현 세부 사항의 분리라고 할 수 있다.
    • 장점: 재활용성이 높다.
    • 단점: 속도가 느리다.

 

  • 절차 지향 프로그래밍
    • Def) 절차 지향 프로그래밍 : 순서대로 프로그램 전체가 유기적으로 연결되도록 하는 프로그래밍 기법이다. 컴퓨터의 작업 처리 방식과 유사하기 때문에 속도가 빠르다.
    • ex) C언어
    • 장점: 컴퓨터의 처리구조와 유사해서 속도가 빠르다.
    • 단점: 디버깅이 어렵다. 순서가 정해져있어서 순서를 바꾸면 동일한 결과를 보장하기 어렵다.

 

  • JVM(자바 가상 머신)이란?
    • OS와 독립적으로 CPUJava를 인식하고 실행할 수 있게 하는 가상 컴퓨터이다.
    • 바이트코드를 읽을 수 있는 주체이다.
    • 자바 애플리케이션을 클래스 로더를 통해 읽어 자바 API와 함께 실행하는 것이다.
    • GC(메모리 관리)를 실행하며 스택 기반의 가상 머신이다.
    • JVM은 Class Loader, Execution engine(실행 엔진), Runtime Data Area, JNI, Native Method Library 로 이뤄진다.
    • https://doozi0316.tistory.com/entry/1주차-JVM은-무엇이며-자바-코드는-어떻게-실행하는-것인가

 

  • Java 실행 방식
    • 컴파일러(javac)가 자바 코드(.java)를 읽어서 자바 바이트코드(.class)로 변환한다.
    • 클래스로더를 통해 class 파일을 JVM(자바가상머신)으로 로딩한다.
    • 로딩된 class 파일들은 Execution Engine(실행 엔진)을 통해 해석된다
    • 해석된 바이트 코드는 Runtime Data Area에 배치되어 실질적인 수행이 이뤄진다.

 

  • GC(garbage collection, 가비지 컬렉션)의 원리
    • Heap에서 사용하지 않는 객체들을 제거하는 작업을 총칭한다.
    • 자바는 개발자가 직접 메모리를 해제할 수 없는 언어이기 때문에 이런 기능이 필요하다.

 

  • 컬렉션(Collection) - 자료 구조
    • 인터페이스 List, Map, Set 를 기준으로 여러 구현체가 존재한다. Stack 클래스와 Queue 인터페이스도 존재한다.
    • List, Set은 Collection을 상속 받지만 Map은 구조상의 차이로 따로 정의한다.
    • 컬렉션 사용 이유: 다수의 데이터를 다루는데 표준화된 클래스들을 제공하기 때문에 자료 구조를 직접 구현할 필요 없이 사용 가능
    • List
      • ArrayList: 각 원소에 대한 index가 있다. 따라서 무작위 접근이 가능하다, 조회에서 효율적, 삽입과 삭제는 비효율적, (삽입과 삭제 시 데이터 들을 이동해야 하기 때문이다.)
      • LinkedList: 각 원소는 앞 뒤 원소에 대한 위칫값을 가지고 있다.
        • 양방향의 연결 리스트로 구성되어 있어서 참조하려는 원소에 따라 처음부터 정방향 또는 역순으로 순회 가능하다.
        • 조회는 느리고 삽입, 삭제 시 효율적이다.
      • https://dev-coco.tistory.com/19
    • Map
      • linkedHashMap: 순서를 보장하는 Map
    • Set
      • linkedHashSet: 순서 보장 Set
    • stack, queue
      • 큐는 linkedList로 이용 가능
      • stack: 클래스, queue: 인터페이스

 

  •  애너테이션(annotation)
    • 인터페이스를 기반으로 한 문법이다. 주석처럼 코드에 달아서 클래스특별한 의미를 부여하거나 기능주입할 수 있다.

 

  •  제네릭(Generic)
    • 객체의 타입컴파일 시에 체크하기 때문에 객체의 타입 안정성을 높이고 형변환의 번거로움을 줄인다.

 

  • final 키워드
    • 변수: 새로운 값 할당 불가
    • 클래스: 상속 불가
    • 메서드: 오버라이드 불가

 

  • 오버로딩 vs 오버라이딩
    • 오버로딩: 같은 클래스 안에서 이름은 같지면 매개변수의 형태(개수나 타입)가 다른 메서드를 만드는 것이다. (리턴 타입만 다를 수는 없다.)
    • 오버라이딩: 상위 클래스에 존재하는 메서드를 하위 클래스에서 필요에 맞게 재정의하는 것을 말한다.

 

  • 접근 제한자 (접근 제어자, Access Modifier)
    • public: 모든 클래스 허용
    • protected: 같은 패키지 & 상속 받은 클래스까지 허용
    • default: 같은 패키지
    • private: 같은 클래스

 

  • 래퍼 클래스(wrapper class)
    • 기본 자료형에 대한 클래스 표현을 래퍼클래스라고 한다.
    • 원시형을 객체로 감싸서 저장하는 이유는?
      • 컬렉션에서 제네릭을 사용할 때 래퍼클래스를 이용한다. .
      • 객체지향적인 프로그래밍을 위해 필요한다.
      • null을 반환해야하는 경우 메서드의 반환형으로 래퍼 클래스 이용

 

  • 스레드 로컬: 해당 스레드만 접근할 수 있는 특별한 저장소를 말한다. 
    • 스레드 사이에 간섭이 없어야 하는 데이터에 사용한다. 멀티 스레드 환경에서는 클래스의 필드에 멤버를 추가할 수 없고 매개 변수로 넘겨 받아야하기 때문이다. 즉, 스레드 내부의 싱글톤을 사용하기 위해 사용한다. 사용자 인증, 세션 정보, 트랜잭션, 컨텍스트에 사용된다.

 

  • Java의 네 가지 특성 (객체 지향의 특징 4개)
    • 캡슐화: 객체간의 소통을 위해 필요한 정보만을 노출한다. ex) 접근 제어자
    • 상속: 상위 클래스와 하위 클래스가 계층적인 구조를 가진다. 재사용성의 효과
    • 추상화: 실세계의 객체에서 필요한 부분만을 간결한 클래스로 만든다. (속성과 행동으로 구체화)
    • 다형성
      • 외부에 보이는 모습은 하나 지만 실질적으로 쓰이는 기능은 여러 가지 역할을 수행한다.
      • ex 오버로딩, 오버라이딩
    • https://oranthy.tistory.com/101

 

  • 추상클래스 vs 인터페이스 차이점
    • 추상클래스: 추상적인 상위 개념으로 공통 개념을 표현할 때 사용한다.
      • extends
      • 추상 메서드(구현부 없이 선언부만 존재)가 하나 이상이면 추상 클래스
      • 다중 상속 불가능
    • 인터페이스: 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용한다.
      • implements
      • 다중 상속 가능
      • 추상 클래스보다 추상화 정도가 높다.
    • 공통점: 인스턴스 불가능, 추상 메서드 사용(자식 클래스에서 강제 구현)
    • 차이점: 멤버 변수 유무, 다중 상속

 

  • 클래스와 객체의 차이점
    • 클래스: 객체를 정의하는 틀, 설계도와 같은 의미
    • 객체는 식별 가능한 개체 또는 사물이다. 특징적인 행동과 변경 가능한 상태를 가진다. 인스턴스를 통칭하는 의미로 객체를 쓰기도 한다.

 

  •  static이란?
    • 클래스의, 공통적인” 이라는 의미가 있다. 
    • 객체를 생성하지 않고 static 메서드에 접근 가능, static 멤버 변수는 여러 객체에서 딱 하나로 공유한다.
    • static + 멤버 변수: (인스턴스의 변수는 하나의 클래스로부터 생성되더라도 다른 값을 유지하는 것과 다르게) static 멤버 변수는 인스턴스에 관계 없이 같은 값을 갖는다.
    • static + 메서드: 인스턴스를 생성하지 않고 사용 가능한 메서드이다.
    • static은 클래스 멤버라고 하며 클래스 로더가 클래스를 로딩해서 메서드 메모리 영역에 적재할 때, 클래스 별로 관리된다.
    • static으로 선언되면 메모리에 올라가므로 모든 객체공유하며 ****하나의 멤버를 어디서나 참고할 수 있다는 장점이 있다 .
    • 단점: GC 관리 영역 밖이므로 프로그램 종료 시까지 메모리에 할당된 채로 존재한다. 남발하면 시스템 성능에 악영향을 준다.

 

  • SOLID원칙 - 객체 지향 설계의 5가지 원칙 (OOP를 잘하는 방법)
    • SRP(Single Responsibility Principle, 단일 책임 원칙): 한 클래스는 하나의 책임만 가지도록 구현
    • OCP(Open Close Principle): 개방 폐쇄 원칙
      • 소프트웨어 요소(클래스)는 확장에는 열려있고 변경에는 닫혀있도록 한다.
    • LSP(리스코프 치환 법칙)
      • 프로그램의 객체는 프로그램의 정확성을 깨지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야한다. (ex.자동차가 엑셀을 누르는데 뒤로 가면 위반)
      • 부모 클래스의 어떤 메서드에 대해 자식 클래스는 동일한 동작을 해야 재활용 가능성이 높아진다.
      • 즉, 부모 타입을 인터페이스처럼 생각해야한다.
      • Ex) List를 implements 하는 ArrayList, LinkedList에 대해 용도가 적절하지 않은 경우 갈아 끼운다.
    • ISP(Interface Segregation Principle, 인터페이스 분리 원칙)
      • 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
      • 클라이언트는 자신이 이용하는 메서드에만 의존해야한다. (인터페이스를 사용하는 클라이언트를 기준으로 인터페이스를 분리해야 한다는 뜻이다.)
      • 클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야 한다는 원칙이다.
      • 큰 덩어리의 인터페이스들을 구체적이고 작은 단위들로 분리시킴으로써 꼭 필요한 메서드들만 이용할 수 있도록 한다.
      • 효과: 시스템의 내부 의존성을 약화시켜 리팩토링, 재배포,.. 를 쉽게 한다.
    • DIP(Dependency Inversion Principle, 의존 관계 역전 원칙)
      • DI(의존성 주입)는 DIP(의존 관계 역전 원칙) 구현 기법 중 하나이다.
      • 구현 클래스가 아닌 인터페이스에만 의존해야한다는 뜻이다.
      • 이유는? 구체화에 의존하는 경우 변경이 어려워지기 때문이다.
      • ex) 내가 사용하던 라이브러리를 다른 라이브러리로 변경하는 경우, 내 코드를 뜯어고쳐야 한다, 따라서 라이브러리에 의존하면 교체가 어려워진다.

 

  • 자료형별 메모리 크기
    • 논리형: boolean(1byte)
    • 문자형: char(2byte)
    • 정수형
      • byte(1byte)
      • short(2byte)
      • int(4byte)
      • long(8byte)
    • 실수형
      • float(4byte)
      • double(8byte)

 

 

 

회고록

  • Java 개념은 아주 기본적인 부분이라서 분위기를 푸는 용도로 질문하시는 느낌이었다. 
  • 그동안 프로젝트를 하면서 인터페이스에 메서드를 만들 때 "abstract" 키워드를 한 번도 쓴 적이 없는데  선언부만 구현하면 자동으로 추상 메서드가 된다. 
  • 추상 클래스는 강의를 들을 때 한 두번 말고 프로젝트를 하면서 한 번도 쓴 적이 없는데 실무에서 어떻게 쓰이는지 자주 쓰이는지 모르겠다.
  • 단일 책임 원칙과 인터페이스 분리 원칙은 클래스냐 인터페이스냐 차이만 있고 책임을 분리해야한다는 점은 같다.
  • 빈출 질문: 인터페이스와 추상클래스의 차이점, 자료 구조(List, Map,Set 비교 설명),  List, Map,Set은 인터페이스인가 클래스인가, Stack과 Queue의 차이점, 자료형별 메모리 크기, 자바의 4가지 특징, SOLID 원칙, 오버로딩과 오버라이딩 차이점

 

 

참고) 아래 깃허브의 질문을 참고하여 내용을 보충해서 작성했습니다. 틀린 부분있다면 댓글 부탁드립니다 💖💛💚

백엔드 면접 질문 1

백엔드 면접 질문 2

'백엔드 개발직 면접 예상 질문' 카테고리의 다른 글

6. JPA(Java Persistence API)  (0) 2023.01.25
5. Spring  (2) 2023.01.24
3. 인프라 및 클라우드  (0) 2023.01.23
2. 운영체제, 네트워크, 보안과 암호학  (2) 2023.01.22
1. 데이터베이스(DataBase)  (0) 2023.01.21