기술면접 – 자바

자바가 뭐야

  • 일반적인 객체 지향 프로그래밍 언어
  • JVM(Java Virtual Machine)에서 실행되며 OS 독립적입니다.
  • 가비지 컬렉터(GC Garbage Collector)에 의한 자동 메모리 관리가 가능합니다.
  • 다중 상속 또는 유형에 대해 엄격하며 많은 제한이 있습니다.
더보기

가비지 컬렉터란?

  • JVM에서 메모리를 관리하는 모듈.
  • 힙 메모리를 재활용하기 위해 메모리에서 더 이상 참조되지 않는 객체를 해제하는 모듈
  • 개발자가 메모리를 직접 할당/할당 해제할 필요가 없기 때문에 개발 시간을 단축할 수 있는 장점이 있습니다. GC가 개체에 대한 참조를 검색하는 동안(마크 및 스윕) 스레드가 잠시 중단되어 성능이 저하됩니다.
  • 객체지향 언어의 속성(상속, 캡슐화, 다형성)이 적용된 언어
더보기

객체지향 언어란?

  • 프로그래밍 기법 중 하나현실 세계의 객체와 유사한 객체를 생성하고 객체에서 필요한 특성을 추출하여 프로그래밍하는 방법

객체 지향의 네 가지 요소

  1. 추상화: 공통 특성(속성, 기능)을 기반으로 개체에 이름을 지정하는 방법입니다. 불필요한 부분을 생략하고 사물의 가장 중요한 특성에만 집중함으로써 윤곽과 연결된다.
  2. 캡슐화(Encapsulation): 주어진 객체가 독립적으로 역할을 수행하는 데 필요한 데이터와 기능을 묶음(모듈화), 객체의 속성(데이터 필드)과 작업(메소드)을 하나로 캡슐화하고 실제 구현 내용의 일부를 외부에서 숨김 . .
  3. 상속: 기존 클래스를 재사용하여 새로운 클래스를 생성하는 기술 코드를 함께 관리함으로써 코드 추가 및 변경이 가능하여 코드 재사용성이 높아지고 중복 코드가 제거되어 생산성 및 유지보수에 도움이 됩니다.
  4. 다형성(Polymorphism): 프로그래밍 언어의 각 요소(상수, 변수, 표현식, 객체, 메서드 등)가 서로 다른 데이터 유형에 속하도록 하는 속성을 말합니다.

다형성의 예

오버로드됨: 이름은 같지만 매개변수 유형과 개수가 다른 여러 메서드입니다.

재정의: 하위 클래스가 상위 클래스의 메서드를 재정의하여 사용하는 경우,


정적 키워드

  • Static 키워드를 사용하는 변수와 메서드는 클래스가 메모리에 로드될 때 함께 초기화되어 인스턴스(새 생성자)를 생성하지 않고 사용할 수 있습니다.
  • 동일한 클래스에서 선언된 정적 변수는 메서드가 선언된 메모리를 공유합니다.
  • 메서드 창은 메모리를 관리합니다.

추상 클래스와 인터페이스

추상 클래스

  1. Class 앞에 “abstract” 키워드를 사용하여 정의되며 하나 이상의 추상 메서드를 가진 클래스를 나타냅니다. 추상 메서드를 선언하고 하위 클래스가 상속을 통해 구현하도록 강제하는 클래스입니다.
  2. 추상 메소드가 없는 클래스도 “abstract”를 추가하여 추상 클래스로 지정할 수 있으며, 반대로 추상 메소드를 포함하는 클래스는 추상 클래스여야 합니다!!
  3. 추상 클래스는 상속을 위한 클래스이므로 new 키워드를 사용하여 직접 객체를 생성할 수 없습니다.
  4. 인터페이스와 달리 정적 또는 최종 필드가 아닌 필드를 가질 수 있으며 모든 액세스 수정자를 사용할 수 있습니다.

상호 작용

  1. “인터페이스”라는 키워드로 선언되며 정적 최종 및 추상 메소드 세트입니다.
  2. 추상 클래스보다 추상화 수준이 높으며 추상 클래스와 달리 구현 부분이 있는 일반 메서드 및 멤버 변수를 가질 수 없습니다.
  3. 모든 메서드는 ‘public abstract’로 선언해야 하며 생략 가능합니다. 또한 모든 멤버 변수는 ‘public static final’로 선언해야 하며 생략도 가능하다. (컴파일 시 자동으로 생성되기 때문에)

함께

  1. 공통점은 메서드 선언만 있고 구현 세부 정보(추상 메서드)가 없다는 것입니다.
  2. new 키워드를 사용하여 개체를 만들 수 없으며 상속된 클래스는 선언된 추상 메서드를 구현해야 합니다.

차이점

  1. 추상 클래스는 extend 키워드로 상속하고 다중 상속이 불가능하지만 인터페이스는 implement 키워드를 사용하여 다중 상속이 가능합니다.
  2. 추상 클래스는 추상 클래스를 상속하고 기능을 사용하며 확장하는 역할을 합니다.
  3. 인터페이스는 함수의 셸로만 존재하며 구현 개체의 동일한 동작을 보장하기 위해 함수 구현을 강제하는 데 사용됩니다.


Java의 런타임 프로세스

  1. 소스 코드 작성(.java 파일)
  2. 컴파일러에서 javac를 사용하여 해당 코드를 .class 파일로 변환(바이트코드로 변환)
  3. ClassLoader는 변환된 바이트코드를 런타임 데이터 영역(메모리 영역)에 로드하고, 링크를 통해 배치를 수행합니다. 또한 런타임에 클래스를 동적으로 로드합니다.
  4. 실행 엔진JVM 메모리 공간에 로드된 바이트코드로 구성된 .class 파일을 기계어로 변환하여 명령어 단위로 실행한다.

자바 메모리 구조

  1. PC 레지스터: 현재 실행 중인 부분, 즉 쓰레드가 어떤 부분을 어떤 명령어로 실행하는지 명령어와 주소를 저장한다. 현재 실행 중인 JVM 명령어의 주소 값이 저장된다.
  2. JVM 스택: 스레드가 생성될 때마다 하나씩 생성되며 각 스레드는 독립적인 메모리 공간을 갖습니다. 메소드가 호출되면 이 스택이 쌓이고 메소드 내의 로컬 변수, 반환 값 및 매개 변수가 스택 프레임에 임시로 저장되고 스레드가 종료되면 RunTime 스택이 JVM에 의해 파괴(LIFO 구조)됩니다.
  3. Native Method Stack: Java 이외의 언어로 제공되는 메소드를 저장하기 위한 영역인 JINI(Java Native Interface)라는 표준 규격을 제공한다.
  4. 힙 메모리: 인스턴스가 생성되는 영역으로 모든 객체 유형(String, Integer, ArrayList 등)이 힙 영역에 생성됩니다. 얼마나 많은 스레드가 있더라도 모든 스레드가 공유하는 힙 영역은 하나뿐입니다. 힙 영역은 new 연산자와 배열 정보로 생성된 객체를 저장하는 영역으로 GC의 목표!!
  5. 메소드 스코프(class scope): 클래스명, 부모 클래스명, 메소드, 변수(전역 변수 포함) 등의 클래스 정보를 저장하며, 쓰레드 간에 공유할 수 있는 스코프는 JVM 내에서 하나만 존재한다.