개발놀이터

여태까지 공부한 Java 면접질문 / 답변 본문

CS 지식/면접준비

여태까지 공부한 Java 면접질문 / 답변

마늘냄새폴폴 2023. 4. 6. 05:24

4부터 시작하는 것은 넘어가주시길 바랍니다... 따로 정리하면서 공부한거라 Java 면접질문이 아닌 123번을 제외하고 4번부터 수록했습니다. 꼬리질문에 대한 답변도 수록했기 때문에 조금 길게 느껴질 수 있습니다. 

 

이 글을 보고 면접질문을 공부하실 분들은 우선 질답을 외우고 (저와 똑같이 안외워도 됩니다) 따로 찾아서 공부하시고 꼬리질문도 생각해보시면 좋을 것 같습니다. 

 

4. OOP가 뭔가요? 
OOP는 객체지향 프로그래밍의 약자로서 데이터를 객체로 취급하여 프로그램에 반영하고, 순차적으로 프로그램이 동작하는 것이 아니라 객체와 상호작용을 통해 프로그램이 동작하는 것을 말합니다. 이렇게 객체를 연결시켜 프로그래밍하게 되면 캡슐화, 다형성, 상속을 통해 코드의 재사용성을 높이고 유지보수를 줄여준다는 장점이 있습니다. 

5. 추상클래스와 인터페이스의 차이점이 뭔가요?
인터페이스는 다중 상속이 가능하고 필드에 인스턴스를 자유롭게 선언할 수 없으며 필드에 선언시 public static final로 선언해야 합니다. 그 이유는 인터페이스는 그 자체로 인스턴스화 할 수 없기 때문입니다. 그렇기 때문에 객체가 할당되는 시점 즉, 초기화 시점에 할당해야 하고 이는 static으로 밖에 할 수 없습니다. 추상클래스는 다중 상속이 불가능하고 필드에 인스턴스를 자유롭게 선언할 수 있습니다. 추상클래스는 추상 메서드가 하나 이상 존재해야 하기 때문에 메서드의 일부 구현이 가능합니다. 또한, 추상클래스는 필드에 인스턴스를 자유롭게 정의할 수 있기 때문에 private이나 protected와 같은 접근제어자로 외부에 이를 숨길 수도 있습니다. 

6. JVM이 뭔가요?
JVM은 Java Vertual Machine의 약자로 자바 애플리케이션을 클래스 로더를 통해 자바 API와 함께 사용하는 것을 도와줍니다. 또한, 스택 기반의 가상 머신으로 메모리 관리를 도와줍니다. 

7. JVM의 구조에 대해서 설명해주세요
JVM의 구조로는 ClassLoader, Execution Engine, RuntimeData Areas, JNI, Native Method Library 이렇게 존재합니다. ClassLoader는 JVM내에서 클래스를 로딩하여 링크를 통해 배치작업을 수행합니다. Execution Engine은 바이트 코드를 실행하는 역할을 하고, 구성 요소로는 인터프리터, 지트 컴파일러, 가비지 컬렉션이 있습니다. 인터프리터는 바이트 코드를 한줄씩 실행하는 역할을 합니다. 지트 컴파일러는 인터프리터의 효율을 높이기 위해 만든 컴파일러로 인터프리터가 반복되는 코드를 발견하면 반복되는 코드를 네이티브 코드로 바꿔주는 역할을 합니다. 가비지 컬렉션은 힙 영역에서 사용하지 않는 객체를 삭제하는 역할을 합니다. Runtime Data Areas는 프로그램이 동작중에 사용되는 다양한 영역이고 구성 요소로는 PC Register, Stack Area, Heap Area, Method Area가 있습니다. PC Register는 스레드가 실행될 때 실행되고 JVM내의 주소를 가지고 있습니다. Stack Area는 지역변수, 파라미터등이 저장되는 공간으로 실제 객체는 Heap 영역에 저장되지만 레퍼런스는 Stack영역에 저장됩니다. Heap Area는 동적으로 할당된 객체나 배열이 저장되는 공간으로 가비지 컬렉션의 영역입니다. Method Area는 메서드 정보, type 정보, static 변수, final 변수, 상수 풀 등이 저장되는 공간입니다. 

8. GC에 대해서 설명해주세요. 
가비지컬렉션은 힙 영역에서 참조가 남아있는 객체를 삭제하는 역할을 합니다. 이렇게 삭제를 해야하는 이유는 자바라는 언어는 개발자가 직접 메모리를 손댈 수 있는 언어가 아니기 때문입니다. 따라서 이렇게 삭제시켜주는 객체가 있어야 합니다. 

