Life is Good

수콩이의 시선

TIL/개발상식

[자바(JAVA)] 면접 예상 질문과 답변

Soocong 2022. 4. 4. 11:26

Q # 1) 객체지향이란?

답변: 객체지향이란 실세계의 사물을 추상화하여 멤버 변수와 메소드를 정의하는데서 출발한다. 캡슐화를 통해 이와 같은 멤버변수와 메소드의 이용가능 범위를 적정하게 제한할 수 있고, 상속을 이용하여 부모 클래스의 기능을 자식클래스에서 물려받거나 재정의를 통해 다른 기능을 구현하는 다형성까지 포함된다.

 

Q # 1-1) 객체지향 프로그래밍(OOP = Object-Oriented Programming)란 무엇인가?

답변: 객체지향 프로그램이란 데이터를 객체로 취급하여 프로그램에 반영한 것이다. 순차적 실행이 아닌, 객체와 객체의 상호작용을 통해 동작한다.

 

Q # 1-2) 객체지향의 특징은? 

답변: 다형성, 상속, 캡슐화, 추상화 의 특징을 가지고 있다. ( 상추캡(이)다 )

 

다형성 은 하나의 메소드나 클래스가 다양한 방법으로 동작하는 것을 말한다. 상속을 통해 기능을 확장하거나 변경하는 것을 가능하게 해 주고, 같은 클래스 내의 코드 길이를 줄여준다. 오버라이딩이나 오버로딩을 통해서 한 요소에 여러 개념을 넣어 놓은 것이다.
상속 는 새로운 클래스가 기존의 클래스의 자료와 연산을 이용하게 해주는 것입니다. 공통적으로 필요한 성격을 가장 기본적인 클래스로 정의해두고, 상속받아 사용. 중복을 최소화한다.
캡슐화 는 객체가 맡은 역할을 수행하기 위한 하나의 목적을 위해 데이터와 기능들을 묶는 것을 말합니다.

public, protected, private라는 접근 지정자를 통해 클래스에 담는 내용 중 중요한 데이터나 기능을 외부에서 접근하지 못하도록한다. 객체 외부에서는 내부 정보를 직접 접근하거나 조작할 수 없다. getter와 setter를 통해서만 접근 가능하다.

추상화 는 객체들의 공통적인 특징을 뽑아내는 것이다. 즉, 객체들의 공통적인 데이터와 기능을 도출하는 것이다. 예를 들면, Class.

 

  • 객체지향 프로그래밍은 코드 재사용성이 높다.
  • 코드의 변경과 수정이 용이하다.
  • 직관적으로 코드를 분석할 수 있다.(블럭의 내부 구조가 어떤지 신경 쓸 필요가 없다 -- 캡슐화, 추상화)
  • 유지보수가 쉬우므로 개발 속도를 향상한다.
  • 상속을 통해 장점을 극대화한다.

Q # 1-3) 객체 지향과 절차지향 프로그래밍과의 차이는?

답변: 

절차지향, 구조적 프로그래밍(C)

  • 순차적 프로그래밍이다.
  • 작업 순서대로 코딩한다.
  • 함수 단위로 구성되며 기능별로 묶어놓은 특징이 있다.

