CS공부

면접준비를 해볼까...(1)

티코딩 2023. 11. 29. 12:07

요즘 이력서와 포트폴리오를 계속 수정하면서 지원하고있다. 아직까진 연락이 안왔지만 언젠간 면접을 볼거라 믿고 면접준비겸 공부나해보려고한다.

얘기를 들어보면 보통 내가 한 프로젝트에서 왜 이 기술을 썼으며, 코드는 왜 이런방식으로 짰는지 물어본다고 한다. 그건 2편에 써보도록하고, 내가 사용하는 기술들에관해 제대로 알고 내가 설명할 수 있을정도로 되기 위해서 이번 포스팅을 작성해보려고 한다.

https://dev-coco.tistory.com/153

 

신입 개발자 기술면접 질문 정리 - 자바

💡 Java의 특징을 설명해주세요. Java는 객체지향 프로그래밍 언어입니다. 기본 자료형을 제외한 모든 요소들이 객체로 표현되고, 객체 지향 개념의 특징인 캡슐화, 상속, 다형성이 잘 적용된 언

dev-coco.tistory.com

이분블로그에 내가 하려던게 모두 있다. 이블로그를 많이 참조했으므로, 정보가 필요하다면 내 포스팅을 보지 말고 위의 포스팅을 참고하도록 하자.

먼저 내가 사용하는 언어, JAVA에 관해서 보자. 솔직히 JAVA에 관한 질문을 하진 않을거같지만 그래도 내가 쓰는언어에 대해서 더 자세히 알고있는편이 더 좋을것 같으므로, 한번 정리하며 외워보자.

질문은 위의 포스팅에서 가져왔다.

대답은 내가 공부하면서 적은거고 대답형식이니 존댓말로 적는다.

Java의 특징을 설명해주세요.

Java의 가장 큰 특징으로는 객체지향 프로그래밍 언어라는 점입니다. 모든 코드를 클래스와 객체형태로 구성합니다. 이런 형태로 인해 코드의 재사용성을 높이고 유지보수를 용이하게 할 수 있다는 장점이 있습니다. 그 외엔 JVM을 통해 다양한 운영체제에서 실행 될 수 있습니다. 

JVM의 역할에 대해 설명해주세요.

JVM은 자바 컴파일러가 소스코드를 바이트코드로 바꾸면 이 바이트코드를 실행해 다양한 운영체제에서 실행 될 수 있게 해줍니다. 그리고 가비지 컬렉션을 통해 메모리 관리를 담당합니다.

Java의 컴파일 과정에 대해 설명해주세요.

.java 확장자 파일을 Java 컴파일러가 javac 명령어로 컴파일하면 .class 확장자로 저장되고, JVM의 클래스로더에 의해 로드되고 런타임환경에서 실행됩니다.

Java에서 제공하는 원시 타입들에 무엇이 있고, 각각 몇 바이트를 차지하나요?

정수타입으로 byte, short, int, long 이 있고 각각 1, 2, 4, 8 바이트입니다. 소수점타입으로는 float, double 이 있고 각각 4, 8 바이트입니다. 문자타입은 char이 있고 2바이트입니다. boolean타입은 1바이트입니다.

오버라이딩(Overriding)과 오버로딩(Overloading)에 대해 설명해주세요.

오버로딩은 과적이라는 뜻으로 같은 이름의 메서드나 생성자를 여러개 정의하는 것을 말합니다. 같은이름이지만 매개변수가 달라야 합니다.

오버라이딩은 상위 클래스에서 정의된 메서드를 하위 클래스에서 재정의하는것을 말합니다.

객체지향 프로그래밍(OOP)에 대해 설명해주세요

프로그래밍에서 필요한 데이터를 추상화 시켜 객체를 만들고, 객체들 간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법론입니다. 주요 키워드로 클래스와 객체, 캡슐화, 상속, 다형성이 있습니다. 클래스는 속성과 동작을 정의하고 객체는 실제로 메모리에 할당되어 사용되는 클래스의 인스턴스입니다. 캡슐화는 간단히 데이터와 해당 데이터를 처리하기 위한 메서드를 하나로 묶어 외부로의 접근을 제어하는것입니다. 상속은 코드의 재사용성과 일관성을 위해 기존클래스의 속성과 메서드를 물려받아 새로운 클래스를 만드는것입니다. 다형성은 동일한 인터페이스를 사용하여 여러 객체를 다양한 방식으로 다루는 능력을 말합니다.

