White Cat's Paw

면접 질문/자바

[기술면접 질문] JAVA

JungMayo 2025. 3. 26. 22:48
1. 자바의 특징을 설명해보시오.
- JAVA는 객체지향프로그래밍 언어이다.
- 기본 자료형을 제외한 모든 요소들이 객체로 표현되고, 객체 지향의 개념의 특징인 캡슐화, 다형성, 상속 등이 적용됨
장점 )
  - JVM 위에서 동작하기 때문에 운영체제가 독립적이다. 
  - GarbageController를 통한 자동적인 메모리 관리가 가능하다.
단점 )
  -  JVM 위에서 동작하기 때문에 속도가 상대적으로 느리다.
  -  다중 상속이나 타입에 엄격하고 제약이 많다.

 

 

2. JVM의 역할에 대해 설명하시오.
- JVM은 스택기반으로 동작하며 Java Byte Code(.class파일)를 OS에 맞게 해석 해주는 역할을 하고 가비지컬렉션을 통해 자동적인 메모리 관리를 해준다.
-  즉 JAVA로 작성된 프로그램을 운영체제에 상관없이 실행할 수 있게 해주는 환경
-  자바 바이트코드(.class 파일)를 실행해주는 가상 머신

 

3. JVM 클래스는 언제 로딩됩니까? (클래스 정보가 메서드 영역에 언제 올라가는지)
JVM은 LazyLoading 메커니즘을 사용한다 -> 그때마다 필요한 클래스를 메모리에 올려 효율적으로 관리

static 변수와 메서드
- 인스턴스화 하지않아도 사용가능하며 클래스가 로드된다.

inner 클래스와 static inner 클래스
- inner 클래스: outer 클래스와 inner 클래스 둘 다 로드된다.
- static inner 클래스: outer 클래스를 로드하지 않고 인스턴스화가 가능하다.


static final 키워드의 상수
- 클래스 로드 되지 않고 사용가능하다 -> 컴파일 시점에 값이 확정되기 때문에 JVM 메소드Area의 Constant Pool(상수)에 따로 저장되어 관리됨


 final 키워드의 상수는
- 런타임 시점에 값이 결정되므로 클래스가 로드되어야 사용 가능하며 각 객체별로 값을 유지한다. 
- 인스턴스 변수일 경우 Heap, 지역 변수일 경우 Stack에 저장되며 객체 생성시 초기화된다.

 

4. JVM 클래스는 언제 초기화 됩니까?
- 클래스의 인스턴스 생성
- 클래스의 정적 메서드 호출
- 클래스의 정적 변수값 할당 및 사용

클래스 인스턴스 초기화 순서
1. 정적 변수 초기화
2. 정적 블록 실행
3. 인스턴스 생성
4. 생성자 실행

 

5. JAVA의 컴파일 과정에 대해서 설명하시오.
1. 개발자가 자바 파일 생성
2. build
3. java compiler의 javac의 명령어를 통해 바이트코드(.class) 생성한다.
4. Class loader를 통해 JVM 메모리 내에 로드한다.
5. 실행엔진을 통해 컴퓨터가 읽을 수 있는 기계어로 해석된다.(각 운영체제에 맞게)

 

6. 클래스로더란?
자바는 런타임에 클래스 로드하고 링크하는 특징이 있다. 클래스 로더는 런타임 중에 JVM의 Method 영역에 동적으로 Java 클래스를 로드하는 역할을 한다.

즉 런타임에 .class 파일을 JVM이 읽어서 메모리에 올리는 과정을 클래스 로딩이라 함. -> 수행하는 것이 클래스 로더

 

7. 자바에서 제공하는 원시타입과 각각 몇 바이트씩 차지하는지 설명하시오. 그리고 참조타입은?
정수형 byte, short, int, long 실수형 float, double 논리형 boolean, 문자형 char 가 있음
정수형 1, 2, 4, 8, 실수형 4, 8, 논리형 1, 문자형 2, 바이트를 차지함 --> 스택에 저장된다.

참조타입은 String, List, Map, 배열, 사용자 정의클래스 등을 의미하고 힙 영역에 저장되는데 주소값이 저장됨

 

8. 객체지향 프로그래밍이란? (OOP)

 

프로그램 구현에 필요한 객체를 파악하고 상태와 행위를 가진 객체를 만들고 각각의 객체들의 역할이 무엇인지 정의하여 객체들간의 상호작용을 통해 프로그램을 만드는 것을 의미한다.
객체가 중심이 되고 특징으로는 캡슐화,상속,다형성,추상화 등이 있고, 모듈 재사용으로 확장 및 유지보수가 용이하다.

 