객체지향 프로그래밍(Java, C++, C#)

  • 주 구성요소는 클래스와 객체이다.
  • 클래스를 활용해 각각의 기능별로 구성한다.
  • 객체별로 개발 가능하다.
  • 코드 재사용 가능하다.
  • 오류 발생 가능성 적고 안정성 높다.

Q # 2) 자바 언어에 대해 설명해보세요.

답변: JAVA는 네트워크상에서 쓸 수 있도록 미국의 선 마이크로 시스템즈가 개발한 객체 지향 프로그래밍 언어이다.

 

Q # 2-1) 자바 언어의 특징은?

답변: JAVA는 자바가상머신(JVM)만 설치하면 컴퓨터의 운영체제에 상관없이 작동한다. 또한, 기본 자료형을 제외한 모든 요소들이 객체로 표현되고 객체 지향 개념의 특징인 캡슐화, 상속, 다형성이 잘 적용된 언어이다. 그 외에도 가비지 컬렉터를 통해 자동적인 메모리 관리를 하고 멀티쓰레드를 지원한다.

 

  • 운영체제 없이 독립적 : JVM(Java Virtual Machine)
  • 한 개 이상의 클래스로 구성
  • 클래스는 한 개 이상의 필드나 메소드로 구성
  • 맨 먼저 public static void main(String[] args) 를 찾아 실행 - 기본 자료형을 제외한 모든 요소가 객체로 표현
  • 캡슐화, 상속, 다형성
  • Garbage Collector를 통한 메모리 관리기능
  • 멀티스레드(Multi-thread = 다중동기화) 지원

Q # 2-2) 자바에서 객체란 무엇인가?

답변: 객체는 데이터(변수)와 그 데이터에 관련된 동작(함수), 절차, 방법, 기능을 모두 포함 한 것이다. 같은 성질, 같은 구조와 형태를 가지는 객체는 등급으로 정의하고 등급에 속하는 객체는 그 등급의 인스턴스이다.

예를 들면 기차역에서 승차권을 발매하는 경우, 실체인 ‘손님’과 동작인 ‘승차권 주문’은 하나의 객 체이며, 실체인 ‘역무원’과 동작인 ‘승차권 발매’도 하나의 객체이다.

 

Q # 3) 자바 컴파일 과정을 설명하세요.

답변: 컴파일러가 소스코드를 자바 바이트코드로(.class) 변환한다, JVM(자바가상머신)이 그 바이트코드를 기계어로 변환하여 인터프리터 방식으로 어플리케이션을 실행한다.

  1. 전처리 : #define, #include 지시자 해석
  2. 컴파일 : 고급 언어 소스 프로그램 입력받아 어셈블리 파일을 만듦
  3. 어셈블 : 어셈블리 파일을 오브젝트 파일로 만듦
  4. 링크 : 오브젝트 파일을 엮어 실행파일을 만들고 라이브러리 함수 연결
  5. 실행

 

Q # 3-1) 스크립트 언어와 컴파일 언어의 차이는?

답변: 스크립트 언어와 컴파일 언어의 차이점은 컴파일러의 존재 여부이다.
스크립트 언어는 실행될 때 바로 해석, 코드 수정 후 실행할 때마다 결과 바뀐다는 특징이 있다. 스크립트 언어에는 JavaScript, Python, Ruby가 있다.  컴파일 언어는 한번 컴파일한 후, 코드 수정 후 다시 컴파일하기 전까지 결과 동일한다. 컴파일 언어에는 C, C++, C#, Java 등이 있다. 

 

Q # 4) JDBC (Java Database Connectivity) 란 무엇인가?

답변: JAVA를 통해 데이터베이스에 접근할 수 있는 프로그래밍 / DB에 접근해(작업) 데이터를 조회/삽입/수정/삭제 가능하다.
이때, 연결해주는 응용프로그램 인터페이스인 JAVA API DBMS 종류에 따라 그에 맞는 JDBC를 설치해야 한다.

 

Q # 5) 다형성과 상속은 무엇인가?

답변: 다형성(Polymorphism)과 상속(Inheritance)은 객체 지향 개발의 두 가지 핵심 개념이다.

다형성 이란 하나의 지시에 대해 여러 객체가 각자 다른 행위를 수행하는 것을 말한다. 다형성은 행동의 특정 타입에 대한 정의를 만들 수 있게 하고, 행동을 구현하는 수 많은 다른 클래스들을 갖게 한다.

 

상속 은 기존 클래스의 변수와 메소드를 모두 취하여 추가적인 기능도 가지는 클래스를 새로 만드는 것이다. 부모 클래스에서 클래스의 행동과 정의를 가져다 사용할 수 있게 해준다. 새로운 클래스를 정의할 때 이전에 정의된 클래스에서 정의와 상태를 상속할 수 있고 새로운 행동을 추가하거나 새로운 타입에 대한 행동을 오버라이드할 수 있다.

- 변수와 메소드를 그대로 쓰므로 코드중복을 줄인다.
- 객체를 사용하는 클래스 외부적인 관점으로 봤을 때 묶어서 처리(upcasting)할 수 있으므로 효율적인 코드가 된다.

 

Q # 6) 인터페이스(Interface) 란?

답변: 인터페이스 는 추상 클래스보다 추상화 정도가 높은 상태를 정의할 때 사용하며 기능의 재정의에 큰의미를 두고 있다.  껍데기만 있는 클래스로, 인터페이스를 implements 하는 클래스에게 틀을 제공한다.

  • 일종의 추상 클래스로, 오직 상수와 추상 메소드만을 선언할 수 있다.
  • Implements 키워드를 사용해서 상속을 진행하며 자식 클래스에서 반드시 메소드를 재정의해야한다.
  • 자신을 implement 하는 클래스에게 메소드 구현을 강제 = 상속의 관계가 없는 클래스 간에 서로 같은 로직을 구현하게 한다.
  • 예) List 인터페이스를 implement하는 클래스들인 ArrayList, LinkedList는 모두 add(), clear(), indexOf(), get() 등의 메소드를 가진다.
  • 다중 상속 가능하다.