불변 객체가 무엇인지 설명하고 대표적인 Java의 예시를 설명해주세요

불변객체란 생성된 후에 그 상태를 변경할 수 없는 객체를 말합니다. 이러한 불변 객체는 다중 스레드 환경에서 안전하며, 예측 가능하고 디버깅이 쉬운 코드를 작성하는 데 도움이 됩니다. 모든 필드를 final로 선언합니다. 자바에서는 String 객체가 불변객체의 대표적입니다.

참조 타입일 경우 추가적인 작업은 어떤게 있는지 설명해주세요

불변 객체의 경우 기본적으로 객체의 상태를 변경할 수 없지만, 참조 타입을 포함하는 경우 추가적인 주의가 필요합니다. 참조 타입이라 함은 객체 내부에 다른 객체를 참조하는 경우를 의미합니다. 가변 객체를 사용해야 할 경우 해당 객체를 불변으로 감싸는 방법이 있습니다.

불변 객체나 final을 굳이 사용해야 하는 이유가 있을까요?

코드의 안정성, 예측 가능성, 다중 스레드 환경에서의 안전성 등 여러 측면에서의 이점이 있습니다.

싱글톤 패턴에 대해 설명해주세요.

어떤 클래스가 단 하나의 인스턴스만을 가지고, 그 인스턴스에 대한 전역적인 접근점을 제공하는 디자인 패턴입니다. 이 패턴을 사용하면 특정 클래스의 인스턴스가 프로그램 전체에서 하나만 존재하도록 보장할 수 있습니다.

추상 클래스와 인터페이스를 설명해주시고, 차이에 대해 설명해주세요.

추상 클래스는 일부 메서드에 대한 구현이나 필드를 포함할 수 있습니다. 즉, 일부 메서드는 구현이 되어 있고 일부는 추상 메서드로 선언될 수 있습니다. 인터페이스는 모든 메서드가 기본적으로 추상 메서드이며 디폴트 메서드와 정적 메서드를 가질 수 있게 되었습니다.

가비지 컬렉션(Garbage Collection)에 대해 설명해주세요

프로그램 실행 중에 더 이상 사용되지 않는 메모리를 자동으로 회수하는 메커니즘입니다. 가비지 컬렉션은 프로그래머가 메모리 관리에 대해 직접 걱정하지 않도록 하고, 메모리 누수와 같은 문제를 방지합니다.

객체지향의 설계원칙에 대해 설명해주세요.

SOLID라고 표현됩니다. 단일책임원칙, 한 클래스는 하나의 책임만 가져야합니다. 개방/폐쇄 원칙, 기존의 코드를 변경하지 않으면서 새로운 기능을 추가할 수 있도록 설계해야 합니다. 리스코프 치환원칙, 파생 클래스는 기반 클래스로 대체할 수 있어야 합니다. 부모클래스 타입의 변수에 자식 클래스를 대입해도 정상적으로 작동해야 합니다. 인터페이스 분리 원칙, 하나의 큰 인터페이스보단 여러개의 작은 인터페이스가 더 나은 설계입니다. 의존역전 원칙, 고수준 모듈은 저수준 모듈에 의존해선 안 되며, 둘 모두 추상화에 의존해야 합니다.

 자바의 메모리 영역에 대해 설명해주세요

힙 영역, 스택 영역, 메소드 영역 세군데가 있습니다. 힙 영역은 동적으로 생성된 객체가 저장되는 공간입니다. 스택 영역은 메소드 호출과 관련된 정보를 저장하는 영역입니다. 메소드 영역은 클래스 로더에 의해 로딩된 클래스 파일, 메소드, 상수, static 변수 등의 정보를 저장하는 영역입니다.

클래스와 객체에 대해 설명해주세요

클래스는 객체의 속성과 메서드를 정의하고 객체는 클래스의 인스턴스로, 클래스를 기반으로 실제 데이터를 포함하고 있는 메모리 공간입니다.

생성자(Constructor)에 대해 설명해주세요

객체를 초기화하는 메서드로, 객체가 생성될때 자동으로 호출됩니다. 여러개의 생성자를 가질 수 있고, 각 생성자는 다른 매개변수를 가질 수 있습니다.

