본문으로 바로가기

개발자 면접 질문(자바, 스프링)

category IT인터뷰면접질문 2018. 10. 4. 11:42

OOP란 ?


데이터를 객체로 취급하여 프로그램에 반영한 것이며, 순차적으로 프로그램이 동작하는 기존의 것들과는 다르게 객체의 상호작용을 통해 프로그램이 동작하는 것을 말합니다. 캡슐화, 다형성, 상속 을 이용하여 코드 재사용을 증가시키고, 유지보수를 감소시키는 장점을 얻기 위해서 객체들을 연결 시켜 프로그래밍 하는 것 입니다.


자바의 메모리 영역(간단하게 설명)


1. 메서드 영역 : static 변수, 전역변수, 코드에서 사용되는 Class 정보 등이 올라간다.코드에서 사용되는 class들을 로더로 읽어 클래스별로 런타임 필드데이터, 메서드 데이터 등을 분류해 저장한다.

2. 스택(Stack) : 지역변수, 함수(메서드) 등이 할당되는 LIFO(Last In First Out) 방식의 메모리

3. 힙(Heap) : new 연산자를 통한 동작할당된 객체들이 저장되며, 가비지 컬렉션에 의해 메모리가 관리되어 진다.

인터페이스(Interface)란? 또 왜 사용하나?

인터페이스는 모든 메서드가 구현부가 없는 추상메서드로 이루어진 클래스로, abstract 키워드를 붙이지 않아도 자동으로 모든 메서드는 추상메서드로

정의가 된다. 또한 변수도 자동으로 final static 키워드가 붙게 된다.

– 메모리 상수풀 영역 이란

힙영역(프로그래머가 관리하는 메모리 영역)에 생성되어 자바 프로세스 종료까지 계속 유지되는 메모리영역입니다. 기본적으로 JVM에서 관리하며 프로그래머가 작성한 상수에 대해 최우선적으로 찾아보고 없으면 상수풀에 추가한 이후 그 주소값을 리턴합니다. 그로 인해 메모리 절약 효가가 있습니다.


왜 인터페이스를 사용하는가?


팀작업시 개발코드 부분과 객체가 서로 통신하는 접점 역할을 지원하게 되는데, 이는 개발코드에선 객체의 내부 구조를 모르더라도 인터페이스의

메서드 명만 알고 있으면 되기 때문이다. 이를 통해 얻을 수 있는 장점은 해당 메서드를 통해 나오는 결과물을 알고 있기 때문에 다른 팀의

작업을 기다리고 있지 않아도 되며, 또한 해당 객체가 수정될 경우 개발 코드 부분은 수정을 하지 않아도 된다.

또한, 부가적으로 객체를 파일에 쓰기 위해 Serializable 인터페이스를 구현하거나, Collections.sort()를 하기 위해서 Comparable 인터페이스를

상속하는 것, Cloneable 을 구현하는 것처럼 특정 작업을 하겠다라는 "Mark"역할을 해주기도 한다.


jdbc란 무엇인가


자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API이다. JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다.


직렬화란 무엇인가


자바에서 입출력에 사용되는 것은 스트림이라는 데이터 통로를 통해 이동했습니다. 하지만 객체는 바이트형이 아니라서 스트림을 통해 파일에 저장하거나 네트워크로 전송할 수 없습니다. 따라서 객체를 스트림을 통해 입출력하려면 바이트 배열로 변환하는 것이 필요한데, 이를 '직렬화' 라고 합니다. 반대로 스트림을 통해 받은 직렬화된 객체를 원래 모양으로 만드는 과정을 역직렬화라고 합니다.


serialVersionUID를 선언해야 하는 이유


자바가상기계 (JVM)은 직렬화와 역직렬화를 하는 시점의 클래스에 대한 버전 번호를 부여합니다. 만약 그 시점에 클래스의 정의가 바뀌어 있다면 새로운 버전 번호를 할당합니다. 그래서 직렬화할 때의 버전 번호와 역직렬화를 할 때의 버전 번호가 다르면 역직렬화가 불가능하게 될 수도 있습니다. 이런 문제를 해결하기 위해 SerialVerionUID를 사용합니다.