Q # 7) 추상클래스(Abstract)란?

답변: 추상클래스 는 abstract을 이용한 미완성 메소드로 형태만 정의해두는 클래스를 말합니다.  추상 메소드를 하나 이상 가진 클래스로, 하위 클래스를 제어하기 위해 사용한다. 추상클래스는 상속을 진행하고 상속받은 자식클래스에서 반드시 재정의를 해야한다. 추상클래스는 상속을 통해 기능을 확장하는 데에 의미가 있다. 

 

 

Q # 7-1) 추상클래스와 인터페이스의 공통점과 차이점은?

공통점

  • 선언만 있고 구현 내용이 없다.
  • New 연산자로 새로운 인스턴스 생성 불가능하다.
  • 프로토타입만 있는 메소드를 가진다.
  • 사용하기 위해서는 하위클래스(자식클래스)에서 확장/구현해야 한다.

차이점

  • 인터페이스는 메소드 선언만 가능하다. 클래스가 아니기 때문에 다중상속이 가능하다.
  • 추상클래스는 일반 메소드 선언을 사용한다. 다중상속이 불가능하다.

Q # 8) Static 이란?

답변: 클래스가 로딩될 때, 메모리 공간을 할당하는데 처음 설정된 메모리 공간이 변하지 않음을 의미 / 객체를 많이 만들어도 해당 변수는 하나만 존재(객체와 무관한 키워드) 

 

Q # 9) Generic이란?

답변: 클래스에서 사용할 타입을 클래스 외부에서 설정하는 것이다. 만들어져 있는 클래스를 원하는 형태로 사용할 수 있다.

  • < > 안에 들어갈 수 있는 것은 참조자료형(클래스, 인터페이스, 배열)이다.
  • 기본자료형을 사용하기 위해선 wrapper 클래스 이용한다.

Q # 10) 자바 데이터 타입에 대해 설명하세요.

답변: 
Primitive type 기본형 : 변수에 값 자체를 저장(정수형, 실수형, 문자형, 논리형 등 8가지) 한다.  stack 메모리 영역에 실제 값을 저장한다.

Reference type 참조형 : 기본형 외의 모든 타입(String, 클래스, 인터페이스, 배열 등)이다. new로 정의하고,  실제 값은 heap에 저장하고 stack에는 메모리 주소만 저장한다.

 

Q # 11) Thread란?

답변: 프로세스(운영체제에서 실행 중인 하나의 프로그램으로 하나 이상의 쓰레드 포함) 내에서 동시에 실행되는 독립적인 실행 단위이다. 자원을 많이 사용하지 않고 구현이 쉬우며 범용성이 높다.


- 장점 :

  • 빠른 프로세스 생성
  • 적은 메모리 사용
  • 쉬운 정보 공유

- 단점 :

  • 자원을 공유하기때문에 교착상태(Deadlock = 다중 프로그래밍 체제에서 하나 또는 그 이상의 프로세스가 수행할 수 없는 어떤 특정 시간 을 기다리고 있는 상태) 에 빠질 수 있다.

Q # 12) Thread와 Process의 차이?

 답변: 여러 개의 스레드가 하나의 프로세스이다.

스레드 는 각자의 스택 메모리 영역을 가지고 있다. 동일한 프로세스 내의 다른 스레드들과 전역 메모리를 공유한다. = CPU로부터 새로운 자원을 할당받지 않아 도 되기 때문에 프로세스보다 실행 속도가 빠르다.

프로세스 는 실행 중인 프로그램을 말한다. CPU가 메모리를 잘 분배 해줘야하며 운영체제의 성능에 따라 성능이 결정된다.

 