Wrapper Class란 무엇이며, Boxing과 UnBoxing은 무엇인지 설명해주세요

기본타입을 객체로 감싸는 클래스입니다. 이런 기본 타입들을 객체로 다뤄야 할 때, 래퍼클래스를 사용합니다.

박싱은 기본타입의 값을 래퍼클래스로 감싸는 과정을 말합니다. 언박싱은 그반대로 래퍼클래스에 감싸진 값을 다시 기본 데이터 타입으로 추출하는 과정입니다.

Synchronized에 대해 아는 대로 말해주세요

싱크로나이즈는 자바에서 멀티 스레딩 환경에서 동기화를 달성하기 위한 방법입니다. 메서드단에 싱크로나이즈드를 쓰면 해당메서드를 한번에 한 스레드에의해서만 실행되도록 할 수 있습니다.

new String()과 리터럴("")의 차이에 대해 설명해주세요

둘다 문자열을 생성하는방법이지만, new String()으로 문자열을 생성하면 힙영역에 생성해서 새로운 객체를 생성합니다. 리터럴로 생성하면 문자열 풀에 저장됩니다.

String, StringBuffer, StringBuilder의 차이를 설명해주세요

String 클래스는 불변한 특성을 가집니다. 한번 생성된 문자열을 변경하는 연산이 수행될때마다 새로운 문자열을 생성합니다. StringBuffer클래스는 가변한 문자열을 지원합니다. 문자열 변경연산이 있어도새로운 객체를 생성하지 않습니다.

StringBuilder클래스는 StringBuffer 클래스와 비슷하게 가변한 문자열을 지원하지만 동기화를 보장하지 않아 단일 스레드 환경에서 사용됩니다.

String 객체가 불변인 이유에 대해 아는대로 설명해주세요

스레드 안전성, 보안성, 캐싱가능, 메모리 절약

접근 제한자(Access Modifier)에 대해 설명해주세요

public, protected,default,private 순으로 접근범위가넓습니다. 접근제한자는 캡슐화, 보안, 유지보수성,재사용성 등에 장점이 있어 사용합니다.

클래스 멤버 변수 초기화 순서에 대해 설명해주세요.

명시적 초기화 또는 기본 초기값으로 초기화, 인스턴스 블록, 생성자 순으로 초기화됩니다.

static에 대해 설명해주세요.

static은 자바에서 클래스 멤버를 정의할 때 사용되는 키워드로, 해당 멤버가 클래스 레벨의 멤버이며 객체에 속하지 않음을 나타냅니다. static 멤버는 클래스가 로딩될 때 메모리에 할당되고 객체의 생성 여부와 상관없이 사용할 수 있습니다.

static을 사용하는 이유에 대해 설명해주세요

클래스가 로딩될 때 메모리에 할당되므로 객체를 생성하지 않아도 사용할 수 있습니다. 한 번의 변경이 모든 객체에 반영되므로 데이터의 일관성을 유지할 수 있습니다.

Error와 Exception의 차이를 설명해주세요.

에러는 시스템 레벨에서의 치명적인 문제를 말하고, 복구할 수 없는 상황을 말하고, 익셉션은 복구가능한 상황을 나타냅니다. 예외처리를 하면 됩니다.

CheckedException과 UnCheckedException의 차이를 설명해주세요.

체크드 익셉션은 java.lang.Exception을 상속받는 예외들중 런타임익셉션을 제외한 모든 예외를 말함. 반드시 예외처리를 해줘야합니다. 언체크드 익셉션은 java.lang.RuntimeException을 상속받는 에외들이며, 예외처리를 강제하지 않습니다.

제네릭에 대해 설명해주시고, 왜 쓰는지 알려주세요.

자바에서 컬렉션 클래스나 메서드에서 사용되는 타입을 일반화하기 위한 기능입니다. 제네릭을 사용하는 이유로는 타입 안전성, 코드의 재사용성, 프로그램 구조의 단순화가 있습니다. 컴파일러가 타입관련 오류를 미리 감지할 수 있고, 한번작성한 코드를 다양한 타입에 대해 재사용할 수 있습니다.

 

 

일단은 여기까지만 정리했다. 2편엔 원래 프로젝트에 관련한 질문들을 다뤄보려했지만 스프링부트에 관련한 내용들에 대해 준비해봐야겠다.