간단명료하게 serialVersionUID값을 저장할 때 클래스 버전이 맞는지 확인하기 위한 용도입니다.

만약 직렬화할 때 사용한 serialVersionUID의 값과 역직렬화 하기 위해 사용했던 serialVersionUID값이 다르다면 InvalidClassException이 발생할 수 있습니다.


리플렉션이란 무엇인가요


리플렉션은 컴파일러를 무시하고 런타임 상황에서 메모리에 올라간 클래스나 메서드등의 정의를 동적으로 찾아서 조작할 수 있는 일련의 행위를 말합니다. 즉 동적인 언어의 특징이라 말 할 수 있습니다. 프레임워크에서 유연성이 있는 동작을 위해 자주 사용하기도 합니다.


자바의 클래스 멤버 변수 초기화 순서에 대해서 설명하라.


1. static 변수 선언부 : 클래스가 로드 될 때 (메모리 모델상 Methd area 에 올라감) 변수가 제일 먼저 초기화 됨


2. 필드 변수 선언부 : 객체 생성 될 때 (메모리 모델상 Heap area에 올라감) 생성자 block 보다 앞서 초기화 함


3. 생성자 block : 객체 생성 될 때 (메모리 모델상 Heap area에 올라감)

JVM이 내부적으로 locking (thread safe 영역임)

필드 변수 중 final 변수의 가시화는 (다른 스레드에 공개하는 시점은) 생성자 block이 끝난 다음.

필드 변수 선언부에서 이미 초기화 되었다면 그 값들은 덮어 씀


초기화 시점

   * 클래스변수의 초기화시점 : 클래스가 처음 로딩될 때 단 한번 초기화 된다.

   * 인스턴스변수의 초기화시점 : 인스턴스가 생성될 때마다 각 인스턴스별로 초기화가 이루어진다.


초기화 순서

   * 클래스변수의 초기화순서 : 기본값 -> 명시적초기화 -> 클래스 초기화 블럭

   * 인스턴스변수의 초기화순서 : 기본값 -> 명시적초기화 -> 인스턴스 초기화 블럭 -> 생성자


Servlet vs JSP


- Servlet : 자바 언어로 웹 개발을 위해 만들어진 것으로, Container가 이해할 수 있게 구성된 순수 자바코드로만 이루어진 것

- JSP : html 기반에 JAVA 코드를 블록화하여 삽입한 것으로 Servlet을 좀 더 쉽게 접근할 수 있도록 만들어 진 것


제너릭


클래스를 선언할 때 타입을 결정하지 않고 객체를 생성할 때 유동적인 타입으로 재사용하기 위한 것

형변환을 할 필요없고, 타입 에러가 발생할 확률이 없어진다.


타입추론은 메서드를 호출하는 코드에서 타입인자가 정의한대로 제대로 쓰였는지 살펴보는 컴파일러의 능력이다. 


컬렉션(collection) 클래스에서 제네릭을 사용하는 이유를 설명하시오.


컬렉션 클래스에서 제네릭을 사용하면 컴파일러는 특정 타입만 포함 될 수 있도록 컬렉션을 제한합니다.

컬렉션 클래스에 저장하는 인스턴스 타입을 제한하여 런타임에 발생할 수 있는 잠재적인 모든 예외를 컴파일타임에 잡아낼 수 있도록 도와줍니다.


pojo란 무엇인가


Plain Old Java Object. 간단히 포조 라는 말 그대로 해석하며 ㄴ오래된 방식의 자바 오브젝트로서 J2EE등의 중량 프레임워크들을 사용하면서 해당 프레임워크에 종석된 무거운 객체를 만들게 된 것에 반발하여 특정 자바 모델이나 기능, 프레임워크 등을 따르지 않는 자바 오브젝트를 지칭하는 말로 사용되었다.