9. 오버로딩과 오버라이딩의 차이
오버로딩 : 매개변수의 개수나 타입을 다르게 하여 같은 이름의 메소드를 여러개 정의하는 것 (컴파일 시점에 결정)
오버라이딩 : 상위 클래스에 있는 메서드를 하위 클래스에서 재정의 하는 것을 의미 (런타임 시점에 결정)

 

10. try-with-resources에 대해 설명하시오
try-with-resources는 try-catch-finally의 문제점을 보완하기 위해 나온 개념이다.
try(...) 안에 자원 객체를 전달하면, try 블록이 끝나고 자동으로 자원 해제 해주는 기능을 의미
따로 finally 구문이나 모든 catch 구문에 종료 처리를 하지 않아도 되는 장점이 있음

 

11. 불변 객체가 무엇인지 설명하고 대표적인 Java의 예시를 설명하시오.
불변 객체는 객체 생성 이후 내부의 상태가 변하지 않는 객체를 의미한다.
Java에서는 필드가 원시타입인 경우 final 키워드를 사용하여 불변객체로 만들 수 있고
참조 타입일 경우에는 추가적인 작업이 필요하다.

 

11 -1. 참조 타입일 경우 추가적인 작업은 어떤게 있는지?
1. 객체를 참조할 때
참조변수가 일반 객체일 경우 객체를 사용하는 필드의 참조 변수도 불변 객체로 변경해야 한다.

2. 배열일 경우
배열을 받아 copy해서 저장하고, getter를 clone으로 반환하도록 하면 된다. (배열을 그대로 참조하거나, 반환할 경우 외부에서 내부 값을 변경할 수 있음. 때문에 clone을 반환해 외부에서 값을 변경하지 못하게 한다.)

3. 리스트인 경우
새로운 List를 만들어 값을 복사하도록 해야한다. --> 이를 방어적 복사라고 함.

 

11-2. 불변객체나 final을 굳이 사용해야 하는 이유는?
1. Thread-safe하여 병렬 프로그래밍에 유용하며, 동기화를 고려하지 않아도 된다.
2. 실패 원자적인 메소드를 만들 수 있다. -> 어떠한 예외가 발생되더라도 메소드 호출 전의 상태를 유지할 수 있기때문
3. 부수효과를 피해 오류를 최소화 할 수 있다. -> 변수의 값이 바뀌거나, 객체의 필드 값을 설정하거나 예외나 오류가 발생해서 실행이 중단되는 현상
4. 메소드 호출시 파라미터 값이 변하지 않는다는 것을 보장할 수 있다.
5. 가비지 컬렉션 성능을 높일 수 있음 -> 스캔하는 객체의 수가 줄기 때문에 Gc수행시 지연시간도 줄어든다.

 

13. 추상클래스와 인터페이스의 설명 그리고 차이
추상 클래스 : abstract으로 정의되고 추상 메서드를 가질 수 있지만 일반 메서드도 같이 가질 수 있음
인터페이스 : 인터페이스 내 메서드가 추상 메서드만으로 정의되어있음

공통점 : new 로 새로운 인스턴스 생성이 불가능하다
             사용하기 위해서 하위 클래스에서 확장,구현해야 한다.
차이점 : 인터페이스는 그 인터페이스를 상속받은 하위클래스에서 인터페이스의 메서드를 모두 사용해야함
              추상클래스는 상속받는 클래스들의 공통적인 로직을 추상화, 기능 확장을 위해 사용한다.
              추상클래스는 다중상속이 불가하지만 인터페이스는 다중상속이 가능하다

상속 : 추상클래스는 extends, 인터페이스는 implements로 상속받는다. (인터페이스가 인터페이스를 상속받을 때는 extends를 사용한다)
              

 

14. 싱글톤 패턴이란?
싱글톤 패턴은 단 하나의 인스턴스 생성해 사용하는 디자인 패턴임
인스턴스가 1개만 존재하는 걸 보장 + 동일한 인스턴스를 자주 생성해야 하는 경우에 주로 사용한다.

장점 : 메모리 낭비를 방지할 수 있음
          어디서든 동일한 객체 호출이 가능하다.
단점 : 객체의 결합도가 올라감 -> 개방폐쇄 원칙에 위반됨

 

