JAVA 관련 백엔드 면접 질문-답변 정리(2)
절차지향 프로그래밍, 객체지향 프로그래밍, 함수형 프로그래밍
절차지향 프로그래밍이란
- 실행하고자 하는 절차를 정하고, 이 절차대로 프로그래밍하는 방법을 의미합니다.
객체지향 프로그래밍이란
- 연관되어 있는 변수와 메서드를 하나의 그룹으로 묶어 클래스(개념)를 구현하고 이들 사이의 상호 작용을 프로그램으로 나타낸것을 의미합니다.
함수형 프로그래밍이란
- 주어진 문제를 작은 문제로 나눈 후, 이 작은 문제를 순수 함수로 만들어 순수함수를 조합하여 프로그램을 만드는 선언형 프로그래밍 기법입니다.
절차지향 프로그래밍이란
절차지향 프로그래밍 장단점
절차지향언어는 개체를 순차적으로 처리하여 프로그램 전체가 유기적으로 연결되어야 합니다.
절차지향언어의 구조는 컴퓨터의 처리구조와 유사합니다. 따라서 실행 속도가 빠르다는 것이 장점입니다.
다만, 모든 프로그래밍이란 순차적으로 실행되어야 하며, 한군데에서 오류가 났을 시, 찾기도 어렵고 서로 유기적으로 연결되어있기 때문에, 부분 오류가 전체 수정으로 이어질 수 도 있습니다.
또한, 코드의 순서가 있어야하기 때문에, 융통성이 부족하여 생산성이 떨어집니다.
객체지향 프로그래밍이란
프로그래밍에 필요한 데이터의 상태와 행위를 객체로 만들어, 객체간의 상호작용을 통해서 비지니스 로직을 구성하는 것이 OOP(객체지향적 프로그래밍 기법)입니다.
객체지향 프로그래밍 장단점
- OOP의 장점으로는
- 객체를 이용하여(클래스) 코드 재사용이 용이하고, 상속을 통한 확장이 가능합니다.
- 클래스단위로 모듈화, 작게작게 나눌 수 있기 때문에 유지보수에도 좋고, 분업에도 좋다
- OOP의 단점은
- 객체가 많아질수록 용량이 커질 수 있고
- 객체를 올바르계 설계하는데 많은 노력과 시간이 필요합니다.
객체지향 프로그래밍 특징
OOP의 특징으로는, 상속, 추상화, 캡슐화, 다형성 등 이 있습니다.
- 상속 : 자식클래스가 부모클래스의 기능과 상태를 물려받아, 그대로 사용하거나 필요한 부분만 수정할 수 있도록하는 것을 말합니다.
- 추상화 : 불필요한 부분을 지우고 필요한 핵심만을 정의해 두는 것입니다. 사물을 추상환 후, 필요한 객체에서 상속받아 필요에 맞게 기능을 재정의해 사용할 수 있도록합니다.
- 캡슐화 : 비슷한 속성과 메소드들을 하나의 클래스로 모은것 입니다. 외부 접근으로부터 데이터를 지킵니다.
- 다형성 : 같은 이름을 가지더라도 다른 기능을 구현할 수 있는것을 말합니다. 대표적으로 오버로딩과 오버라이딩, 인터페이스와 연관이 있습니다. 인터페이스에서 정의한 것을 상속받아 그 구현을 다르게 하는 것을 말하며,
+Spring에서 OOP
Spring에서 관리하는 Bean을 이용하여 객체에 의존성을 주입하는 것이, OOP의 핵심이라고 생각합니다.
객체는, 주입받은 객체를 직접관리하지 않아도 되고, 어떻게 구현되어있는지 알 필요없이, 어떤 기능이 있는지만 알면 되기 때문에, 이것이 Spring의 OOP라고 생각합니다.
함수형 프로그래밍이란
- 주어진 문제를 작은 문제로 나눈 후, 이 작은 문제를 순수 함수로 만들어 순수함수를 조합하여 프로그램을 만드는 선언형 프로그래밍 기법입니다.
- 어떻게 하는지보다, 무엇을 할건지를 중심으로 설명하는 프로그래밍 방식입니다.
- “들어오는 Input에 대해, 원하는 결과값이 무엇(What)이다” 라고 정의한 순수 함수들을 상태를 변화시키지않고, 함수의 응용과 조합으로 프로그래밍을 유도해, Side-Effect(예상하지 못한 원치않은 결과)를 최대한 줄여서 신뢰성있는 순수함수를 만드는 것을 말합니다.
함수형 프로그래밍 장단점
따라서, 함수형 프로그래밍 기법은, 절차지형기법과 다르게, 사용하는 모든 데이터가 변경 불가능 하고, 함수는 부수효과를 가지지 않기 때문에, 공유 데이터에 대한 동시성 접근 문제에 대해 비교적 자유로울 수 있다는 장점을 가집니다.
다만, 모든 설계를 순수 함수 단위로 쪼개어, 유기적으로 설계해야하기 때문에 로직이 커질수록 생각해야하는 부분이 많아지며, 잘못된 설계는 효율의 감소로 이어집니다.
객체지향 프로그래밍 설계 원칙(SOLID)
- 단일책임 원칙 - 객체는 하나의 책임만을 가져야합니다.
- 개방-폐쇄 원칙 - 객체는 변경에는 닫혀있고, 확장에는 열려있어야한다.
- 리스코프치환 원칙 - 객체는 정확성을 깨드리지 않으면서, 하위 타입의 인스턴스로 바꿀 수 있어야 한다. (부모클래스는, 자식 클래스가 될 수 있음)
- 인터페이스 분리 원칙 - 하나의 범용 인터페이스보다, 여러개의 인터페이스가 더 좋다
- 의존관계 역전 원칙 - 추상화에 의존하고, 구현체에 의존하면 안된다.
개방 폐쇄 원칙을 지키기위한 디자인 패턴은 무엇인가요
-> 이거 뭐죠..??? 아시는분??
객체지향 프로그래밍 설계 5대 원칙이란(SOLID란)
Call By Value Vs Call By Reference
Call by value란
기본 자료형 변수를 복사하는 경우에 발생하며, 기본 자료형 변수는 저장하고 있는 값을 그 값 자체로 해석하기에 두개의 변수는 서로에게 영향을 주지 않습니다.
- 장점 : 복사하여 처리하기 때문에 안전하다. 원래의 값이 보존이 된다.
- 단점 : 복사를 하기 때문에 메모리가 사용량이 늘어난다.
Call by reference란
객체를 저장하고 있는 객체 참조 변수를 복사하는 경우에 발생하며, 참조 자료형 변수는 저장하고 있는 값을 주소로 해석하기에 두개의 변수가 같은 객체를 참조하게 됩니다.
- 장점 : 복사하지 않고 직접 참조를 하기에 빠르다.
- 단점 : 직접 참조를 하기에 원래 값이 영향을 받는다.(리스크)
Java의 호출 방식
java의 경우 함수에 전달되는 인자의 데이터 타입에 따라서 (원시자료형 / 참조자료형) 함수 호출 방식이 달라집니다.
- 원시 자료형 (primitive type) : call-by-value 로 동작 (int, short, long, float, double, char, boolean )
- 참조 자료형 (reference type): call-by-reference 로 동작 (Array, Class Instance)
try catch vs throw exception
예외처리 try catch와 throw exception의 차이점은?
- try-catch : 예외가 발생할 수 있는 부분을 try 블럭에 넣고 예외가 발생시 catch 블럭에서 처리하는 방법입니다.
- throw : 의도적으로 예외를 발생시키는 것인데, 특정 로직에서 특정 예외를 상위 클래스에서 공통으로 예외 처리하기 위해 사용합니다.
try-catch문에서 유의할 점은?
- try-catch문을 통해 예측 가능한 예외를 처리해주는 것도 중요하지만, 예외 발생시 try 블럭내의 나머지 코드들이 수행되지 않는다는 점을 유의해서 코드를 작성해야 합니다.
- 모든 예외는 Exception 클래스의 자손이기에 catch 블럭 최상단에 Excepion을 선언하면 어떤 에러든 해당 catch 블럭에서 처리됩니다.
String vs String Buffer vs String Builder
String
- String은 불변성을 가진 객체입니다.
- + 나 문자열을 수정, 삽입하는 경우 새로운 문자열을 생성합니다.
String Buffer, String Builder
- 문자열 객체를 버퍼에 임시로 저장합니다.
- 수정, 삭제, 삽입 시 버퍼에 저장된 문자열 객체를 수정하고
- ToString() 메서드로 문자열을 반환합니다.
차이점
- 동기화의 유무(스레드 세이프 - 멀티 스레드 동시접속시 문제가 없는 특징)
- StringBuffer - 동기화를 지원하기 때문에, 멀티 스레드환경헤서 사용합니다.
- SringBuilder - 동기화를 지원하지 않기때문에, 단일 스레드환경에서 사용됩니다.
- StringBuilder는 동기화를 지원하지 않는 반면, 속도면에선 StringBuffer 보다 성능이 좋습니다.
string, stringbuffer, stringbuilder 가 사용되면 좋을 때
String
- 변하지 않는 문자열을 자주 사용할 경우
StringBuilder
- 단일 스레드 환경 과 문자열의 추가, 수정, 삭제 등이 빈번히 발생하는 경우 StringBuilder를 사용하는 것이 성능면에서 유리
StringBuffer
- 동기화를 지원하여 멀티 스레드 환경에서도 안전하게 동작
- 멀티 스레드 환경 과 문자열의 추가, 수정, 삭제 등이 빈번히 발생하는 경우 StringBuffer를 사용하는 것이 성능면에서 유리할 것입니다.
(자료구조 질문 )맵 vs 해쉬맵 / 리스트 vs 배열(어레이) /스택 vs큐 차이
Map 인터페이스의 종류
맵 vs 해쉬맵
- Map은 Key와 Value의 집합 구조이며, 중복을 허용하지 않습니다.
- 키의 중복을 허용하지 않으며 순서를 저장하지 않습니다.
- Map은 Red-Black Tree알고리즘을 이용합니다.
해쉬맵
- HashMap은 Map 인터페이스를 따르며, 맵의 특징을 가져갑니다.
- 다만, HashTable을 이용하여 key-value값을 저장합니다.
트리맵
- 트리맵 또한 중복을 허용하지않고
- Key값들에 대한 정렬을 이루고 있습니다.
해쉬테이블맵
- HashTable Map은 Key와 Value의 값에 Null을 허용하지 않습니다.
링크드해쉬맵
- LinkedHashMap은 저장 순서를 유지합니다.
맵에서 Key값이 중복될 때
- Value를 List나 Array로,,?
Array vs LinkedList
Array
- Array는 선언할 때 Size를 고정합니다.
- 각 데이터 요소들은 인접한 위치에 저장됩니다.
- 데이터를 읽을 때, index를 통해서 읽기때문에 조회의 속도가 빠릅니다.
- 삽입, 삭제가 일어날때, 데이터들은 삭제나, 삽입이 일어난 index보다 큰 인덱스를 가진값을 모두 이동시켜야하기 때문에, O(n)을 가집니다.
LinkedList
- 자료의 주소값을가지는 노드가 인접해 있는 노드의 위치를 가르키고 있는 구조입니다.
- 가르키는 위치만 변경하면 되기 때문에, 삽입삭제 시, 시간 복자도가 O(1) 입니다.
- 데이터를 조회할 때는, 루트노드부터 순차적으로 탐색하여야 합니다.
Stack vs Queue
Stack
- Stack은 후입 선출의 구조입니다.
- top을 통해서만 삽입과 삭제가 이루어집니다.(입구가 하나)
- 후위표기식, 괄호검사, 역순문자열, 웹 브라우저 방문기록(뒤로가기) 에 활용
Queue
- Queue는 선입 선출의 구조입니다.
- 삭제연산이되는 front, 삽입연산이되는 rear 2가지 방향이 존재합니다.
- 순차적인 업무에 활용, bfs
자바 버전 별 특징
JAVA 8 특징
- 람다 표현식
- Streem
- Optional
- 정적 메소드 참조
람다식
boolean isReal = list.stream().anyMatch(u -> User.isRealUser(u));
이를 메서드 참조로 변경하면
boolean isReal = list.stream().anyMatch(User::isRealUser);
JAVA 11 특징
1. string 메소드 추가
- strip(): 문자열 앞, 뒤의 공백 제거.
- stripLeading(): 문자열 앞의 공백 제거.
- stripTrailing(): 문자열 뒤의 공백 제거.
- isBlank(): 문자열이 비어있거나, 공백만 포함되어 있을 경우 true를 반환한다.
- String.trim().isEmpty() 와 결과가 동일함.
- repeat(n): n개만큼 문자열을 반복하여 붙여서 반환함.
2. Java 11의 Default GC는 G1 GC이다. (성능 개선)
3. 람다에서 로컬 변수 Var 사용
JAVA 17 특징
1. sealed 타입 - 상속 받는 타입 제한
2. Pattern Matching for switch (Preview)
등등.. 뭐가 많이 추가된거 같음 ㅎㅎ
'CS 면접 준비' 카테고리의 다른 글
[백엔드 면접 질문] CS - Web, Network 면접 질문 정리(1) (0) | 2022.08.07 |
---|---|
[백엔드 면접 질문] CS - JAVA 면접 질문 정리(1) (4) | 2022.05.11 |