Heestory

신입 자바 기술 면접 List 본문

개발(~국비)/기술면접

신입 자바 기술 면접 List

까만밀가루 2022. 11. 15. 22:43

면접 2주차 

기술 면접에서 멘탈 털려 하나씩 정리 말고 한 번에 정리하는게 좋을 거 같아

구글에서 검색했을 때 상위 5개 안의 블로그 글을 모아 자바 자주 나오는 리스트 정리했다

출처는 상위 5개 블로그...

내가 본 곳은 신입이라 그런지 이정도 물어보진 않았는데 알아두면 좋겠다!

빨간줄 - 모든 면접장에서 질문 받은거 

 


 

1.JVM(Java Virtual Machine)

: 자바 바이트 코드를 OS에 맞게 해석해 주는 역할

시스템 메모리를 관리하면서 자바 기반 애플리케이션을 위해 이식 가능한 실행 환경을 제공

 

2.JAVA 언어의 장단점

장점

-운영체제에 독립적이다. : JVM (자바 가상머신) 에서 동작하기 때문에, 특정 운영체제에 종속되지 않는다.

-객체지향 언어이다.

객체 지향적으로 프로그래밍하기 위해 여러 언어적 지원을 하고 있다. (캡슐화, 상속, 추상화, 다형성 등)

객체지향 패러다임의 특성상 비교적 이해하기 배우기 쉽다.

-자동으로 메모리를 관리 해준다.

: JVM 에서 Grabage Collector 라고 불리는 GC로 인해 별도의 메모리 관리가 필요 없으며 비즈니스 로직에 집중 할 수 있다.

-오픈소스이다.

: 많은 JAVA 개발자가 존재하고 생태계가 잘 구축되어 있어, 오픈소스 라이브러리가 풍부하며, 잘 활용하면 짧은 개발 시간 내에 안정적은 애플리케이션을 쉽게 구현할 수 있다.

-멀티스레드를 쉽게 구현할 수 있다.

: 자바는 스레드 생성 및 제어와 관련된 라이브러리 API 를 제공하고 있기 때문에 실행되는 운영체제에 상관없이 멀티 스레드를 쉽게 구현할 수 있다.

-동적 로딩(Dynamic Loading)을 지원한다.

: 애플리케이션이 실행될 때 모든 객체가 생성되지 않고, 각 객체가 필요한 시점에 클래스를 동적 로딩해서 생성한다. 또한 유지보수 시 해당 클래스만 수정하면 되기 때문에 전체 애플리케이션을 다시 컴파일 할 필요가 없기 때문에 유지보수가 쉽고 빠르다.

단점

-비교적 속도가 느리다.

: 자바는 한 번의 컴파일링으로 실행 가능한 기계어가 만들어지지 않고, JVM에 의해 기계어로 번역되고 실행하는 과정을 거치기 때문에 CC++ 의 컴파일 단계에서 만들어지는 완전한 기계어보다는 속도가 느리다. 하지만 하드웨어의 성능 향상과 바이트 코드를 기계어로 변환해주는 JIT 컴파일러와 같은 기술 적용으로 JVM 기능이 향상되어 속도의 격차가 많이 줄어들었다.

-예외처리가 불편하다.

: 프로그래머 검사가 필요한 예외가 등장하면 무조건 프로그래머가 선언을 해주어야한다.

 

 

3.JAVA의 접근 제어자 종류와 특징

 

4.OOP

프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법

 

5.OOP의 장단점

장점

-코드 재사용이 용이 : 남이 만든 클래스를 가져와서 이용할 수 있고 상속을 통해 확장해서 사용할 수 있다.

-유지보수가 쉬움 : 절차 지향 프로그래밍에서는 코드를 수정해야할 때 일일이 찾아 수정해야하는 반면 객체 지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수혹은 메서드로 존재하기 때문에 해당 부분만 수정하면 된다.

-대형 프로젝트에 적합 : 클래스 단위로 모듈화시켜서 개발할 수 있으므로 대형 프로젝트처럼 여러 명, 여러 회사에서 프로젝트를 개발할 때 업무 분담하기 쉽다.

단점

-처리 속도가 상대적으로 느림

-객체가 많으면 용량이 커질 수 있음

-설계 시 많은 시간과 노력이 필요

 

 

6.OOP 특징

추상화 : 구체적인 사물들의 공통적인 특징을 파악해 이를 하나의 개념(집합)으로 다루는 것

캡슐화 : 정보 은닉 (Information hiding) : 필요가 없는 정보는 외부에서 접근하지 못하도록 제한 하는 것

일반화 관계 : 여러 개체들이 가진 공통된 특성을 부각시켜 하나의 개념이나 법칙으로 성립시키는 과정

다형성 : 서로 다른 클래스의 객체가 같은 메세지를 받았을 때 각자의 방식으로 동작하는 능력

