일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 리버스 프록시
- 포워드 프록시
- 네트워크
- try-catch
- k번째큰수
- 빈 타입 조회
- 전략 패턴
- Class Loader
- 쇠막대기
- 후위표기식
- 자바의 면접
- www.naver.com치면 발생하는일
- 싱글톤 패턴
- 팩토리 패턴
- 옵저버 패턴
- @Tranctional
- SOLID원칙
- 스프링 빈
- 참조형 반환타입
- 기본형 매개변수
- removeAll
- 스프링 컨테이너
- 백준 2164
- 참조형 매개변수
- 스프링 싱글톤
- TCP/IP 4계층
- mvvm패턴
- 스프링
- 백준 1935
- 팩토리패턴
- Today
- Total
스파이더 웹 개발
면접 예상 질문 -Java 본문
1. Java의 특징
Java는 객체지향 프로그래밍 언어입니다
기본 자료형을 제외한 모든 요소들이 객체로 표현되고, 객체지향개념의 특징인 추상화, 캡슐화, 상속, 다형성이 잘 적용된 언어이다
장점
- 운영체제에 독립적이다
- JVM에서 동작하기 때문에 운영체제에 독립적이다
- 자동으로 메모리 관리를 해준다
- JVM에서 Garbage Collector라고 불리는 데몬 쓰레드에 의해 GC(Garbage Collection)가 일어난다. GC로 인해 별도의 메모리 관리가 필요 없으며 비지니스 로직에 집중할 수 있다
- 멀티스레드를 쉽게 구현할 수 있다
- 자바는 스레드 생성 및 제어와 관련된 라이브러리 API를 제공하고 있기 때문에 실행되는 운영체제에 상관없이 멀티 스레드를 쉽게 구현할 수 있다
-동적 로딩(Dynamic Loading)을 지원한다
- 애플리케이션이 실행될 때 모든 객체가 생성되지 않고, 각 객체가 필요한 시점에 클래스를 동적 로딩해서 생성한다. 또한 유지보수 시 해당 클래스만 수정하면 되기 때문에 전체 애플리케이션을 다시 컴파일할 필요가 없다. 따라서 유지보수가 쉽고 빠르다.
단점
- 비교적 속도가 느리다
- 자바는 한 번의 컴파일링으로 실행 가능한 기계어가 만들어지지 않고 JVM에 의해 기계어로 번역되고 실행하는 과정을 거치기 때문에 C나 C++의 컴파일 단계에서 만들어지는 완전한 기계어보다는 속도가 느리다
- 예외처리가 불편하다
- 예외처리가 필요한 경우 개발자가 예외처리를 선언해주어야 한다
2. Java non-static 멤버와 static 멤버의 차이
아래 정리글 참조
클래스 변수, 인스턴스 변수, 지역 변수의 차이3. 인터페이스와 추상클래스의 차이
추상클래스
- abstract 키워드로 정의된 클래스
- 추상 클래스는 클래스 내 추상 메서드가 하나 이상 포함되거나 abstract로 정의된 경우를 말한다
- 목적
- 객체를 생성하기 위함이 아니며, 상속을 위한 부모 클래스로 활용하기 위함
- 즉, 추상 클래스의 추상 메서드를 자식 클래스가 구체화하여 그 기능을 확장하는 데 목적이 있다
인터페이스
- 추상메서드와 상수만을 포함, interface 키워드를 사용한다
- 인터페이스의 구현
- 인터페이스를 상속받고, 추상 메서드를 모두 구현한 클래스를 작성한다.
- implements 키워드를 사용하여 구현한다.
- 인터페이스의 목적
- 상속받을 하위 클래스에게 구현할 메서드들의 원형을 모두 알려주어, 클래스가 자신의 목적에 맞게 메서드를 구현하도록 하는 것이다.
- 구현 객체의 같은 동작을 보장하기 위한 목적이 있다.
- 즉, 서로 관련이 없는 클래스에서 공통적으로 사용하는 방식이 필요하지만 기능을 각각 구현할 필요가 있는 경우에 사용한다.
추상클래스와 인터페이스의 공통점
- 인스턴스를 생성할 수 없다
- 선언부만 있고 구현부는 없다
- 자식 클래스가 메서드를 구현하도록 책임을 위임한다
추상클래스와 인터페이스의 차이점
- 추상 클래스는 추상 메서드를 자식 클래스가 구체화하여 그 기능을 확장하는 데 목적이 있다. (상속을 위한 부모 클래스)
- 인터페이스는 서로 관련이 없는 클래스에서 공통적으로 사용하는 방식이 필요하지만 기능을 각각 구현할 필요가 있는 경우에 사용한다. (구현 객체의 같은 동작을 보장)
- 인터페이스는 다중상속이 가능하지만 추상 클래스는 단일 상속이다
4. 접근제어자
변수 또는 메소드의 접근 범위를 설정해주기 위해서 사용하는 Java의 예약어를 의미하며, 총 4가지 종류가 있습니다
- public - 접근제한이 없습니다. 같은 프로젝트 내 어디서든 사용 가능합니다
- protected - 해당 패키지 내, 다른 패키지에서 상속받아 자손 클래스에서 접근 가능합니다
- (default는 생략이 가능합니다) - 해당 패키지 내에서만 접근 가능합니다
- private - 해당 클래스에서만 접근 가능합니다
5. String, StringBuffer, StringBuilder의 차이
- String은 불변속성이지만, StringBuffer와 StringBuilder는 가변의 속성을 가집니다
- StringBuffer는 동기화를 지원하여 멀티쓰레드 환경에서 주로 사용합니다
- StringBuilder는 동기화를 지원하지 않아 싱글 쓰레드 환경에서 주로 사용합니다
String 클래스는 불변하기 때문에 문자열을 수정하는 시점에 새로운 String 인스턴스가 생성됩니다
수정하기 이전 문자열의 경우 할당 되어 있던 메모리영역은 Garbage로 남아 있다가 GC(garbage collection)에 의해 사라집니다
그러므로 변하지 않는 문자열의 경우 String을 사용하면 좋은 성능을 발휘 하지만 추가 삭제 수정등 연산이 빈번할 경우 String 클래스는 힙 메모리에 많은 Garbage가 생성되어 메모리 부족이 발생 됩니다
이를 해결하기 위해 가변성을 가지는 StringBuffer / StringBuilder 클래스가 도입되었으며,
두 클래스의 가장 큰 차이점은 동기화 유무 입니다. StringBuffer는 동기화를 지원하여 멀티쓰레드 환경에서 안전하며
(String 또한 불변이기에 여러개의 thread가 불변객체에 접근해서 수정하려해도 수정이 불가능하기때문에 멀티쓰레드 환경에서 안정성이 있습니다)
StringBuilder는 동기화를 지원하지않아 멀티쓰레드 환경에서는 적합하지 않지만, 단일쓰레드에서의 성능은 StringBuffer보다 뛰어납니다
6. Java 직렬화와 역직렬화란 무엇인가
자바 직렬화(Serialization) 란
- 객체를 바이트 스트림으로 바꾸는 것
- 객체에 저장된 데이터를 스트림에 write하기 위해 연속적인 serial 데이터로 변환하는 것
- program의 object에 담긴 데이터를 어떤 외부 파일에 write 및 전송하는 것
- 시스템적으로 이야기하자면 JVM(Java Virtual Machine 이하 JVM)의 메모리에 상주(힙 또는 스택)되어 있는 객체 데이터를 바이트 형태로 변환하는 기술
역직렬화(Deserialize) 란
- 어떤 외부 파일의 데이터를 프로그램 내의 object로 read 하는 것.
- 네트워크나 영구저장소에서 바이트 스트림을 가져와서 객체가 저장되었던 그 상태로 변환하는 것.
자바 클래스 직렬화 구현하는 방법
직렬화는 생성한 클래스를 Serializable 인터페이스를 구현하는 클래스로 만듬으로써 가능합니다. Serializable 인터페이스는 메소드도 필드도 없는 인터페이스입니다.
serialVersionUID 란?
직렬화 버전의 고유값 이다.
즉, 직렬화/역직렬화를 할 때 이 값으로 해당 클래스의 특정 버전에 맞는지 아닌지를 판단하겠다는 것.
serialVersionUID는 객체의 버전관리에 사용됩니다. serialVersionUID를 지정하지 않으면 클래스에서 필드를 추가하거나 수정할 때 serialVersionUID가 새 클래스에 대해 생성되고 이전 직렬화된 객체가 다르기 때문에 이미 직렬화된 객체를 복구할 수 없습니다. Java 직렬화 프로세스는 직렬화된 객체의 상태를 복구하기 위해 올바른 serialVersionUID를 사용하고 serialVersionUID가 일치하지 않는 경우 java.io.InvalidClassException을 발생시킵니다.
7. Call by Value vs Call by Reference
Call by Value (값에 의한 호출)
- 함수가 호출될 때, 메모리 공간 안에서는 함수를 위한 별도의 임시 공간이 생성된다.
- 함수 호출시 인자로 전달되는 변수의 값을 복사하여 함수의 인자로 전달한다.
- 복사된 인자는 함수 안에서 지역적으로 사용되는 local value의 특성을 가진다.
- 따라서 함수 안에서 인자의 값이 변경되어도, 외부의 변수의 값은 변경되지 않는다.
Call by Reference (참조에 의한 호출)
- 함수가 호출될 때, 메모리 공간 안에서는 함수를 위한 별도의 임시 공간이 생성된다.
- 함수 호출시 인자로 전달되는 변수의 레퍼런스를 전달한다. (해당 변수를 가리킨다.)
- 따라서 함수 안에서 인자의 값이 변경되면, 인자로 전달된 변수의 값도 함께 변경된다.
자바는 Call by Value 이다
기본자료형의 경우 해당하는 변수의 값을 복사해서 전달한다 그렇기에 Call by Value 이다
참조형의 경우도 '주소값' 자체를 전달하는것이 아니라 '주소를 가리키는 참조값'을 전달하고
또한, 주소값 자체를 '복사 없이' 인자로 전달하는게 아니라 자기 자신이 가지고 있는 값을 복사해서 전달하므로
자바의 경우 기본형 참조형 모두 자기 자신이 가지고 있는 값을 복사해서 전달하기 때문에 Call by Value 이다
8. OOP의 4가지 특징과 5대 원칙
객체 지향 프로그래밍 OOP 정리9. 클래스, 객체, 인스턴스의 차이
클래스(Class)
- 객체를 만들어 내기 위한 설계도 혹은 틀
- 연관되어 있는 변수와 메서드의 집합
객체(Object)
- 소프트웨어 세계에 구현할 대상
- 클래스에 선언된 모양 그대로 생성된 실체
- '클래스의 인스턴스(instance)' 라고도 부른다.
- 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖는다.
- oop의 관점에서 클래스의 타입으로 선언되었을 때 '객체'라고 부른다.
인스턴스(Instance)
- 설계도를 바탕으로 소프트웨어 세계에 구현된 구체적인 실체
- 즉, 객체를 소프트웨어에 실체화 하면 그것을 '인스턴스'라고 부른다.
- 실체화된 인스턴스는 메모리에 할당된다.
- 인스턴스는 객체에 포함된다고 볼 수 있다.
- oop의 관점에서 객체가 메모리에 할당되어 실제 사용될 때 '인스턴스'라고 부른다.
- 추상적인 개념(또는 명세)과 구체적인 객체 사이의 관계 에 초점을 맞출 경우에 사용한다.
- '~의 인스턴스' 의 형태로 사용된다.
- 객체는 클래스의 인스턴스다.
- 객체 간의 링크는 클래스 간의 연관 관계의 인스턴스다.
- 실행 프로세스는 프로그램의 인스턴스다.
- 즉, 인스턴스라는 용어는 반드시 클래스와 객체 사이의 관계로 한정지어서 사용할 필요는 없다.
- 인스턴스는 어떤 원본(추상적인 개념)으로부터 '생성된 복제본'을 의미한다.
10. 자바 컬렉션 프레임워크(Java Collection Framework)
컬렉션 프레임워크란? 데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것 입니다
자바 컬렉션에는 List,Set,Map 인터페이스를 기준으로 여러개의 구현체가 존재하고, 추가적으로 Stack과 Queue과 존재한다
List
List는 순서가 있는 데이터의 집합이며, 데이터의 중복을 허용합니다
구현체) ArrayList, Vector...
Set
Set은 순서가 없는 데이터의 집합이며, 데이터의 중복을 허용하지 않는다
구현체) HashSet, LinkedHashSet(순서를 보장할 때 사용)..
Map
Map은 키와 값이 한 쌍으로 이루어져 있고, 키는 중복을 허용하지않고 값은 중복을 허용한다(아이디와 비밀번호라고 생각하자)
구현체) HashMap, TreeMap, HashTable..
Stack 객체는 직접 new 키워드로 사용할 수 있으며, Queue 인터페이스는 다형성을 이용하여 new 키워드를 적용해 사용할 수 있습니다.
11. Map 인터페이스의 구현체 종류와 특징
HashMap
- Entry<K,V>의 배열로 저장되며, 배열의 index는 내부 해쉬 함수를 통해 계산된다.
- 내부 hash값에 따라서 키순서가 정해지므로 특정 규칙없이 출력된다.
- key와 value에 null값을 허용한다.
- 비동기 처리
- 시간복잡도: O(1)
HashTable
데이터를 다루는 메소드에 syncronized키워드가 붙어있다. 해당 키워드는 메소드 호출 전 thread간 동기화 lock을 통해 multi thread 환경에서도 data의 무결성을 보장한다.하지만 이 동기화 락이 매우 느린 동작이어서 단일 thread 환경에서는 HashMap을 사용하는 것이 훨씬 빠르다.
ConcurrentHashMap
HashMap과 같은 구조이지만 동기화가 보장되지 않는 HashMap을 보완한 것이 ConcurrentHashMap이다. 하지만 HashMap과는 다르게 key와 value가 null값을 허용하지 않는다.동기화 처리를 할 때, 어떤 Entry를 조작하는 경우에 해당 Entry에 대해서만 락을 건다. 그래서 HashTable보다 데이터를 다루는 속도가 빠르다. 즉, Entry 아이템별로 락을 걸어 멀티 쓰레드 환경에서의 성능을 향상시킨다.
TreeMap
TreeMap은 이진트리를 기반으로 한다(이진 트리란? 자식 노드가 최대 두 개인 노드들로 구성된 트리)
TreeMap에 객체를 저장하면 자동 정렬되는데, 키는 저장과 동시에 자동 오름차순으로 정렬이 된다
내부적으로 레드-블랙 트리(Red-Black tree)로 저장된다.
레드 블랙 트리는 부모노드보다 작은 값을 가지는 노드는 왼쪽 자식으로, 큰 값을 가지는 노드는 오른쪽 자식으로 배치하여
데이터의 추가나 삭제 시 트리가 한 쪽으로 치우쳐지지 않도록 균형을 맞추어준다.
LinkedHashMap
HashMap을 상속 받아 HashMap의 모든 기능을 그대로 사용할 수 있고 저장된 데이터들의 순서를 유지한다
12. Set 인터페이스의 구현체 종류와 특징
HashSet
저장 순서를 유지하지 않는 데이터의 집합이고 중복된 값을 허용하지 않습니다. 또한 null을 허용합니다
LinkedHashSet
저장 순서를 유지하는 HashSet
TreeSet
- 이진 검색 트리(binary search tree) 자료구조의 형태로 데이터를 저장하는 컬렉션 클래스이다.
- 정렬, 검색, 범위 검색에 높은 성능을 보이는 자료구조이다.
13. List 인터페이스의 구현체 종류와 특징
ArrayList
- 단방향 포인터 구조로 각 데이터에 대한 인덱스를 가지고 있어 데이터 검색에 적합하다.
- 데이터의 삽입, 삭제 시 해당 데이터 이후 모든 데이터가 복사되므로 삽입, 삭제가 빈번한 데이터에는 부적합하다.
LinkedList
- 양방향 포인터 구조로 데이터의 삽입, 삭제 시 해당 노드의 주소지만 바꾸면 되므로 삽입, 삭제가 빈번한 데이터에 적합하다.
- 데이터의 검색 시 처음부터 노드를 순회하므로 검색에는 부적합하다.
- 스택, 큐, 양방향 큐 등을 만들기 위한 용도로 쓰인다.
Vector
- 내부에서 자동으로 동기화 처리가 일어난다.
- 성능이 좋지 않고 무거워 잘 쓰이지 않는다.
14 . 제네릭(Generic) 이란?
Generic 이란
- 클래스에서 사용할 타입을 클래스 외부에서 설정하도록 만드는 것
Generic 장점
제네릭 타입을 사용함으로써 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있다.(컴파일 타임에서 타입체크를 하기에, 타입 안정성을 제공한다. )
또 제네릭 코드를 사용하면 타입을 국한하기 때문에 요소를 찾아올 때 타입변환을 할 필요가 없어 프로그램 성능이 향상된다.(타입체크 형변환 생략이 가능하여 코드가 간결해진다.)
15 . JVM 에 대해 설명해주세요
JVM 이란?
16 . 불변 객체에 대해 설명해주세요
- 불변 객체는 객체 생성 이후 내부의 상태가 변하지 않는 객체를 말한다
- Java에서는 필드가 원시 타입인 경우 final 키워드를 사용해 불변 객체를 만들수 있다
- 참조 타입의 경우에는 추가적인 작업이 필요하다
참조타입인 경우
참조 타입은 대표적으로 1.객체를 참조할 수도 있고, 2.배열이나 3.List 등을 참조할 수 있습니다.
1. 참조 변수가 일반 객체인 경우 객체를 사용하는 필드의 참조 변수도 불변 객체로 변경해야 합니다.
2. 배열일 경우 배열을 받아 copy해서 저장하고, getter를 clone으로 반환하도록 하면 됩니다.
(배열을 그대로 참조하거나, 반환할 경우 외부에서 내부 값을 변경할 수 있음. 때문에 clone을 반환해 외부에서 값 변경하지 못하게 함)
3. 리스트인 경우에도 배열과 마찬가지로 생성시 새로운 List를 만들어 값을 복사하도록 해야 합니다.
배열과 리스트는 내부를 복사하여 전달하는데, 이를 방어적 복사(defensive-copy)라고 합니다.
불변 객체의 장점과 단점
장점
1. Thread-Safe하여 병렬 프로그래밍에 유용하며, 동기화를 고려하지 않아도 된다.
(공유 자원이 불변이기 때문에 항상 동일한 값을 반환하기 때문)
2. 실패 원자적인 메소드를 만들 수 있다.
(어떠한 예외가 발생되더라도 메소드 호출 전의 상태를 유지할 수 있어 예외 발생 전과 똑같은 상태로 다음 로직 처리 가능)
3. 가비지 컬렉션 성능을 높일 수 있다.
(가비지 컬렉터가 스캔하는 객체의 수가 줄기 때문에 Gc 수행 시 지연시간도 줄어든다.)
단점
1. 객체가 가지는 값마다 새로운 인스턴스를 생성해야한다.
17 . 자바 메모리 영역에 대해 설명 해주세요
자바의 메모리 공간은 Method, Stack, Heap, PC Register, Native 으로 구분된다
Method 영역
- 전역변수와 static변수를 저장하며, Method영역은 프로그램의 시작부터 종료까지 메모리에 남아있다.
Stack 영역
- 지역변수와 매개변수 데이터 값이 저장되는 공간이며, 메소드가 호출될 때 메모리에 할당되고 종료되면 메모리가 해제된다.
- LIFO(Last In First Out) 구조를 갖고 변수에 새로운 데이터가 할당되면 이전 데이터는 지워진다.
- 컴파일 타임시 할당
Heap 영역
- new 키워드로 생성되는 객체(인스턴스), 배열 등이 Heap 영역에 저장되며, 가비지 컬렉션에 의해 메모리가 관리되어 진다.
- 런타임시 할당
PC Register 영역
- 스레드가 생성될 때마다 생성되는 영역으로 다음 명령어의 주소를 알고 있습니다.
Native
- 자바 외 언어로 작성된 코드를 위한 영역입니다.
18 . Wrapper Class 와 오토 박싱 & 언 박싱 에 대해 설명 해주세요
Wrapper Class란?
기본 자료타입을 객체로 다루기 위해서 사용되는 클래스
Boxing & UnBoxing 이란?
박싱 : 기본 타입 데이터에 대응하는 Wrapper 클래스로 만드는 동작
언박싱 : Wrapper 클래스에서 기본 타입으로 변환
// 박싱
int i = 10;
Integer num = new Integer(i);
// 언박싱
Integer num = new Integer(10);
int i = num.intValue();
오토 박싱(AutoBoxing)과 오토 언박싱(AutoUnBoxing)
JDK 1.5부터는 박싱과 언박싱이 필요한 상황에서 자바 컴파일러가 이를 자동으로 처리해 준다. 이렇게 자동화된 박싱과 언박싱을 오토 박싱(AutoBoxing)과 오토 언박싱(AutoUnBoxing)이라고 부른다
19. final / finally / finalize 의 차이
- final은 클래스, 메소드, 변수, 인자를 선언할 때 사용할 수 있으며, '변경 불가능' 하도록 사용합니다.
- final 원시 변수는 해당 변수의 값은 변경이 불가능 하다
- final 참조 변수는 참조 변수가 힙(heap) 내의 다른 객체를 가리키도록 변경할 수 없다
- final 메소드는 다른 클래스가 이 클래스를 상속할 때 메소드 오버라이딩을 금지합니다.
- final 클래스는 다른 클래스에서 이 클래스를 상속할 수 없습니다.
- finally는 try-catch와 함께 사용되며, try-catch가 종료될 때 finally block이 항상 수행되기 때문에 마무리 해줘야 하는 작업이 존재하는 경우에 해당하는 코드를 작성해주는 코드 블록입니다.
- finally 블록 예외가 발생하더라도 항상 실행된다(단 JVM이 try 블록 실행 중에 종료되는 경우는 제외한다)
- finally 블록 예외가 발생하더라도 항상 실행된다(단 JVM이 try 블록 실행 중에 종료되는 경우는 제외한다)
- finalize는 Object 클래스에 정의되어 있는 메소드이며, GC에 의해 호출되는 메소드로 절대 호출해서는 안되는 메소드입니다. GC가 발생하는 시점이 불분명하기 때문에 해당 메소드가 실행된다는 보장이 없고, finalize() 메소드가 오버라이딩 되어 있으면 GC가 이루어질 때 바로 Garbage Collectiong 되지 않습니다. GC가 지연되면서 OOME(Out of Memory Exception)이 발생할 수 있기 때문에 finalize() 메소드를 오버라이딩하여 구현하는 것을 권장하지 않고 있다.
19. Java의 리플렉션 이란
구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 API
리플렉션이 사용되는 경우
코드를 작성할 시점에는 어떤 타입의 클래스를 사용할지 모르지만, 런타임 시점에 지금 실행되고 있는 클래스를 가져와서 실행해야 하는 경우
프레임워크나 IDE에서 이런 동적인 바인딩을 이용한 기능을 제공한다. intelliJ의 자동완성 기능, 스프링의 어노테이션이 리플렉션을 이용한 기능이다.
20. Synchronized 란?
- 여러 개의 쓰레드가 한 개의 자원을 사용하고자 할 때, 현재 데이터를 사용하고 있는 쓰레드를 제외하고 나머지 쓰레드들은 데이터에 접근할 수 없게 막는 개념입니다.
- 데이터의 thread-safe를 하기 위해 자바에서 Synchronized 키워드를 제공해 멀티 쓰레드 환경에서 쓰레드간 동기화를 시켜 데이터의 thread-safe를 보장합니다.
- Synchronized는 변수와 메소드에 사용해서 동기화 할 수 있으며, Synchronized 키워드를 남발하게 되면 오히려 프로그램의 성능저하를 일으킬 수 있습니다.
20. == 과 equals( ) 차이에 대해 설명해주세요
1. == 연산자
== 연산자는 객체의 주솟값을 비교하는 역할을 하기에, 비교하려는 객체가 동일한 객체인지를 판별한다
Primitive Type의 객체에 대해서는 값 비교가 가능하고, Reference Type에 대해서는 주소 비교를 수행한다.
Primitive Type의 객체는 Constant Pool의 특정한 값을 참조하는 변수이기에, 결국 Constant Pool내의 동일한 주소를 비교한다.(해당 주소가 동일하기에 ==을 사용해서 비교가 가능)
2. equals( )
객체 비교 메서드이다
내용 비교(Content Comparison)를 하며두 객체의 값이 같은지 확인한다.즉, 문자열의 데이터/내용을 기반으로 비교한다.
기본 유형(Primitive Types)에 대해서는 적용할 수 없다.
21. 함수형 인터페이스란?
함수형 인터페이스를 이야기하기 전에 일급 객체에 대해 먼저 말씀드리겠습니다.
일급 객체는 다음 속성을 모두 만족해야합니다.
- 변수에 값을 할당할 수 있어야한다
- 함수의 파리미터로 넘겨줄 수 있어야한다
- 함수의 반환값이 될 수 있어야 합니다
그러나 Java에 메서드는 일급객체의 조건을 모두 만족하지 않으므로 일급객체가 아니므로 Java는 함수형 프로그래밍 언어가 아닙니다.
하지만 Java8 부터는 함수를 일급객체처럼 다룰 수 있게 함수형인터페이스를 제공합니다.
함수형 인터페이스는 추상메서드가 하나만 존재하는 인터페이스 입니다. 그리고 람다식은 함수형 인터페이스를 기반으로 작성이 될 수 있습니다.
또한 @FunctionalInterface 어노테이션을 제공하여 컴파일 시점의 함수형인터페이스를 체크할 수 있습니다.
참조
'Interview' 카테고리의 다른 글
면접 예상 질문 - 운영체제 (0) | 2022.09.06 |
---|---|
면접 예상 질문 - 알고리즘 (0) | 2022.08.27 |
면접 예상 질문 - 데이터베이스 (0) | 2022.08.12 |
면접 예상 질문 - Spring (0) | 2022.08.05 |