박싱과 언박싱에 대해서 설명해 보세요.


원시형 -> Wrapper Class로 변환 박싱

Wrapper Class -> 원시형으로 변환 언박싱

여기에 명시적, 묵시적으로 변하는 것을 설명하면 좋을 것 같음.


'데드락’ 이란 무엇이고 이를 해결하기 위한 방법을 설명해 보시오


데드락이란, 둘 이상의 쓰레드가 lock 을 획득하기 위해 기다리는데, 이 lock 을 잡고 있는 쓰레드도 똑같이 다른 lock 을 기다리며 서로 블록 상태에 놓이는 것을 말한다. 데드락은 다수의 쓰레드가 같은 lock 을, 동시에, 다른 명령에 의해, 획득하려 할 때 발생할 수 있다.

- 자원 유형에 따라 우선 순위를 선정하여 자원을 선점하게 한다.

- 공유 불가능한 즉 상호 배제의 조건을 제거한다.


상속과 합성(컴포지션)의 차이에 대해서 설명해 주세요.  

상속은 is a 관계

컴포지션은 개체들 간에 has a 관계이다.


상속은 클래스를 확장하여 부모 클래스에서 속성 및 동작을 상속하는 기능입니다.

자동차는 자동차다.

class Engine{}

abstract class Automobile{}


class car extends Automobile{

private Engine engine;

}


합성은 클래스가 구성원 데이터로 다른 클래스의 객체를 포함 할 수있는 능력입니다.

자동차는 엔진이 포함되어 있다.


JVM 의 역할은 무엇인지 설명해 보세요.


JVM(Java virtual machine)은 자바를 실행하기 위한 가상 기계라고 할 수 있습니다. 여기서 가상 기계란 말이 어색하다면 프로그램을 실행하기 위해 물리적 머신과 유사한 머신을 소프트웨어로 구현한 것이라고 해석할 수 있습니다.

JVM은 Java Byte Code를 OS에 맞게 해석해주는 역활을 합니다. Java Compiler가 *.java 파일을 컴피알을 하면 .class라는 java byte code로 변환시켜 주며, Byte Code는 기계어가 아니기 때문에 OS에서 바로 실행이 되지 않습니다. 이 때 JVM이 OS가 이해할 수 있도록 해석해줍니다


Interface VS abstract


Interface - 일종의 추상 클래스 - 오직 추상메서드와 상수만을 멤버로 갖는다. - Implements 키워드를 사용 - 상속의 관계가 없는 클래스간 서로 공통되는 로직을 구현하여 쓸 수 있도록한다. - Extends는 하나의 클래스만 상속 가능하나 Interface는 다중 상속이 가능하다. Abstract - 추상메서드를 하나 이상 가진 클래스 - 자신의 생성자로 객체 생성 불가능 - 하위 클래스를 참조하여 상위 클래스의 객체를 생성 - 하위 클래스를 제어하기 위해 사용


다형성(폴리모피즘, Polymorphism)에 대해서 설명 하여라


다형성이란 하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 의미한다.





스프링의 MVC에 대해서 설명하시오.


- 객체지향프로그래밍에서, MVC란 사용자 인터페이스를 성공적이며 효과적으로 데이터 모형에 관련 시키기 위한 방법론 또는 설계 방식중 하나이다. MVC방식은 자바, Smalltalk,

- MVC 패턴은 목적 코드의 재사용에 유용한 것은 물론, 사용자 인터페이스와 응용프로그램 개발에 소요되는 시간을 현저하게 줄여주는 형식이라고 많은 개발자들이 평가하고 있다.

MVC 구성요소

Model - 소프트웨어 응용과 그와 관련된 고급 클래스 내의 논리적 데이터 기반 구조를 표현. 이 목적 모형은 사용자 인터페이스에 관한 어떠한 정보도 가지고 있지 않다.

View - 사용자 인터페이스 내의 구성요소들을 표현(사용자에게 보여지는 화면)

