[Java] 첫 면접 스터디 후기 & 질문 모음

hyunoi·2024년 12월 2일

Java

목록 보기
20/20
post-thumbnail

후기

거의 한 달 동안 자바에 대해서 공부를 했다.
우리의 계획은 한 달 동안 열심히 공부하고 매월 마지막 주 수요일(바뀔 수도 있음!)에 대면으로 모여서 면접 스터디를 하는 것이었다!

어떤 방식으로 진행을 했냐면,,,
6명 각자가 전체 부분에서 10개 정도 질문을 뽑아와서 한 명씩 돌아가며 질문을 던지면, 그것에 대해 아는 사람이 대답하는 식이었다.
만약 그 사람이 대답을 잘 못하면? 다른 사람이 그 대답의 보충 설명을 이어 나간다.

이런 식의 면접 스터디는 처음이라서 처음에는 좀 뚝딱이는 부분이 있었지만, 처음 한두 개 정도하다 보니 스스럼없이 말할 수는 있었던 것 같다.

하지만 잘 대답하는 거랑 스스럼없이 대답하는 거랑은 다른 것...
제대로 대답한 질문이 거의 없다 ㅋㅋㅋ

그리고 공부할 때 아리송했던 부분을 다 같이 얼굴을 보면서 얘기를 하니까 뭔가 더 의사소통이 잘 되고, 이해도 잘 되는 기분이었다. 확실히 대면이 좋긴 한 듯?

다음 CS 주제는 공부를 더 확실하게 해서 가야겠다는 생각을 했다. 하나씩 공부할 때 소홀히 하지 말고 외울 건 확실하게 외우고, 이해할 것은 확실하게 이해하는 걸로...

질문 모음