-오버라이딩부모클래스의 메서드와 같은 이름, 매개변수를 재정의 하는것.

-오버로딩같은 이름의 함수를 여러개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것.

상속 : 부모클래스의 속성과 기능을 그대로 이어받아 사용할 수 있게하고 기능의 일부분을 변경해야 할 경우 상속받은 자식클래스에서 해당 기능만 다시 수정(정의)하여 사용할 수 있게 하는 것

 

+OOP5대 원칙

SRP(단일 책임 원칙) - 1개의 클래스는 1개의 책임만 가져야 한다.

OCP(개방-폐쇄 원칙) - 확장에는 열려 있으나 변경에는 닫혀 있어야 하며, 다형성을 활용해야 한다.

ISP(인터페이스 분리 원칙) - 클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안 되는 원칙 / . 거대한 인터페이스보단 더 작고 구체적인 인터에 피스로 분리해야 한다.

DIP(의존관계 역전 원칙) - 추상적인 것은 자신보다 구체적인 것에 의존하지 않고, 변화하기 쉬운 것에 의존해서는 안된다는 원칙 / 구체적으로는 구현 클래스에 의존하지 말고, 인터페이스에 의존해야 하는 원칙이다.

 

 

7.getter,setter를 사용하는 이유는?

메서드를 통해서 접근하기 때문에, 메서드 안에서 매개변수같이 어떤 올바르지 않은 입력에 대해 사전에 처리할 수 있게 제한하거나 조절할 수 있기 때문

예를들면 setter에서 유효범위를 넘은 정수가 들어왔을 때의 처리를 하고나서 set하거나 예외처리를 해버릴 수 있는 것이다.

getter도 마찬가지로 굳이 예를들자면 자료에 무언가 더하거나 빼고 준다든지가 가능하다.

 

 

8.static

클래스 멤버(변수, 메소드)에 붙이는 키워드

프로그램의 생성과 함께 할당되고 프로그램의 종료시에 해제 된다.

static 키워드를 통해 생성된 정적 멤버들은 PermGen 또는 Metaspace에 저장되며 저장된 메모리는 모든 객체가 공유하며 하나의 멤버를 어디서든지 참조할 수 있는 장점

 

 

9.변수란 무엇이며,

- 값을 저장할 수 있는 메모리 상의 공간을 의미

- 기본형, 참조형

 

 

10.변수를 사용하는 목적이 무엇인가

- 코드의 재활용성과 가독성을 높여주고, 중복을 제거해서 유지보수를 용이하게 하기 위해 사용한다.

 

 

11.클래스와 객체의 차이점은 무엇인가.

- 객체 : 소프트웨어 세계에 구현할 대상

- 클래스 : 객체를 구현하기 위한 틀, 연관되어 있는 변수와 메서드의 집합

 

 

12.오버로딩과 오버라이딩 차이

추가로 "@Override" 어노테이션을 써야 하는 이유는 컴파일 타임에 오버 라이딩에 대한 안정성을 부여해주기 때문.

-오버 라이딩(Overriding)은 상위 클래스의 메서드를 재정의 하는 것을 의미 / 런타임 다형성

-오버 로딩(Overloading)은 같은 Class 내에서 동일한 메서드 이름을 가지지만, 매개 변수의 타입 혹은 개수가 다르게 구현할 수 있는 것을 의미 / 컴파일 타임 다형성

 

 

13.JAVA 메모리 영역 - 메모리//스택

메모리

static 영역 (== class, method 영역으로도 불림) 은 전역변수나 static으로 선언되는 것들을 메모리에 상주시킵니다.

-클래스 정보, static 변수, 변수 정보, 메소드 정보 등을 저장합니다.

-패키지나 클래스 정보가 올라갑니다.

-static 이 선언된 클래스 멤버도 올라갑니다.

-static (전역)변수는 어디든 접근이 가능해지므로 읽기 전용이 아닌 경우는 가능한 사용하지 않습니다.

-JVM이 동작해서 클래스가 로딩될 때 생성됩니다.

-JVM이 종료될때까지 유지됩니다.

:인스턴스를 생성할 때 생성되는 메모리 형식

-"new"를 사용하여 객체를 만들 때 저장됩니다.

-참조형(class, interface, enum, Array ) 자료형도 같이 저장됩니다.

-힙의 참조 주소는 "스택"이 갖고 있고 해당 객체를 통해서만 힙 영역에 있는 인스턴스를 핸들링할 수 있습니다.

-GC가 정리하기 전까지는 남아있습니다.

스택 : int, long, boolean 등 기본 자료형을 생성할 때 저장하는 공간으로, 임시적으로 사용되는 변수나 정보들이 저장되는 영역

-쓰레드 별로 1개만 생성됩니다.

