[SW 기술 면접] JAVA 편

딱지의겨울

·

2021. 8. 17. 14:15

소켓 통신과 HTTP 통신의 차이점?
http 통신은 클라이언트가 요청을 보내는 경우에만 서버가 응답하는 단방향 통신입니다. 

소캣 통신은 서버와 클라이언트가 계속 연결을 유지하는 양방향 통신으로 실시간으로 데이터를 주고받는 상황에 사용됩니다. 
가비지 컬렉터에 대해 설명해보세요. 
JVM에서 제공하는 기능으로 시스템에서 더이상 사용하지 않는 동적 할당된 메모리 블럭을 찾아 자동으로 사용 가능한 자원으로 회수하는 것으로

힙 영역을 스캔하여 참조되어 있지 않은 객체를 제거하는 방식으로 작동합니다. 
멀티 쓰레드와 멀티 프로세스의 차이점?
프로세스는 운영체제로부터 시스템 자원을 할당받는 작업의 단위로 실행되는 프로그램을 의미하고 최소 1개의 스레드(메인 스레드)를 가지고 있다.  

쓰레드는 프로세스 내에서 실행되는 하나의 작업 단위로 스텍 영역을 따로 할당 받고 프로세스 내의 힙 공간을 공유하는 특징을 가지고 있다. 단점으로는 교착 상태에 빠질 수 있다는 것. 

따라서 멀티 프로세스는 운영체제에서 할당 받은 자신의 메모리를 가지고 실행하기 때문에 서로 독립적인 반면, 멀티 스레드는 하나의 스레드가 예외를 발생 시키면 다른 스레드에 영향을 미치게 된다는 점에서 차이점이 있습니다. 
String / StringBuffer / StringBuilder
String 객체는 한번 생성되면 할당된 공간이 변하지 않지만 StringBuffer나 StringBuilder의 경우 객체의 공간이 부족해지는 경우 버퍼의 크기를 유연하게 늘려줍니다. 

스트링 버퍼는 멀티스레드 환경에서 동기화를 지원하고 스트링빌더는 단일 스레드 환경에서만 사용하도록 설계되어 있습니다. 
Restful API
URIHTTP 메소드인 POST, GET, PUT, DELETE를 이용해 객체화된 자원에 접근하여 CRUD를 적용하는 것. 
GET / POST 방식의 차이
GET 방식은 클라이언트에서 서버로 데이터를 전달할 때 쿼리 스트링 방식으로 전달하며,
주로 웹 브라우저가 웹서버에 데이터를 요청할 때 사용합니다. 쿼리 스트링이 그대로 보여지기 때문에 보안성이 떨어진다는 단점이 있습니다. 

POST 방식웹 브라우저가 웹 서버에 데이터를 전달하기 위해 사용하며 주소창에 데이터의 정보가 노출이 되지 않아 GET 방식에 비해 보안성이 높다는 장점이 있습니다. 문자열 데이터 뿐만 아니라 객체들의 값도 전송이 가능하며 웹 서버에 많은 데이터를 전달할 때 사용하는 것이 바람직 하다고 알고 있습니다.
OOP의 특징
프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고, 그 객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법. 
절차적 프로그래밍: 해야할 작업을 순서대로 코딩함 .

장점
- 코드 재사용이 용이하다 ( 남이 만든 클래스를 가져와서 이용할수 있고 ,상속을 통해 확장해서 사용할수 있다)
- 유지보수가 쉽다 (절차지향프로그래밍은 코드를 수정해야 할때 일일이 찾아 수정해야하는 반면, 객체 지향 프로그래밍에서는 수정해야할 부분이 클래스 내부에 멤버변수 혹은 메서드로 있기때문에 해당부분만 수정하면됨)
- 대형 프로젝트에 적합(클래스 단위로 모듈화 시켜서 개발할수 있으므로 대형 프로젝트처럼  여러명,여러회사에서 개발 필요시  업무분담이 쉽다)

특징 
- 다형성: 서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 것. 
- 추상화: 구체적인 사물의 공통적인 특징을 파악해서 이를 하나의 개념으로 다루는 것. 
- 캡슐화: 정보 은닉으로 외부에서 접근하지 못하도록 제한 하는 것. 
- 일반화 관계: 여러 개체들이 가진 공통적인 특성을 부각시켜 하나의 개념이나 법칙으로 성립시키는 과정. 
제네릭 타입
타입을 파라미터로 가지는 클래스와 인터페이스를 말합니다. 

컴파일 시 강한 타입 체크를 할 수 있어 사전에 에러를 방지할 수 있으며 타입 변환을 제거할 수 있다는 장점이 있습니다. 