Q # 13) 접근 제한자 (접근지정자)의 종류에 대해 설명하세요.

답변:

Public : 같은 프로젝트 내에 어디서든 사용 가능하다.

Protected : 같은 패키지 내, 다른 패키지에서 상속받아 자손 클래스에서 접근 가능하다.

Default : 같은 패키지 내에서만 접근 가능

Private : 같은 클래스 내에서만 접근 가능 

 

Public > protected > default > private

 

Q # 14) Call by value(값에 의한 호출), Call by reference(레퍼런스에 의한 호출) 에 대해 설명하세요.

답변: Call by value 는 값을 복사해서 새로운 함수로 넘기는 호출 방식이다. 원본값 변경하지 않는다.

Call by reference 는 주솟값을 인자로 전달하는 호출 방식이다. 원본값 변경이 가능하다. 

자바언어는 Call by value 이다.

[참고] https://brunch.co.kr/@kd4/2

 

Q # 15) String , StringBuffer, StringBuilder 란?

답변: String

String 는 값 변경 불가능하다. 문자를 수정하려면 지우고 다시 새로 생성해야 한다.


수십번 String이 더해지는 경우, 각 String의 주솟값이 stack에 쌓이고 클래스들은 Garbage Collector가 호출되기 전까지 heap에 지속적으로 쌓이게 된다. 메모리 관리적인 측면에서는 치명적이라고 볼 수 있다.
String에서 저장되는 문자열은 알고보면 char의 배열형태로 저장되며 이 값들은 외부에서 접 근할 수 없도록 private으로 보호된다. 또한 final형이기 때문에 초기값으로 주어진 String의 값은 불변으로 바뀔 수가 없게 되는 것이다.

 

StringBuffer 는 값변경이 가능하며, 한번 만들고 필요할 때 크기를 변경하여 문자 변경한다. 멀티쓰레드 환경에서 동기화를 보장한다.

스트링 버퍼는 char타입의 배열로 되어 있어서 한글자 한글자를 append할 수 있다
name = name + “홍”; 구문이 실행될 때 실제로는 스트링 버퍼를 새로 생성해서 name이 가리키는 “길동”을 만들어주고 스트링 버퍼의 append 함수를 이용하여 “홍” 를 붙여준다. 그렇게 완성된 스트링 버퍼값을 메모리에 올리고 name은 다시 이 값을 참조하게 된다. 그럼 그와중에 생겨난 메모리 안의 “길동” 이라는 값과 “홍”라는 값은 가비지 컬렉터가 가지고 있 다가 필요없으니 버린다. 그 짧은 순간에 이런 일처리가 진행이 되어서 스트링 버퍼를 사용 하는 것이 스트링 객체를 사용하는 것보다 빠르다.


StringBuilder 는 멀티스레드 상태에서 동기화 지원하지 않는다. 멀티스레드 환경에 부적합하나 싱글스레드에서 stringBuffer보다 좋다.
[참고] https://jeong-pro.tistory.com/85 

 

Q # 16) 자바 메모리 영역에 대해 설명하세요.

답변: 
- 메소드 영역 : 바이트코드, static 변수, 전역변수, 코드에서 사용되는 Class 정보 등이 올 

라감 / 코드에서 사용되는 class들을 로더로 읽어 클래스별로 런타임 필드데이터, 메소드 데 이터 등을 분류해 저장
- 스택(Stack) : 매개변수, 지역변수, 함수() 등이 할당되는 LIFO(Last In First Out) 방식의 메모리 / 사용이 끝나면 바로 소멸, 컴파일 시 메모리를 할당 

- 힙(Heap) : new 연산자를 통한 동적 할당된 객체들이 저장됨, Garbage 컬렉션에 의해 메모리가 관리 / 호출이 끝나도 사라지지 않으며 프로그램 실행 시 동적으로 할당 

 

Q # 17) DAO (Data Access Object) 란?
답변: 데이터베이스의 데이터에 접근을 위한 객체(DB를 사용해 데이터를 조회하거나 조작하는 기능을 전담)이다. 데이터베이스에 접근을 하기위한 로직과 비즈니스 로직을 분리하기 위해서 사용한다.

 