Controller - Model과 View를 연결하고 있는 클래스를 대표, Model과 View 내의 클래스들 간 정보 교환하는데 사용.

Spring Framework(스프링 프레임워크)

자바(JAVA) 플랫폼을 위한 오픈소스(Open Source) 애플리케이션 프레임워크(Framework)

자바 엔터프라이즈 개발을 편하게 해주는 오픈 소스 경량급 애플리케이션 프레임워크

자바 개발을 위한 프레임워크로 종속 객체를 생성해주고,  조립해주는 도구

자바로 된 프레임워크로 자바SE로 된 자바 객체(POJO)를 자바EE에 의존적이지 않게 연결해주는 역할

스프링 특징 간단히

- 크기와 부하의 측면에서 경량.

- 제어 역행(IoC)이라는 기술을 통해 애플리케이션의 느슨한 결합을 도모

- 관점지향 프로그래밍(AOP)을 위한 풍부한 지원

- 애플리케이션 객체의 생명 주기와 설정을 포함하고 관리한다는 점에서 일종의 컨테이너(Container)라고 할 수 있음

- 간단한 컴포넌트로 복잡한 애플리케이션을 구성하고 설정할 수 있음


스프링 특징 자세히

a. 경량 컨테이너로서 자바 객체를 직접 관리.

  각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있다.

b. 스프링은 POJO(Plain Old Java Object) 방식의 프레임워크.

  일반적인 J2EE 프레임워크에 비해 구현을 위해 특정한 인터페이스를 구현하거나 상속을 받을 필요가 없어 기존에

  존재하는 라이브러리 등을 지원하기에 용이하고 객체가 가볍다.

c. 스프링은 제어의 역행(IoC : Inversion of Control)을 지원.

  컨트롤의 제어권이 사용자가 아니라 프레임워크에 있어서 필요에 따라 스프링에서 사용자의 코드를 호출한다.

d. 스프링은 의존성 주입(DI : Dependency Injection)을 지원

  각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다.

e. 스프링은 관점 지향 프로그래밍(AOP : Aspect-Oriented Programming)을 지원

  따라서 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.

f. 스프링은 영속성과 관련된 다양한 서비스를 지원

  iBatis나 Hibernate 등 이미 완성도가 높은 데이터베이스 처리 라이브러리와 연결할 수 있는 인터페이스를 제공한다.

g. 스프링은 확장성이 높음.

  스프링 프레임워크에 통합하기 위해 간단하게 기존 라이브러리를 감싸는 정도로 스프링에서 사용이 가능하기 때문에 수많은 라이브러리가

  이미 스프링에서 지원되고 있고 스프링에서 사용되는 라이브러리를 별도로 분리하기도 용이하다.


Spring의 AOP란?


AOP는 Aspect Oriented Programming 관점 지향 프로그래밍의 약자로, 기존의 OOP(객체 지향 프로그래밍)에서 기능별로 class를 분리했음에도 불구하고, 여전히 로그, 트랜잭션, 자원해제, 성능테스트 메서드 처럼 공통적으로 반복되는 중복코드가 여전히 발생하는 단점을 해결하고자 나온 방식으로 이러한 공통 코드를 "횡단 관심사"라 표현하며 개발코드에서는 비지니스 로직에 집중하고 실행시에 비지니스 로직 앞, 뒤 등 원하는 지점에 해당 공통 관심사를 수행할 수 있게 함으로서 중복 코드를 줄일 수 있는 방식입니다.


Spring에서 DI란 무엇인지 아시나요?


DI는 Dependency Injection(의존성 주입)의 약자로, 객체들 간의 의존성을 줄이기 위해 사용되는 Spring의 IOC 컨테이너의 구체적인 구현 방식입니다.

DI는 기존처럼 개발코드 부분에서 객체를 생성하는 것이 아니라, 팩토리 패턴처럼 객체의 생성과, 데이터를 주입만 담당하는 Factory에 해당 하는 별도의 공간에서 객체를 생성하고 데이터간의 의존성을 주입해 개발코드에서는 이를 가져다 씀으로서 의존성을 줄이는 방식입니다. 이때,