예를 들어 List에 제네릭 타입으로 String을 지정하게 되면 요소를 찾아올 때 불필요한 타입 변환을 하지 않아도 돼서 성능이 향상됩니다. 

## 제네릭 메소드는 매개 타입과 리턴 타입으로 타입 파라미터를 갖는 메소드를 의미합니다. 

### 와일드카드 타입은 제한 없이  모든 타입이 올 수 있을 때 사용합니다. 
인터페이스와 추상클래스의 차이
추상클래스는 한 개이상의 추상 메서드를 가지는 클래스이며 상속을 받아 기능을 이용하고 확장시키기 위해 사용되며 일반 메서드와 생성자, 일반 변수를 가질 수 있습니다. extends

인터페이스는 추상메서드와 상수로만 이루어져 내부에 로직을 작성할 수 없고, 구현 객체의 같은 동작을 보장하기 위해 사용되며 다중 상속이 가능하다는 특징이 있습니다. implements
JAVA의 메모리 사용영역
메소드 영역은 메소드 코드, 필드 데이터 등이 저장되며 JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역입니다. 

힙 영역객체와 배열이 생성되는 영역으로 참조하는 변수가 없다면 JV은 가비지 컬렉터를 실행시켜 자동으로 제거합니다. 그렇기 때문에 개발자는 객체를 제거하기 위해 별도의 코드를 작성할 필요가 없습니다. 

스텍 영역은 각 스레드마다 하나씩 존재하며 스레드가 시작될 때 할당됩니다. 
JAVA의 컬렉션 프레임워크 (List, Set, Map)
List 순서를 유지하고 저장하며 중복 저장이 가능한 특징. 
객체를 인덱스로 관리하기 때문에 자동으로 인덱스가 부여되고 인덱스로 객체를 검색, 삭제할 수 있는 기능을 제공. 

Set 순서를 유지하지 않고 저장하며 중복 저장이 되지 않음. 

Map 키와 값의 쌍으로 저장하며 키는 중복으로 저장이 되지 않음. 
LinkedList와 ArrayList 차이점
ArrayList 일반 배열처럼 인덱스로 객체를 관리한다는 점은 비슷하지만 초기 저장 용량을 초과할 때 자동적으로 저장 용량이 늘어난다는 특징이 있습니다. 탐색은 빠르게 할 수 있지만, 중간에 추가/삭제가 빈번하다면 비효율적인 특징이 있습니다. 

Linked list는 인접 참조로 링크되어 있는 양방향 연결 리스트입니다. 빈번한 객체 삭제와 삽입이 일어나는 곳에서 ArrayList보다 더 좋은 성능을 발휘합니다. 
Thread 제어
쓰레드 객체를 생성할 때 생성자를 통해 Runnable 구현하여 스레드가 실행할 코드를 작성합니다. 

start() 메소드를 호출하면 작업 스레드가 실행이 됨. 
setPriority() 를 통해 우선순위를 정할 수 있습니다. 
sleep() 을 통해 주어진 시간동안 일시 정지
yeild() 를 통해 다른 스레드에게 실행 양보. 

TCP 와 UDP의 차이
TCP는 연결형 서비스로 3-way-hanshake 방식으로 수신 여부를 확인하여 신뢰성이 높은 통신 방식. 

UDP는 비연결형 서비스로 데이터그램 방식으로 패킷을 교환하며 수신 여부를 확인하지 않아 신뢰성은 낮지만 속도가 빠르기 때문에 스트리밍과 같은 서비스에 사용이 됩니다. 
오버로딩과 오버라이딩의 차이
오버로딩같은 이름의 메소드를 매개 변수의 타입과 개수를 다르게 하여 여러개 정의하는 것이고, 

오버라이딩상위 클래스의 메소드를 하위 클래스에서 재정의하는 것입니다. 
try/catch 와 throws 의 차이
throws 키워드를 사용하는 메서드를 호출한 상위 메서드에서 이러한 에러 처리에 대한 책임을 맡게 되는 것입니다. 

try에 예외가 발생할만한 코드 블록을 지정하고 catch에는 예외처리를 할 블록을 지정합니다. 
Primitive Type / Reference Type
Primitive Type 변수에 값 자체를 저장하며 정수형, 실수형 등이 있습니다. 
Wrapper Class를 통해 객체로 변형할 수 있는 특징이 있습니다. 