9. GC의 동작방식에 대해서 설명해주세요. 
GC의 동작방식은 가장 간단한 Serial GC로 설명할 수 있습니다. GC는 Minor GC, Major GC로 나눠집니다. Minor GC는 영한 영역에서 Major GC는 올드한 영역에서 일어난다고 정의합니다. Minor GC는 에덴영역이 가득 차면서부터 시작됩니다. 에덴 영역이 가득차면 참조가 남아있는 객체는 서바이벌 영역으로 복사되고 에덴영역이 비워집니다. 또 다시 에덴 영역이 가득차면 다시 참조가 남아있는 객체들이 서바이벌 영역에 복사되고 에덴 영역이 지워집니다. 이렇게 반복하다보면 올드한 영역으로 이동하게 됩니다. 올드한 영역은 Major GC가 활동하는 공간입니다. Major GC는 Minor GC와 다르게 삭제되어야 하는 객체들을 삭제시키는 역할을 합니다. 이렇게 객체를 지우고 나면 메모리는 단편화된 상태가 됩니다. 그렇기 때문에 이 공간을 한군데로 모아주어야하고 이를 Compaction, Compact라고 합니다. 따라서 이때 쓰이는 알고리즘이 Mark Sweep Compact 알고리즘입니다. 또한 GC를 수행하는 스레드 이외의 스레드는 모두 정지합니다. 이를 Stop The World라고 합니다. 개발자들은 이 STW를 줄이기 위해 많은 GC를 개발했고 Serial GC이후에 Parallel GC, CMS GC, G1 GC등을 개발했습니다. 

10. Mark Sweep Compact 알고리즘이 필요한 이유가 뭔가요?
Mark Sweep Compact 알고리즘이 필요한 이유는 책이 가득찬 책장으로 비유할 수 있습니다. 책장에 책이 가득차서 더이상 들어갈 공간이 없을 때 읽지 않는 책을 정리하기 위해 버리는 작업을 수행합니다. 그렇게 되면 책장에는 버린 책의 크기만큼 공간이 생기게 됩니다. 이때 버린 책의 크기보다 더 큰 크기의 책을 저장하기 위해서 책장에 넣게 되면 들어가지 않고 이 때 프로그램은 OutOfMemorry Error가 발생합니다. 그렇기 때문에 이 책장을 한군데로 모아주는 작업이 필요하고 때문에 Mark Sweep Compact 알고리즘을 사용해 단편화된 메모리를 한군데 모아주어야 합니다. 

11. Mark Sweep Compact 알고리즘 말고 다른 알고리즘을 아는게 있나요?
Mark and Sweep 알고리즘과 Mark and Copy 알고리즘을 알고있습니다. Mark and Sweep 알고리즘은 GC가 GC Root를 돌면서 참조가 남아있는 객체는 Mark하고 그렇지 않은 객체는 Sweep하는 알고리즘입니다. Mark and Copy 알고리즘은 GC가 수행될 때 프로그램이 정지하는 시간을 줄여주는 알고리즘입니다. 

12. 컬렉션 프레임워크에 대해서 설명해주세요. 
세상에서 널리 사용되는 자료구조를 바탕으로 데이터를 좀 더 쉽게 관리하기 위해 자료구조를 모아놓은 프레임워크가 바로 컬렉션 프레임워크입니다. 

13. 제네릭에 대해서 설명해주세요. 
제네릭은 자바에서 타입안정성을 맡고있습니다. 컴파일시에 타입을 체크해주기 때문에, 형 변환의 번거로움을 줄여줍니다. 

14. 어노테이션에 대해서 설명해주세요. 
어노테이션은 인터페이스를 기반으로 한 문법으로 주석처럼 코드에 달아 새로운 기능을 부여하거나 특별한 기능을 주입할 수 있습니다. 

15. 오버라이딩, 오버로딩에 대해서 설명해주세요. 
오버라이딩은 상위 타입의 메서드를 재정의 하는 것이라고 할 수 있습니다. 또한, 오버라이딩은 런타임 다형성입니다. 오버로딩은 같은 클래스 내에서 메서드 이름은 같지만 파라미터의 개수나 매개변수의 타입이 다르게 설계하는 방법입니다. 또한, 오버로딩은 컴파일타임 다형성입니다. 