-하나의 쓰레드는 내부적으로 static, stack, heap 영역을 갖게 됩니다.

그래서 A쓰레드는 다른 쓰레드에 접근할 수는 없지만, staticheap 영역을 공유하여 사용할 수 있습니다.

-메소드가 호출될 때마다 생성하고,

-메서드 실행이 끝나면 pop되어 제거됩니다.

 

 

14. 변수의 선언 위치에 따른 변수 종류와 메모리 할당 위치

- 클래스 변수 : 클래스 영역, 클래스가 메모리에 올라갈 때 / 객체 생성 없이 사용 가능 / 객체가 공통 변수 공유

EX.Math / 메모리 영역

- 인스턴스 변수 : 클래스 영역, 인스턴스가 생성될 때 / 힙 영역

- 지역 변수 : 클래스 이외의 영역(메서드, 생성자, 초기화블럭), 변수 선언문이 수행되었을 때

#.힙 영역에 런타임시 동적으로 할당되는 객체들은 해제가 되는데 Method 영역의 정보들은 메모리를 계속 점유하고 있어 필요한 것만 static을 붙여 클래스 변수로 선언

 

 

15.매개변수와 인자

매개변수 : 함수를 정의할 때 사용되는 변수

인자 : 실제로 함수가 호출될 때 넘기는 변수값

 

 

16.final : 변수나 메서드 또는 클래스가 변경 불가능하게 만든다.

final 변수

- 상수라고도 불린다

- 변수를 선언함과 동시에 초기화하며 이후에 값을 수정할 수 없다.

- 오직 get만 가능하다.

final 메소드

- 오버라이딩(Overriding)이 불가능하다.

- 상속 받은 그대로 사용해야 한다.

final 클래스

- 상속(Inheritance)이 불가능하다.

- subclass를 만들 수 없다.(하위클래스)

 

 

17.finally : try/catch 블록이 종료될 때 항상 실행될 코드블록을 정의하기 위해

finalize() : GC가 더 이상의 참조가 존재하지 않는 객체를 메모리에서 삭제하겠다고 결정하는 순간 호출

오버라이드해서 맞춤별 GC 정의 가능

 

 

18.제네릭

모든 종류의 타입을 다룰 수 있도록 일반화 된 타입 매개 변수(generic type)로 클래스나 메서드를 선언하는 기법

- 컴파일 타임에 타입을 체크하기 때문에 객체 자체의 타입 안전성을 높인다.

- 형 변환의 번거로움을 줄일 수 있다.

 

 

19.StringStringBuilder의 차이점

String클래스는 조회가 많은 환경에서 성능적으로 유리하며, StringBuffer&StringBuilder 클래스는 문자열 연산이 자주 발생할 때 문자열이 변경 가능 할 객체기 때문에 성능적으로 유리하다.

- StringBufferStringBuilder의 차이점

StringBufferStringBuilder의 차이점은 동기화 지원의 유무이고 동기화를 고려하지 않는 환경에서 StringBuilder가 성능이 더 좋고, 동기화가 필요한 멀티쓰레드 환경에서는 StringBuffer를 사용하는 것이 유리하다.

 

 

20.Wrapper 클래스 

:기본 자료타입을 객체로 다루기 위해서 사용하는 클래스

8개의 기본 타입에 해당하는 데이터를 객체로 표현하기 위해 포장해주는 클래스

박싱 : 기본 타입의 값을 포장 객체로 만드는 과정 <-> 언박싱

 

 

21.예외처리를 하는 목적

프로그램의 비정상 종료를 막고 정상적인 실행상태를 유지하기 위해

- try, catch, throw, throws, finally

 

 

22.사용해본 Stream 종류에 대해 설명하세요

- InputStream : 문자/바이트 입력 스트림을 위한 추상클래스

- OutputStream : 문자 출력 스트림을 위한 추상클래스

- FileInputStream : 파일에서 바이트를 읽어들여 문자/바이트 스트림으로 변환

- FileOutputStream : 문자/바이트 스트림을 바이트 파일로 변환

 

 

23.자료구조를 사용하는 이유

데이터를 사용하는데 있어 효율성을 높이기 위해

 

 

24.List, Set, Map

25.tree구조와 stack, queue 자료 구조에 대해

tree : 계층적 자료구조로 루트라는 노드가 있고 각 연결된 노드는 부모-자식 관계이며 노드간 사이클이 존재하지 않는 자료구조

stack : 입력된 데이터는 중복될 수 있으며 나중에 들어간 것이 먼저 나오는 후입 선출 자료구조이다.

queue : 입려된 데이터는 중복될 수 있으며 먼저 들어간 것이 먼저 나오는 선입선출 자료구조이다.

 

 

26.스레드와 프로세스의 차이

프로세스

- 프로그램이 메모리에 올라와 운영체제로부터 CPU를 할당받고 프로그램이 실행되고 있는 상태.