Q # 18) DTO (Data Transfer Object = VO(Value Object)) 란?
답변: 각 계층간 데이터 교환을 위한 JavaBean(여기서 계층이란 Controller, View, Business Layer, Persistent Layer) 이다. VO는 동일한 개념이지만 read only 속성을 가진다. 

 

Q # 19) 변수명 표기하는 방법?
- 헝가리언 표기법 : 자료형을 식별자에 같이 포함 ex) inum; int int_num; 인터페이스명. 

- 파스칼 표기법 : 식별자가 한 단어나 혹은 여러 단어로 조합(언더바 X), 각 단어의 첫 문 자만 대문자로 예) KorScore
- 캐멀 표기법 : 모든 단어를 공백없이 조합(언더바 X), 첫 단어의 첫 문자는 소문자로 예) korScore 

- 스네이크 표기법 : 예) eng_score 배열, 연결리스트의 차이점 

 

Q # 20) 배열과 연결리스트의 차이점에 대해 설명하라.

답변:

배열

  • 인덱스를 가진다.
  • 데이터를 한번에 접근하여 접근 속도가 빠르다.
  • 크기 변경 불가하다.
  • 데이터를 삽입/삭제하면 다음 위치부터 모든 데이터의 위치를 변경해야 한다.

연결리스트

  • 인덱스 대신 현재 위치의 이전/ 다음 위치를 기억한다.
  • 한 번에 접근 불가, 연결된 링크를 따라가야만 접근 가능하여 배열보다 속도가 떨어진다.
  • 크기가 가변적이다.
  • 데이터 삽입/삭제는 논리적 주소만 바꿔준다.

Q # 20-1) 어떨 때 배열을 사용하고, 인접리스트를 사용해야할까?

답변: 배열은 데이터 양이 많지만 삽입/삭제 없으며, 데이터 접근이 빈번할 때 사용한다. 연결리스트는 데이터 양이 적고, 삽입/삭제가 빈번할 때 사용한다. 

 

Q # 21) ArrayList<> 란?

답변: 배열의 확장판이다. 배열의 크기를 임의로 바꿀 수 있다. list에 들어갈 데이터 타입 설정할 수있다. (add, remove, isEmpty, size, get, indexOf 등의 메소드가 있다.) 

 

Q # 22) Hash 란?

답변: 내부적으로 배열을 사용(HashTable)하여 데이터를 저장하고, 검색 속도가 빠르다. 데이터 삽입과 삭제 시 기존 데이터를 밀어내거나 채우지 않고, 데이터와 연관된 고유한 숫자를 생성해 이를 인덱스로 사용한다.

 

Q # 23) equals와 HashCode란?

답변: equals 는 동일한 내용을 가진 객체인지를 비교한다. hashcode 는 동일한 객체인지 구별하기 위해 고유한 정숫값으로 출력한다.

 

Q # 24) 스택과 큐의 차이는?

답변: Stack 은 (LIFO = Last in First out) 함수를 호출 할 때, 현재 함수에서 사용되는 값을 스택에 넣고, 작업이 끝나면 함수를 리턴하고 스택에 넣었던 값을 꺼내는 방식으로 동작한다.  Queue 는 (FIFO = First in First out) 이고, 프로세스 처리, CPU 관리, 프린터 큐 등에 사용한다.

 

Q # 24-1) 스택과 힙의 차이는?

답변: 메모리는 스택과 힙의 두 가지 주요 영역으로 구분된다.

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

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

 

[참고] 메서드 영역은 static 변수, 전역변수, 코드에서 사용되는 Class 정보 등이 올라간다. 코드에서 사용되는 class들을 로더로 읽어 클래스별로 런타임 필드데이터, 메서드 데이터 등을 분류해 저장한다. 스택은 기본값, 객체의 참조, 메서드가 저장되는 위치다. 따라서 스택에 있는 변수의 생애주기는 코드의 스코프에 영향을 받는다. 스코프는 일반적으로 메서드 호출이나 for문, while문 같은 코드에서 괄호로 구분해서 정의한다. 일단 해당 스코프의 실행이 종료되면 스코프 안에 선언된 변수들은 스택에서 제거된다. 메서드를 호출했을 때 선언된 변수들은 스택의 상단에 위치한다. 스택에서 다른 메서드를 호출하면 스택은 새로운 메서드의 변수를 스택의 상단에 둔다.

 