Reference Type메모리 상에 객체가 있는 위치를 저장하고 Class, Interface, Array 등이 있습니다. 
MVC 패턴
Model, View, Controller의 약자. 
3가지 형태로 역할을 나누어 개발하는 방법으로 로직과 인터페이스 요소를 분리시켜 서로 영향없이 개발하기 수월하다는 장점이 있습니다. 

Model: 어플리케이션이 무엇을 할 것인지를 정의하고 내부 로직을 처리하기 위한 역할

Controller: 모델이 어떻게 처리할 지를 알려주고, 화면에서 사용자의 요청을 받아서 처리하는 부분으로 모델과 뷰가 각각 무엇을 해야할 지 알고 있고 통제하는 역할. 

View: 최종적으로 사용자에게 보여지는 화면
싱글톤 패턴
클래스 인스턴스가 오직 하나만 생성되어야 하는 경우 사용되는 패턴입니다. 

하나의 인스턴스를 메모리에 등록해서 여러 스레드가 동시에 해당 인스턴스를 공유하여 사용할 수 있게끔 할 수 있고, 동시성 문제를 고려해서 설계해야 하는 것으로 알고 있습니다. 
프레임워크와 라이브러리
프레임워크는 소프트웨어의 특정 문제를 해결하기 위한 상호 협력하는 인터페이스의 집합으로 
전체적인 제어의 흐름을 스스로 쥐고 있으며 개발자가 그 안에서 필요한 코드를 짜는 방법입니다. 

라이브러리단순 활용 가능한 도구의 집합으로 개발자가 전체적인 흐름을 만들며 라이브러리를 가져와서 사용하는 것입니다. 
지역변수 / 인스턴스 변수 / 클래스 변수
지역 변수는 메서드 내에서 선언되고 메서드 내에서만 사용할 수 있는 변수로 메서드가 끝나면 소멸됩니다. 

인스턴스 변수는 인스턴스가 생성될 때 생성되며 각각의 인스턴스마다 고유의 값을 가져야 할 때 인스턴스 변수를 선언합니다. 

클래스 변수는 한 클래스의 모든 인스턴스가 공통된 값을 공유하는 변수로 클래스가 로딩될 때 생성되어 종료될 때까지 유지됩니다. 
static 변수 (클래스 변수) 
스텍 메모리 영역에 할당된 변수로 클래스가 로딩될 때 생성되고 프로그램이 종료될 때 헤제됩니다. 
final
초기값이 저장되면 최종적인 값이 되어 프로그램 실행 도중에 수정할 수 없습니다. 변수와 함수 클레스에 명시적으로 제한시킬 때 사용합니다. 
정규화 
데이터 중복을 최소화하기 위해 테이블을 분리하는 과정으로 효과적인 검색 알고리즘을 생성할 수 있고, 삽입/삭제/갱신 이상의 발생을 방지합니다. 
사용자에게 접근이 허용된 자료만을 제한적으로 보여주기 위해 만든 가상테이블
무결성
데이터의 정확성, 일관성, 유효성을 유지하는 것입니다.
트랜잭션
하나의 논리적 기능을 수행하기 위한 작업의 단위로 DB의 일관된 상태를 또 다른 일관된 상태로 변환시키는 기능을 수행합니다. 
트랜잭션을 병행으로 처리하려고 할 때 발생할 수 있는 문제는?
갱신 내용 손실, 현황 파악 오류, 모순성, 연쇄 복귀

이를 해결하기 위해 로킹 제어 기법을 이용하는데 DB의 일정 부분을 락시키고 트랜잭션이 완료될 때 해당 부분을 언락시키는 방법입니다.

로킹 제어가 일으킬 수 있는 문제점은 데드락. 

COMMIT: 해당 트랜잭션으로 반영된 디비의 변경 사항을 저장하는 것이고 ROLLBACK은 트랜잭션으로 반영된 DB의 변경 사항을 취소하는 것.  
NoSQL
RDMS 2차원의 행과 열로 데이터의 관계를 관리하는 데이터 베이스입니다. 
NoSQL은 스키마 없이 키-벨류 형테로 데이터를 관리합니다. 

가변적인 데이터구조로 데이터를 저장할 수 있어 유연성이 높지만 다양하고 복잡한 쿼리가 불가능하다는 단점이 있습니다. 

비정형 데이터를 저장해야 할 때 가장 적합하다고 알 고 있습니다. 
Firebase 사용이유
서버 개발 없이 안드로이드 소스코드 내에서 바로 데이터베이스에 저장할 수 있기 때문에 개발이 용이하다고 생각해서 선택했습니다. 
Index
추가적인 쓰기 작업과 저장공간을 활용하여 데이터베이스의 검색 속도를 높이기 위해 사용하는 자료 구조.