16. static (정적) 에 대해서 설명해주세요. 
클래스 멤버변수, 정적 변수라고도 불리는 static 변수는 클래스로더를 통해 메서드 메모리 영역에 클래스별로 적재됩니다. static 키워드를 사용한 변수는 PermGen이나 MetaSpace에 저장되고 이렇게 저장된 객체는 어디서든지 참조가 가능하다는 장점이 있습니다. 하지만 메모리에 항상 상주하고 있기 때문에 GC의 영역밖에 있기 때문에 시스템이 종료되어도 메모리에 남아있게 됩니다. 따라서 너무 남발하면 프로그램에 악영향을 미칠 수도 있습니다. 

17. 자바의 원시타입의 종류와 크기에 대해서 설명해주세요. 
boolean 1바이트, unsigned char 2바이트, byte 1바이트, short 2바이트, int 4바이트, long 8바이트, float 4바이트, double 8바이트로 이렇게 여덟개가 있습니다. 하지만 이 크기는 JVM에 의존적이기 때문에 대략적인 수치입니다. 

18. 접근 제어자의 종류
접근 제어자는 private, default, protected, public 이렇게 네가지가 있습니다. private은 같은 클래스 내에서 접근 가능하고, default는 같은 패키지 안에서, protected는 부모 자식간에서만, public은 어느곳에서나 접근이 가능합니다. 접근 제어자를 사용하는 이유는 외부 클래스에 보여주고 싶은 정보를 선택적으로 제공하기 위함이고 이는 객체지향에서 말하는 캡슐화와 일맥상통합니다. 

19. 객체지향의 5대원칙 SOLID에 대해서 설명해주세요.
SOLID는 SRP, OCP, LSP, ISP, DIP의 앞글자를 따서 만든 단어입니다. 각각에 대해서 설명하자면 SRP는 단일 책임 원칙으로 하나의 객체는 하나의 책임만을 가져야 한다는 원칙입니다. OCP는 개방 폐쇄 원칙으로 확장에는 열려있으나 변경에는 닫혀있어야 한다는 원칙입니다. 이는 다형성을 이용해서 해결할 수 있습니다. LSP는 리스코프 치환원칙으로 객체는 프로그램의 정확성을 깨뜨려서는 안되고, 리스코프 치환원칙에 따르면 상위타입을 오버라이딩 했을 때 프로그램의 정확성을 깨뜨려서는 안됩니다. ISP는 인터페이스 분리 원칙으로 클라이언트는 자신이 사용하지 않는 메서드에 의존해서는 안된다는 원칙입니다. 특정 클라이언트를 위한 인터페이스 여러개가 범용 인터페이스보다 낫습니다. 따라서 인터페이스를 더 작게 분리하고 쪼개야합니다. DIP는 의존관계 역전 원칙으로 객체는 자신보다 구체적인 것에 의존해서는 안되고 변화하기 쉬운 것에 의존해서는 안된다는 원칙입니다. 즉, 구현클래스에 의존하지 말고 추상클래스에 의존해야 한다는  것입니다. 

20. 동일성과 동등성에 대해서 설명해주세요. 
동일성은 객체의 주소를 비교하는 것이고, 동등성은 객체의 같음을 비교하는 것입니다. 보통 Object 클래스의 equals 메서드로 동등성을 판단하지만 개발자가 원한다면 equals 메서드를 오버라이딩해서 동등성의 판단의 기준을 정할 수 있습니다. 

21. 원시타입과 참조타입에 대해서 설명해주세요. 
원시타입은 자바에서 8개밖에 존재하지 않는 타입입니다. 나머지는 전부 참조타입입니다. 참조타입은 Object 클래스이거나 이를 오버라이딩한 클래스이고 이 둘의 차이는 원시타입은 null값을 가질 수 없지만 참조타입은 가질 수 있다는 점과, 멤버 변수로 선언되었을 때 원시타입은 초기값을 가지지만 참조타입은 null값을 가진다는 차이점도 존재합니다. 

22. CheckedException과 UnCheckedExcetion에 대해서 설명해주세요. 
이 둘은 RuntimeException을 상속하는지 여부에 따라 달라집니다. 상속한다면 UnCheckedException 상속하지 않는다면 CheckedException입니다. CheckedException은 예외가 발생했을 때 반드시 try/catch문으로 예외를 해결해주거나 throws 를 통해 메서드 밖으로 던져버려야 합니다. UnCheckedException은 말 그대로 컴파일러가 예외를 체크하지 않겠다는 의미이고 따라서 try/catch문으로 반드시 예외를 처리해주지 않아도 되고 throws를 통해 메서들 밖으로 던져버리는 것 또한 생략할 수 있습니다. 