14-1. 싱글톤 패턴의 대표적인 예시를 간단하게 설명하시오.
싱글톤 패턴의 대표적인 예시는 Spring Bean 이다.
스프링의 빈 등록 방식은 기본적으로 싱글톤 스코프이고, 스프링 컨테이너는 모든 빈들을 싱글톤으로 관리한다.
ex @service 했을 때 다른 곳에서 사용이 가능한게 그 이유이다.

 

15. 가비지 컬렉션(garbage Collection)이란?
가비지 컬렉션은 JVM의 메모리 관리 기법 중 하나로 시스템에서 동적으로 할당됐던 메모리 영역 중에서 필요 없어진 메모리 영역을 회수하여 메모리를 관리해주는 기법이다.

GC의 작업을 수행하기 위해 JVM이 어플리케이션의 실행을 잠시 멈추고( Stop-the-world : 다른 쓰레드가 객체 상태를 바꾸면 안되기 때문에), GC를 실행하는 쓰레드를 제외한 모든 쓰레드들의 작업을 중단 후 사용하지 않는 메모리를 제거하고 작업이 재개된다.

* 참조되지 않는 객체를 사용하지 않는 메모리로 간주한다.

 

16. 객체지향의 설계원칙에 대해 설명하시오.
1. 단일 책임 원칙(SRP) : 한 클래스는 하나의 책임만 가져야 한다.
2. 개방-폐쇄 원칙(OCP) : 확장에는열려있고, 수정에는 닫혀있어야 한다.
3. 리스코프 치환 원칙(LSP) : 하위 타입은 항상 상위 타입을 대체할 수 있어야 한다.
4. 인터페이스 분리 원칙(ISP) : 인터페이스 내에 메소드는 최소한 일수록 좋다.(하나의 일반적인 인터페이스보다 여러개의 구체적인 인터페이스가 낫다) SRP와 같은 문제에 대한 두 가지 다른 해결책임.
5. 의존관계 역전 원칙(DIP) : 구체적인 클래스보다 상위 클래스, 인터페이스, 추상 클래스와 같이 변하지 않을 가능성이 높은 클래스와 관계를 맺어라. (DIP 원칙을 따르는 가장 인기 있는 방법은 의존성 주입(DI)이다.

 

17. 자바의 메모리 영역에 대해 설명하시오.
자바의 메모리 공간은 크게 Method영역, Stack영역, Heap 영역으로 구분되고, 데이터 타입에 따라 할당된다.
- 메서드(Method) 영역 : 전역변수와 static 변수를 저장하며, Method 영역은 프로그램의 시작부터 종료까지 메모리에 남아있다.
- 스택(Stack) 영역 : 참조변수( 객체의 주소(레퍼런스)를 담는 변수 ), 지역변수와 매개변수 데이터 값이 저장되는 공간이며, 메소드가 호출될 때 메모리에 할당되고 종료되면 메모리가 해제된다. (LIFO) 구조를 갖고 변수에 새로운 데이터가 할당되면 이전 데이터는 지워진다.
- 힙(Heap) 영역 : new 키워드로 생성되는 객체(인스턴스), 인스턴스 변수의 실제 값, 배열, List, Map 등이 Heap 영역에 저장되며, 가비지 컬렉션에 의해 메모리가 관리되어진다.

메소드영역 : 클래스와 관련된 정보가 올라간다.
1. 클래스 이름, 부모 클래스 정보 클래스 이름, 상속 여부 class Dog extends Animal
2. 필드(멤버 변수) 정보 변수 이름, 타입, 접근 제어자 등 private String name; (물론 실제값은 
3. 메서드 정보 메서드 이름, 리턴 타입, 파라미터, 접근자 등 public void bark()
4. 정적 변수 (static 변수) 클래스에 소속된 변수 static int count;
5. 정적 메서드 (static method) 클래스에 소속된 메서드 static void print()
6. 생성자 정보 생성자 이름, 파라미터 등 public Dog(String name)
7. 접근 제어자 정보 public, private 등 private, protected 등
8. 상수 풀 (constant pool) 문자열 리터럴, 상수 값들 "hello", 3.14, final int A = 1;
9. 메서드 바이트코드 실제 실행될 명령어 집합 bark()의 내부 명령

 

17-1. 각 메모리 영역이 할당되는 시점은 언제인지?
1. Method : JVM이 동작해서 클래스가 로딩될 때 생성
2. Stack : 메소드가 호출될 때 할당
3. heap : 런타임시 할당

 

18. 클래스, 객체, 인스턴스에 대해 설명하시오.
클래스 : 객체를 만들어 내기 위한 설계도, 객체를 생성하는 데 사용한다
객체 : 클래스를 기반으로 생성되고 자신의 고유 이름, 상태, 행동을 갖는다.
여기서 상태는 필드(fileds), 행동은 메소드(method)라고 표현한다.
인스턴스 : 객체가 메모리에 할당되어 실제로 활용되는 실체 '인스턴스' -> 주소값을 가지는

 

19. 생성자(Constructor)에 대해 설명하시오.
생성자는 클래스와 같은 이름의 메소드로, 객체가 생성될 때 호출되는 메소드이다.
명시적으로 생성자를 만들지 않아도 default로 만들어지며, 생성자는 파라미터를 다르게하여 오버로딩할 수 있다.

 

20. Wrapper Class란? 그리고 Boxing unBoxing은 무엇인지?
기본자료형에 대한 객체 표현을 Wrapper class라고 한다.
기본 자료형 -> Wrapper class로 변환하는 것을 Boxing이라고 하며
Wrapper class -> 기본 자료형으로 변환하는 것을 unBoxing이라고 한다.

 

21. Synchronized(동기화)에 대해 설명하시오.
- 여러개의 쓰레드가 한 개의 자원을 사용하고자 할 때, 현재 데이터를 사용하고 있는 쓰레드를 제외하고 나머지 쓰레드들은 데이터에 접근할 수 없게 막는 개념
- 데이터의 Thread-safe를 하기 위해서 자바에서 Synchronized 키워드를 제공해 멀티 쓰레드 환경에서 쓰레드간 동기화를 시켜 데이터의 thread-safe를 보장한다.
- Synchronized는 변수와 메소드에 사용해서 동기화 할 수 있으며, Synchronized 키워드를 남발하게 되면 오히려 프로그램의 성능저하를 일으킬 수 있다. 

 

22. new String()과 리터럴("")의 차이에 대해 설명하시오.
new String()은 new 키워드로 새로운 객체를 생성하기 때문에 Heap 메모리 영역에 저장되고
""는 Heap 안에 있는 String Constant Poool 영역에 저장된다.

 

  • "Cat" → 리터럴이라서 String Pool에 있음 (Heap의 특수 공간)
  • new String("Cat") → (Pool에 있는 "Cat"을 복사해서(복사하지 않더라도)),
    Heap에 새로운 String 객체 생성 (별개의 주소!)
23.String, StringBuffer, StringBuilder의 차이를 설명해주세요.
String은 불변의 속성을 가지며, StringBuffer와 StringBuilder는 가변의 속성을 가진다.
StringBuffer는 동기화를 지원하며 멀티쓰레드 환경에서 주로 사용하며,
StringBuilder는 동기화를 지원하지 않아 싱글 쓰레드 환경에서 주로 사용한다.

 

24. String 객체가 불변인 이유는?
1. 캐싱 기능에 의한 메모리 절약과 속도 향상
 - Java에서 String 객체들은 heap의 String Pool이라는 공간에 저장되는데, 참조하려는 문자열이 String Pool에 존재하는 경우 새로 생성하지 않고 Pool에 있는 String 객체를 사용하기 때문에 특정 문자열 값을 재사용하는 빈도가 높을 수록 상당한 성능 향상을 기대할 수 있다.
2. Thread-safe
- String 객체는 불변이기 대문에 여러 쓰레드에서 동시에 특정 String 객체를 참조하더라도 안전하다
3. 보안기능
- 중요한 데이터를 문자열로 다루는 경우 해당참조에 대한 문자열 값을 바꾸는 것이 불가능하기 때문에 보안에 유리하다.

 

25. 접근 제한자에 대해 설명하시오.
변수 또는 메서드의 접근 범위를 설정해주기 위해서 사용하는 Java의 예약어를 의미하고 총 4가지 종류가 있음
1. public : 접근 제한이 없다.(같은 프로젝트 내 어디서든 사용가능)
2. protected : 해당 패키지 내, 다른 패키지에서 상속받아 자손 클래스에서 접근 가능하다.
3. private : 해당 클래스에서만 접근가능
4. (default) : 해당 패키지 내에서만 접근 가능

 

26. 클래스 멤버 변수 초기화 순서에 대해 설명하시오.
1. static 변수 선언부 : 클래스가 로드 될 때 변수가 제일 먼저 초기화 된다.
2. 필드 변수 선언부 : 객체가 생성될 때 생성자 block 보다 앞서 초기화 된다.
3. 생성자 block : 객체가 생성될 때 JVM이 내부적으로 locking(thread-safe 영역)