- 운영체제로부터 시스템 자원을 할당 받는 작업의 단위

- 하나의 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신이 필요(IPC)

Ex. 메일 슬롯, 파이프, 소켓, 시그널, 공유 메모리

- 할당 받는 시스템 자원

: Code, Data, Stack, Heap 구조로 되어있는 독립된 메모리 영역

: 주소 영역, CPU 시간

스레드 : Thread 클래스 상속, Runnable 인터페이스 구현

- 프로세스 내에서 실행되는 흐름의 단위

- 프로세스 하나에 자원을 공유하면서 일련의 과정을 여러 개 동시에 실행 시 킬 수 있는 것

- 하나의 프로세스 내에 주소 공간이나 자원을 공유, stack만 따로 할당 받고, 나머지는 공유

- 하나의 프로세스가 생성되면 하나의 스레드(메인 스레드)가 생성됨

멀티 프로세스 대신 멀티 스레드를 사용하는 이유

: 자원의 효율성 극대, 처리 비용감소, 응답 시간 단축

 

 

27.동기화처리란

- synchronized / wait(), notify()

여러 개의 스레드가 한 개의 자원을 사용하고자 할 때 해당 스레드만 제외하고 나머지는 접근을 못하도록 막는 것

 

 

28.데몬스레드란

: 주 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드

 

 

29.서버와 클라이언트에 대해 설명하세요

-클라이언트 : 서비스를 사용하는 사용자

-서버 : 클라이언트에게 네트워크를 통해 서비스를 제공하는 시스템

 

 

30.직렬화

Java에서 입출력할 때는 스트림이라는 데이터 통로를 통해 이동한다. 하지만 객체는 그렇지 않아서 스트림을 통해 전송이 불가능해서 객체를 스트림으로 입출력하기 위해 바이트 배열로 변환하는 것을 의미함

역 직렬화 : 스트림 -> 객체

 

 

31.리플렉션

구체적인 클래스 타입을 알지 못해도 클래스의 메서드, 타입, 변수들을 접근할 수 있게 해주는 Java API

JVM에서 실행되는 애플리케이션의 런타임 동작을 검사하거나 수정할 수 있는 기능이 필요한 프로그램에서 사용됨

 

 

32.컬렉션 프레임워크(Java Collection Framework)

자료 구조를 바탕으로 객체, 데이터들을 효율적으로 관리할 수 있는 자료 구조들이 있는 라이브러리

List, SetCollection 인터페이스를 상속받지만, Map 인터페이스는 구조상의 차이라 별도로 정의한다.

 

 

33.GC(가 바지 콜렉터) ?

GC는 힙(Heap) 영역에서 사용하지 않는 객체(인스턴스)들을 제거하는 작업을 의미

작업이 필요한 이유 : Java는 개발자가 메모리를 직접 해제해줄 수 없는 언어이기에 객체를 사용하고 제거하는 기능이 필요함

 

 

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

추상 클래스는 객체의 추상적인 상위 개념으로 공통된 개념을 표현할 때 사용하고, 단일 상속만 가능하다. 그리고 추상 클래스를 상속하는 집합 간에는 연관 관계가 있다.

- 추상 클래스에서 설계가 완료되면 자식 클래스에서 상속을 받아서 기능을 확장하는데 용이

- 자식 클래스에서 추상 메소드의 구현을 강요하기 때문에 표준화 정도를 높임

- 클래스들의 공통 사항을 한 곳에서 관리할 수 있기 때문에 개발 및 유지보수가 편리해짐

인터페이스는 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용하고, 다중 상속이 가능하다. 인터페이스를 구현하는 집한 간에는 관계가 없을 수 있다.

1. 개발 시간을 단축 시킬 수 있다.

- 인터페이스를 사용하면 다른 개발자들이 각각의 부분을 완성할 때 까지 기다리지 않고 서로 규약만 정해두어 각자의 부분만 따로 나눠서 작성된 코드를 컴파일 할 수 있다.

2. 클래스 간 결합도를 낮출 수 있다.

- 코드의 종속성을 줄이고 유지보수성을 높이도록 해준다.

3. 표준화가 가능하다.

- 클래스의 기본틀을 제공하여 개발자들에게 정형화된 개발을 제시할 수 있다.

 

 

35.return이란?

- 값을 반환하는 동작을 한다.

- 메서드를 중단시키는 역할도 한다. return이 처음 등장한 이후의 구문은 실행되지 않는다.

 

'개발(~국비) > 기술면접' 카테고리의 다른 글

신입 스프링 기술 면접 List  (0) 2022.11.15
18.스프링②  (0) 2022.11.10
17.WEB/WAS  (0) 2022.11.10
16.스프링①  (0) 2022.11.02
15.JSP와 Servlet  (0) 2022.11.01