Factory 패턴의 Factory Class의 역할을 스프링의 환경설정 파일이 담당합니다.

설정 파일을 통해 객체간의 의존관계를 설정함으로써 외부 Assembler가 객체간의 의존 관계를 정의하게 되며, 객체는 직접 의존하고 있는 객체를 생성하거나 검색할 필요가 없어지므로 코드의 관리가 쉬워진다.


MVC1과 MVC2 패턴의 차이를 설명해 주세요.


Model1(JSP, 자바빈 또는 서비스 클래스)

JSP페이지 내에 로직 처리를 하기 위해 자바 코드가 출력을 위한 코드와 함께 삽입된다. JSP페이지는 요청이 오면 직접 자바빈이나 클래스를 이용하여 작업을 처리하고 처리한 정보를 클라이언트에 출력한다.


장점 : 구조가 단순하다

단점 : 출력을 위한 HTML 코드와 로직 처리를 위한 Java코드가 삽입되어 복잡하고, 유지보수가 어려워진다.


Model2(서플릿, JSP, 자바빈 혹은 서비스 클래스)

모든 처리를 JSP가 담당하는 것이아니라 JSP 페이지와 서블릿 그리고 로직을 위한 클래스가 나뉘어 클라이언트의 요청을 처리한다.


클라이언트에서 요청이 오면 처리할 모델을 클래스 또는 자바 빈이 담당하고 요청결과는 뷰(JSP), 흐름 제어는 Controller인 서블릿이 담당한다.


MVC 패턴이란 Model2 구조를 도입한 구조이며 같은 형태를 가지고 있다.

Model - 서비스 클래스 OR 자바빈

비지니스 로직을 처리하기 위한 모든 것들이 모델에 속한다 EX) 게시판 글쓰기, 가입, 로그인 등 로직을 수행하고 수행 결과를 컨트롤러에 반환한다.


View - JSP

클라이언트에서 출력하는 화면을 말한다.


Controller - 서블릿

MVC 패턴의 모든 흐름제어를 맡는다.

브라우저에서 요청이 들어오면 어떤 요청인지를 분석하고 이 요청을 처리하기 위한 모델을 사용하여 처리한다. 사용한 모델로부터 처리결과를 받으면 추가로 처리하거나 가공해야할 정보가 있다면 처리 후 request 또는 Session 객체에 저장하고 뷰를 선택하여 클라이언트에 출력한다.


장점 : M V C 모델이 나누어 지기 때문에 코드를 분리하여 쉽게 유지보수가용이하다.

뷰, 로직 처리에 대한 분업이 용이하다.

단점 : 구조가 복잡하여 습득이 어렵고 작업량이 많다.


스프링 필터와 인터셉터의 차이


Filter와 Interceptor는 실행되는 시점이 다르다.

Filter는 Web Application에 등록을 하고, Interceptor는 Spring의 Context에 등록을 한다.

컨트롤러에 들어가기 전에 작업을 처리하기 위해 사용할 수 있다는 공통점이 있지만 호출되는 시점이 다르다.


1. Filter는 Dispatcher servlet의 앞단에서 정보를 처리하고, Interceptor는 Dispatcher servlet에서 Handler(Controller)로 가기 전에 정보를 처리한다. 2. 또한 필터는 J2EE 표준 스펙에 정의 되어 있는 기능이며, 인터셉터의 경우는 Spring Framework에서 자체적으로 제공하는 기능이라고 한다. 정확히 어떤 상황에 어떤 기능을 사용해야 하는가에 대해서는 갑론을박이 많지만, 인코딩이나 보안 관련 처리와 같은 web app의 전역적으로 처리해야 하는 로직은 필터로 구현하고 클라이언트에서 들어오는 디테일한 처리(인증, 권한 등)에 대해서는 주로 인터셉터에서 처리하는듯 하다


IOC란 무엇인가