Q # 25) Overloading VS Overriding

답변: 

Overloading (오버로딩) 은 같은 이름의 메소드를 여러 개 정의하는 것이다. 매개변수의 타 입이 다르거나 개수가 달라야 한다. Return type과 접근 지정자는 영향을 주지 않는다.
Overriding (오버라이딩) 은 상속에서 나온 개념이다. 상위 클래스(부모)의 메소드를 하위 클래스(자식 클래스)에서 재정의하는 것이다.

 

Q # 26) 가비지 컬렉터란?

답변: 가비지 컬렉터는 힙 내의 객체 중 가비지를 찾아내어 처리해서 힙의 메모리를 회수하는 작업을 하는 것이다.

JVM이 메모리를 할당받고 프로그램들을 실행하다가 메모리가 부족해지면 OS에게 추가로 메모리를 요청하는데, 이때 가비지 컬렉터가 실행된다.

 

Q # 26-1) 가비지 컬렉션이란?

답변: 정리되지 않은 메모리, 유효하지 않은 메모리 주소인 가비지를 정리해주는 프로그램이다. 

시스템에서 더 이상 사용하지 않는 동적 할당된 메모리 블록을 찾아 자동으로 다시 사용 가능한 자원으로 회수 하는 것이다.

 

[참고] 가비지 컬렉션 은 기존에 할당된 메모리를 재사용하는 메커니즘으로 나중에 메모리를 할당할 때 재사용할 수 있다. 가비지 컬렉션을 사용하면 메모리를 직접 해제할 필요가 없다. 자바에서는 new키워드로 새로운 객체를 생성한다면 JVM은 해당 객체에 저장된 데이터에 적절한 양의 메모리를 할당한다. 객체가 더 이상 필요하지 않으면 JVM은 메모리 공간을 재배치해야 한다. 그래서 생성된 다른 객체가 해당 메모리 공간을 사용하게 된다. c나 c++같은 프로그래밍 언어에서는 malloc와 free함수를 호출해서 이런 메모리 할당을 수동으로 직접 관리해야 했다. 자바와 c#같은 대부분의 모던 프로그래밍 언어에는 효율을 높이기 위해 메모리를 자동으로 관리하는 시스템이 있다. 덕분에 프로그래머는 잠재적으로 발생할 수 있는 모든 실수를 줄일 수 있다.

 

Q # 26-2) 가비지란?

답변: 정리되지 않은 메모리, 유효하지 않은 메모리 주소로 참조하던 관계가 끊어지면서 어떠한 것도 참조하지 않는 값이 되버리는 것을 말한다.

 

Q # 26-3) 가비지 컬렉션이 일어나는 장소는?

답변: 실행 중인 자바 가상 머신(JVM) 내부에서 일어난다. JVM은 OS아래에서 발생한다.프로그램 실행시 OS에서 할당받은 메모리를 JVM이 사용한다. 

 

Q # 26-4) 가비지 컬렉터가 가비지 객체를 어떻게 판단하나요? (= 사용하지 않거나 사용할 수 없는 메모리를 어떻게 판단할까요?)

답변: 가비지 컬렉터는 가비지 객체를 판단하기 위해 reachability 개념을 사용한다. 어떤 객체에 유효한 참조가 있으면 reachable, 없으면 unreachable로 구별하고 unreachable 객체를 가비지로 간주한다.

 

Q # 27) 프레임워크에 대해 설명해주세요.

답변: 소프트웨어를 만들 때 뼈대가 되는 부분을 미리 구현한 클래스, 인터페이스, 메서드 등의 모음이다.

 

Q # 27-1) 프레임워크를 사용했을 때의 장점과 단점은?

답변: 장점은 미리 구현해 둔 코드를 쓰기 때문에 빨리 만들 수 있고, 품질이 보장되어 있고, 사용하기 쉽습니다. 단점은익숙해지는 데에 시간이 걸릴 수 있고, 유연성이 부족합니다. 또한, 언어가 아닌 프레임워크를 배우게 된다는 부작용이 있습니다.

 

Q # 27-2) Spring 프레임워크를 사용하는 이유?

답변: 