23. 그럼 둘 중 어느것을 사용해야 할까요? 
기본적으로는 UnCheckedException을 사용해야 합니다. 그 이유는 기본적으로 예외는 처리 불가능한 예외가 대부분이고 또한 프로그램의 확장으로 예외가 변경되었을 때 CheckedException을 사용하면 그 예외에 맞는 모든 예외를 바꿔야합니다. 이는 OCP에 위배되기 때문에 지양해야 합니다. 하지만 CheckedException은 개발자끼리 서로 협력할 때 이 예외는 반드시 처리해야 한다고 명시해줄 수 있습니다. 예를 들어서 회원가입시 아이디 중복체크를 반드시 하고 넘어가야 한다거나, 돈과 관련된 비즈니스 로직을 처리해야 할때는 CheckedException을 사용하면 좋습니다. 하지만 기본적으로는 UnCheckedException을 사용하고 로그를 통해 빠르게 개발자가 알아차리는 것이 중요합니다. 

24. String, StringBuilder, StringBuffer에 대해서 설명해주세요. 
String은 불변타입입니다. StringBuilder와 StringBuffer는 이러한 String의 특징때문에 나온 가변타입입니다. 이 둘의 차이는 스레드 세이프한지의 여부에 따라 다릅니다. StringBuilder는 스레드 세이프하지 않고, StringBuffer는 스레드 세이프합니다. 따라서 멀티스레드 환경에서는 StringBuffer를 사용해야 합니다. 

25. Java8에 추가된 기능 (요건 사실 잘 안물어봅니다)
Optional, Lambda, Stream API, 시간날짜 API가 있습니다. Optional은 Null safety를 위해 나온 기능이고 Lambda는 함수형 프로그래밍을 지원하기 위해 나온 기능입니다. Stream API는 고차원 함수를 지원하고 시간날짜 API는 기존 Date 클래스를 이용해 만들던 날짜를 좀 더 쉽게 작성할 수 있게 도와줍니다. 

26. try-with resources 에 대해서 설명해주세요. 
try 블록 안에 개발자가 사용할 객체를 명시적으로 선언하고 try 블록안의 로직이 정상적으로 완료되던, 비정상적으로 완료되던간에 무조건 JVM에 자원을 반환하는 것이 바로 try-with resources입니다. 

27. 결합도에 대해서 설명해주세요.
결합도는 서로다른 두 모듈간에 의존성 정도를 나타내고 어느 한 모듈에 대해 얼마나 많이 알고 있는지에 대한 척도입니다. 어떤 모듈이 한 모듈에 대해 너무 많은 정보를 알고 있는 경우 이 둘은 강한 결합도를 가진다고 말합니다. 어떤 모듈이 한 모듈에 대해 적당한 수준의 정보를 알고 있는 경우 이 둘은 느슨한 결합도를 가진다고 말합니다. 객체지향의 관점에서 결합도는 객체 또는 클래스가 협력에 필요한 적절한 수준의 관계를 유지하고 있는지를 나타냅니다. 따라서 개발자는 강한 결합을 지양해야하며 항상 적절한 수준의 결합도를 유지하기위해 노력해야합니다. 

28. 직렬화, 역직렬화에 대해서 설명해주세요.
직렬화, 역직렬화는 자바시스템 내부에서 사용하고있는 객체 또는 데이터를 자바시스템 외부에서 사용할 수 있도록 바이트 형태로 변환하거나 이미 바이트 형태로 되어있는 것을 다시 변환하는 작업을 말합니다. 자바 직렬화에서 JVM에 상주하고 있는 객체 데이터를 영속화 하기 위해 사용됩니다. 시스템이 종료되더라도 삭제되지 않는 장점을 가지고 있으며 영속화된 데이터이기 때문에 네트워크로 전송이 가능합니다. 

29. 동시성 문제
동시성 문제는 멀티 스레드 환경에서 여러개의 스레드가 하나의 변수 혹은 하나의 메서드에 접근할 때 값이 꼬여 개발자가 원하는대로 작동하지 않는 경우를 말합니다. 동시성 프로그래밍에서 CPU와 RAM 사이에 있는 CPU Cache Memory의 존재와 병렬성이라는 특징 때문에 가시성과 원자성 문제가 발생합니다. 가시성 문제는 volatile 키워드로, 원자성 문제는 synchronized 키워드로 해결할 수 있습니다.