인스턴스 생성의 제어를 개발자 본인이 아닌 다른 누군가에게 반환해 준다는 개념으로 여기서 말하는 다른 누군가는 Servlet과 같은 bean을 관리해주는 컨테이너이다.

즉 IOC란 인스턴스의 생성부터 소멸까지 개발자가 아닌 컨테이너가 대신 관리해준 다는 것이다.


AOP 클래스 참조와 인터페이스 참조 차이점


스프링 부트와 스프링의 차이


스프링 부트는 스프링 프레임워크르 사용하는 프로젝트를 간편하게 셋업할 수 있는 서브 프로젝트이다. 독립 컨테이너에서 동작할 수 있기 때문에 embeded tomcat이 자동으로 실행됩니다. embeded container에서 어플리케이션에서 실행시키기에는 다소 불안전하기 때문에 큰 프로젝트에서는 사용하지 않는 것이 좋다.


Spring MVC 구조의 처리 과정을 설명하라


1. DispatcherServlet : 어플리케이션으로 들어오는 모든 Request를 받는 관문이다. Request를 실제로 처리할 Controller 에게 전달하고 그 결과값을 받아서 View에게 전달하여 적절한 응답등 생성할 수 있도록 흐름을 제어한다.

2. HandlerMapping : Request URL 각각을 어떤 Controller 가 실제로 처리할 것인지 찾아주는 역할을 한다.

3. Controller : Request를 직접 처리한 후 그 결과를 다시 DispatcherServlet 에게 돌려준다.

4. ModelAndView : Controller가 처리한 결과와 그 결과를 보여줄 View에 관한 정보를 담고 있는 객체이다.

5. ViewResolver : View 관련 정보를 갖고 실제 View를 찾아주는 역할을 한다.

6. View : Controller가 처리한 결과값을 보여줄 View를 생성한다.


DAO 와 DTO


DAO

Data Access Object의 약자로 간단히 Database의 data에 접근을 위한 객체입니다. Database에 접근을 하기위한 로직과 비즈니스 로직을 분리하기 위해서 사용을 합니다

DAO(Data Access Object)는 DB를 사용해 데이터를 조화하거나 조작하는 기능을 전담하도록 만든 오브젝트를 말한다.


DTO

DTO(Data Transfer Object)는 VO(Value Object)로 바꿔 말할 수 있는데 계층간 데이터 교환을 위한 자바빈즈를 말합니다.여기서 말하는 계층간의 Controller, View, Business Layer, Persistent Layer를 말하며 각 계층간 데이터 교환을 위한 객체를 DTO 또는 VO라고 부릅니다그런데 VO는 DTO와 동일한 개념이지만 read only 속성을 가짐




토비님이 우연치 않게 이 글을 보시고 페이스북에 공유하신 내용.. 

지금 보니 논란의 소지가 있어 삭제 해야하는게 맞다고 생각되어 지우려 한다.


왜 스프링에서 bean생성시에 타입추론으로 자료형을 비교하냐


A라는 라이브러리는 C라는 인터페이스를 상속받은 자료형의 클래스를 빈에서 땡겨다 쓰기로 이미 약속이 되어있다.

다형성을 이용하여 인터페이스의 자료형을 상속받은 구현 객체의 같은 동작을 보장하기 위해 사용한다.




'IT인터뷰면접질문' 카테고리의 다른 글

자바 면접 손코딩 예상 문제  (9) 2018.10.04
개발자 면접 질문(자바, 스프링)  (3) 2018.10.04
프로그래머 면접 질문2  (6) 2016.03.31
운영체제 시스템 개념  (0) 2016.03.26
데이터베이스 질문들  (0) 2016.03.26
데이터베이스 용어  (0) 2016.03.26

댓글을 달아 주세요

  1. ㅁㅁ 2019.10.11 09:13

    이걸 다 외우고 계신건가요...? 대단하네요 ....

  2. 김규형 2020.02.27 16:17

    잘읽고 갑니다.

  3. jskim4 2020.05.11 07:28

    잘읽었습니다 감사합니다