EJB(Enterprise JavaBeans = 기업환경의 시스템을 구현하기 위한 서버측 클라이언트 모델) 에 비해 가볍기 때문에 엔터프라이즈급의 시스템을 더 빠른 시간에 작성 가능하다.
기존의 프레임워크들은 웹, 또는 하드웨어, 데이터베이스등 전문적인 영역만 지원하는 경우가 많은데, 스프링은 어느 한 분야에 집중하기 보다, 전체를 설계하는 용도로 사용한다. 스프링은 전체 구조에 집중했기에 특정영역의 프레임워크와 공존하는 방식으로 사용 가능하다.

[참고] Spring 프레임워크의 특징

  • POJO(Plain Old Java Object)의 구성만으로 가능하도록 제작(따로 프레임워크의 사용을 위해 공부할 필요가 없다.)
  • 의존성 주입(DI)를 통한 객체간의 관계구성
  • AOP(Aspect oriented programming)을 지원한다. 공통된 부분등, 특정 부분들(핵심 관심사) 로 나누어 관리함으로써,프로그램을 모듈화 하여 개발 및 유지보수가 편하다.
  • 트랜잭션을 지원한다. 스프링은 이를 어노테이션이나 xml로 설정 가능하다.

Q # 28) Class 와 Instance 의 차이점은 무엇인가?

답변: Class(클래스) 는 어떤 특정 종류의 모든 객체들에 대해 일반적으로 적용할 수 있는 변수와 메소드를 정의 하고 있는 소프트웨어적인 설계도라 할 수 있다. 실세계에 존재하는 객체들이 가질 수 있는 상태와 행동 들에 대해 소프트웨어적으로 추상화(abstraction) 해 놓은 것이다. Instance(인스턴스) 는 클래스에 대해 선언, 생성되는 변수이며 메모리 공간을 차지하게 된다. 인스턴스의 메소드를 이용하여 변수들의 값을 설정 및 변경할 수 있다.

 

Object(객체)는 소프트웨어 세계에 구현할 대상이고, 이를 구현하기 위한 설계도가 Class(클래스)이며 이 설계도에 따라 소프트웨어 세계에 구현된 실체가 Instance(인스턴스)이다.

 

Q # 29) Lambda Expressions에 대해 설명하시오.

답변: Lambda Expressions(람다식) 은 식별자 없이 실행 가능한 함수 표현식이다. 자바 8의 가장 특징적인 기능으로 기존의 불필요한 코드를 줄이고 가독성을 향상시키는 것에 목적을 두고 있다. 대표적으로 반복문, 비 교문이 있다. 기본적으로 람다식을 위한 인터페이스에서 추상 메소드는 단 하나여야 하며, 이 인터페이스는 람다식을 위한 것이다라는 표현을 위해 @FuctionalInterface를 사용한다. Stream API의 존재를 알아두면 좋다.

 

Q # 30) Vector 와 ArrayList 에 대해 설명하시오.

답변: 

Vector

  • 필요에 따라 크기를 동적으로 조절할 수 있는 동적배열 구현한다.
  • 배열과 마찬가지로 정수 인덱스를 이용해 배열에 액세스 가능하다.
  • 동기화 되어 있으면 한 번에 하나의 스레드만 벡터의 메소드를 호출 가능하다.

ArrayList

  • Collections 프레임워크의 일부, java.util 패키지 내에 존재한다.
  • Object배열을 이용해서 데이터를 순차적으로 저장한다.
  • 배열에 더 이상 저장할 공간이 없으면 보다 큰 새로운 배열을 생성해서 기존의 배열에 저장된 내용을 새로운 배열로 복사한 다음에 저장한다.
  • 선언된 배열의 타입이 모든 객체의 최고 조상인 Object이기 때문에 모든 종류의 객체를 담을 수 있다.

Q # 30-1) Vector 와 ArrayList 의 공통점과 차이점은?

답변: 공통점은 크기가 동적인 배열을 사용할 때 주로 사용한다. 차이점은 Vector는 동기식(한 스레드가 벡터 작업 중이면 다른 스레드가 벡터를 보유할 수 없음) 방식이고,  ArrayList 는 비동기식(여러 스레드가 ArrayList에서 동시에 작업할 수 있음, Vector보다 빠름) 이다.

'TIL > 개발상식' 카테고리의 다른 글

[데이터베이스(DB)] 면접 예상 질문과 답변  (0) 2022.04.04
Agile이 뭔데!  (0) 2022.04.04