아래는 스터디를 하면서 나온 질문들이다.

  1. 가비지 컬렉션이 어떻게 작동하는지와 그 알고리즘에 대해서 설명하세요
    가비지 컬렉션은 우선 Stop the world를 진행합니다. 이것은 JVM에서 가비지 컬렉션을 실행하기 위해서 스레드를 멈추는 행위입니다. 이후에 가비지 컬렉션이 수행되는데 알고리즘으로는 크게 두 가지가 있습니다. 먼저 Young Generation에서 사용하는 Mark-Sweep 알고리즘입니다. Mark 단계에서 현재 참조가 되고 있는 객체는 Reachable, 참조되지 않은 객체는 Unreachable로 참조 되는 객체들을 mark합니다. 이후에 Sweep 단계에서는 참조되지 않은 객체, Unreachable 된 객체를 식별하고 회수하는 작업을 진행합니다. 이후에 비워진 메모리를 다시 사용할 수 있음을 알리기 위해서 메모리 풀에 추가하는 작업까지 합니다. 다른 알고리즘으로는 Old Generation에서 사용하는 Mark-Sweep-Compact가 있는데 앞의 두 단계는 앞서 말한 Mark-Sweep 알고리즘과 동일합니다. 이후 Compact는 앞의 Sweep 단계에서 메모리를 다 비웠는데, 큰 객체의 경우 연속된 큰 공간의 메모리가 필요한데 조각화되어 있는 메모리를 재배열하여 큰 객체가 할당될 수 있게 합니다.

  2. 자바는 Call by Value, Call by Reference 둘 중 어떤 것을 지원하고, 지원하는 이유는 뭡니까
    자바는 Call by Value를 지원합니다. 자바에서는 메소드에 값을 전달할 때 참조값의 복사본을 전달합니다. 즉, 메소드가 호출될 때 전달된 변수의 복사본이 넘어가고 이것은 복사본이기 때문에 원본 객체에 영향을 끼치지 않습니다. 그래서 자바는 Call by Value를 지원합니다.

  3. 클래스, 객체, 인스턴스에 대해 설명하세요
    클래스는 객체를 만들기 위한 설명서로 변수, 메소드 등이 포함되어 있습니다.
    객체는 클래스를 이용하여 만드는 것으로 세상에 실존하는 것을 객체라고 부릅니다.
    인스턴스는 객체가 컴퓨터 메모리 상에 할당이 되면 그것은 인스턴스입니다.
    예를 들어, Car 클래스에서 new를 해서 benz 객체를 만들면 이것은 인스턴스입니다.

  4. 캡슐화와 은닉화의 차이에 대해 설명하세요
    우선 캡슐화는 관련된 변수와 메소드를 한 클래스에서 묶어 외부로부터 보호하는 것이고, 은닉화는 캡슐화를 하기 위해서 중요한 정보들을 외부에서 접근하지 못하도록 하는 것입니다.
    캡슐화와 은닉화는 차이라기 보다는 캡슐화를 하기 위해서 은닉화가 필수적으로 이루어져야합니다.

  5. 문자열을 다루는 세 가지 클래스를 불변성과 가변성을 사용하여 설명하세요
    먼저 문자열을 다루는 클래스로는 String, StringBuffer, StringBuilder가 있습니다. String 클래스는 객체를 생성하고 난 후 수정이 불가능합니다. 만약 수정을 한다면 그것은 객체를 수정하는 것이 아닌 새로운 객체를 만들어 바꿔치기를 하는 것입니다. 그래서 String은 불변성의 성질을 가집니다. 나머지 StringBuffer, StringBuilder는 수정이 가능하므로 가변성의 성질을 가집니다.

  6. 객체지향 프로그래밍의 특징을 간단히 설명하세요
    객체지향 프로그래밍의 특징으로는 추상화, 캡슐화, 상속, 다형성 이렇게 네 가지가 있습니다. 먼저 추상화는 객체가 수행할 수 있는 행위와 속성을 정의하고 세부 구현은 숨기는 것이고, 캡슐화는 변수와 메소드를 하나로 묶어서 정보를 숨기고 보호할 수 있습니다. 상속은 코드 재사용을 위해서 클래스 간 계층 구조를 가지는 것입니다. 마지막으로 다형성은 같은 메소드가 다양한 방식으로 동작하는 것으로 오버라이딩과 오버로딩을 통해 구현됩니다.

  7. 동일성과 동등성의 차이에 대해 설명하세요
    동일성은 자바 내에서 == 로 사용하며 두 객체가 같은 메모리 주소를 참조하는지 확인합니다. 동등성은 equals 연산자를 사용하여 두 객체의 값이 같은지 확인합니다. 동일성은 무조건 주소값이 같아야 Ture 값을 반환하는 반면, 동등성의 경우 값이 같은지만 확인하기 때문에 주소값은 달라도 값만 같으면 True 값을 반환합니다.

  8. JDK와 JRE의 차이를 설명하세요

  9. 제네릭이 무엇인지, 왜 사용하는지 설명하세요
    제네릭은 클래스나 메소드에서 사용하는 데이터 타입을 컴파일 시점에 미리 지정하는 방법입니다. 이는 메소드와 클래스에 잘못된 타입이 들어가는 경우를 미리 방지해 타입 안정성을 높일 수 있고, 외부에서 타입을 지정해주기 때문에 따로 타입을 체크하거나 변환할 필요가 없습니다. 그리고 똑같은 구조의 데이터 타입이 다른 경우에 제네릭을 사용하여 만들면 코드의 중복이 줄어듭니다.

  10. name과 age 필드를 가진 Person 객체가 있습니다. Set과 Map에 name과 age가 모두 같은 Person 1 객체와 Person 2 객체를 넣는 것이 가능할까요?
    equals()와 hashCode()를 오버라이딩하지 않은 상황이라면 넣을 수 없습니다.
    10-1. 그러면 두 객체가 같게끔 판단하려면 어떻게 해야 하나요?
    equals() 메소드를 오버라이딩하며 name과 age가 같은 경우 동등하다고 판단하도록 하고, hashCode() 메소드를 오버라이딩하여 name과 age가 같은 경우 같은 hashCode를 반환하도록 합니다. 그렇게 하면 두 객체가 동등하다고 판단할 수 있습니다.

  11. 오버라이딩과 오버로딩에 대해 설명하세요
    둘 다 객체지향 프로그래밍의 특징 중 하나인 다형성에서 사용되는 기능입니다.
    오버라이딩은 부모 클래스에 있는 메소드를 자식 클래스에서 상속받아 재정의하는 것입니다. 오버로딩은 한 클래스 내에서 같은 이름을 가진 메소드가 여러 개 있지만 각각의 매개변수와 반환값이 달라서 상황에 따라 골라서 사용할 수 있는 것입니다. 오버라이딩은 런타임 시점에, 오버로딩은 컴파일 시점에 호출될 메소드가 결정됩니다.

  12. Java가 컴파일되는 과정에 대해 설명하세요
    Java의 컴파일 과정은 크게 소스코드 작성, 컴파일, 클래스 로딩, 실행 네 가지 단계를 거칩니다.
    먼저 사용자가 자바 파일을 작성하고, 자바 컴파일러 javac가 자바 파일을 바이트 코드인 클래스 파일로 변환합니다. 그 클래스 파일은 클래스 로더에 의해 JVM 메모리에 로드됩니다. 바이트 코드가 JVM Execution Engine에 의해 실행이 됩니다. JVM은 바이트 코드를 하나하나 명령어 단위로 가져와서 읽으면서 실행하는데, 인터프리터와 JIT 컴파일러가 사용됩니다. 이후 자바 프로그램이 실행됩니다.

  13. 자바의 주요 특징에 대해 설명하세요

  14. 추상클래스와 인터페이스의 차이점에 대해 설명하세요

  15. Primitive 타입과 Reference 타입에 대해 설명하세요
    Primitive 타입은 integer, boolean 처럼 값 자체가 복사되어서 전달되고 전달된 값은 수정이 불가능합니다. Reference 타입은 Primitive 타입을 제외한 모든 타입으로 객체의 주소값이 복사되어 전달되고, 객체 상태는 수정이 가능하지만 기존의 참조 변수는 수정이 되지 않습니다.

  16. 컬렉션 프레임워크에 대해 간단히 설명하세요

  1. Error와 Exception의 차이에 대해 설명하세요
    Error는 시스템 레벨에서 발생하는 것으로 복구나 처리가 어려운 문제입니다. Error 발생 시에는 프로그램이 종료됩니다. Exception은 프로그램 내에서 처리 가능한 복구 가능한 문제로 Checked Exception과 UnChecked Exception으로 나누어집니다. Checked Exception 컴파일 시점에서 무조건 처리되어야 하는 예외 처리를 하지 않으면 컴파일 자체가 되지 않습니다. UnChecked Exception은 보통 개발자의 실수로 발생되는 예외로 예외처리를 하지 않아도 컴파일은 되지만 런타임 시점에서 예외가 발생하게 됩니다.

차차 시간 날 때 적어보겠다...~

0개의 댓글