1. Shallow Copy와 Deep Copy 차이를 설명하시오
얕은복사(Shallow copy) : 주소값을 복사 하기 때문에 참조하고 있는 실제 값이 같음
깊은 복사(Deep Copy) : 실제 값을 메모리 공간에 복사하기 때문에 참조하고 있는 실제 값이 다름
즉 얕은복사는 a 와 b라는 인스턴스의 주소가 같기때문에 a의 인스턴스가 가리키고있는 값을 변경할때 b를 출력한다면 a가 변경된 값으로 출력됨
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
public class CopyObject {
private String name;
private int age;
public CopyObject() {
}
public CopyObject(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class CopyObjectTest {
@Test
void shallowCopy() {
CopyObject original = new CopyObject("JuHyun", 20);
CopyObject copy = original; // 얕은 복사
copy.setName("JuBal");
System.out.println(original.getName());//Jubal
System.out.println(copy.getName()); //Jubal
}
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public class Example {
public static void main(String[] args) {
String[] array = {"element1", "element2", "element3"};
CopiableObject object = new CopiableObject("Dave", 27, array);
// 객체를 얕은 복사
CopiableObject copiedObject = object.deepCopy();
// 원래 객체의 배열을 수정
object.getArray()[0] = "newElement";
// 복사된 객체의 배열에서 출력
System.out.println(copiedObject.getArray()[0]);//element1이 출력
}
}
|
cs |
2. Stream API의 특징에대해 설명해주세요
stream Api는 데이터를 추상화하고, 처리하는데 자주 사용되는 함수들을 정의해두었다.
- 원본의 데이터를 변경하지 않는다.
- 일회용이다.
- 내부 반복으로 작업을 처리한다.
1
2
3
4
5
6
7
8
9
10
11
|
// Stream 사용 후
String[] nameArr = {"IronMan", "Captain", "Hulk", "Thor"}
List<String> nameList = Arrays.asList(nameArr);
// 원본의 데이터가 아닌 별도의 Stream을 생성함
Stream<String> nameStream = nameList.stream();
Stream<String> arrayStream = Arrays.stream(nameArr);
// 복사된 데이터를 정렬하여 출력함
nameStream.sorted().forEach(System.out::println);
arrayStream.sorted().forEach(System.out::println);
|
cs |
출처: https://mangkyu.tistory.com/112 [MangKyu's Diary:티스토리]
3 Java의 Functional interface는 무엇인가요?
함수형 인터페이스(Functional Interface)는 추상 메서드가 딱 하나만 존재하는 인터페이스를 말합니다.
그리고 람다식은 이러한 함수형 인터페이스를 기반으로만 작성이 될 수 있습니다.
★ 즉, 함수형 인터페이스를 사용하는 이유는 람다식은 함수형 인터페이스로만 접근이 가능하기 때문에 사용합니다! ★
간단한 예시를 통해 추상 메서드가 하나만 존재하는 인터페이스란 어떤것인지 살펴보겠습니다.
• 매개변수가 있고 반환하지 않는 람다식
위 예제에서 보듯 여러가지의 표현이 가능합니다.
출처 : https://zzang9ha.tistory.com/303
4.문자열을 리터럴(string = "abcd")로 할당하는 것과 객체(string = new String("abcd"))로 할당하는 방식의 차이가 무엇인가요?
객체 할당 하는 방식은 heap 영역에 할당되고 리터럴 방식은 String Constant Pool 이라는 영역에 할당된다.
위의 equals 와 == 를 확인해보면 주소값이 다름
5 Servlet이 무엇인가요?
ㄴ> 웹 기반의 요청에 대한 동적처리 가능한 서버 사이드에서 돌아가는 자바 프로그램
java 코드 안에 html 코드 , 웹 개발 표준
db와의 통신,Business logic 호출, 데이터 읽고 확인하는 작업에 유용
6. Vector와 Stack을 사용하지 않는 이유는 무엇인가요?
Vector는 get()과 set()역할을 하는 모든 메서드에 synchronized 키워드가 붙어 있다.
따라서 멀티스레드 프로그래밍을 하는게 아니라면, 비슷한 역할을 하는 ArrayList를 사용하는게 좋다. (ArrayList에는 synchronized 키워드가 전혀 없다.)
Vector의 모든 get() set() 등의 메서드에 synchronized가 붙어있는건 특정 상황에서 성능을 꽤 저하시킬 수 있다.
마찬가지로 Stack이 사용되지 않아야 하는 이유도 Vector의 경우와 같다.
Vector를 상속받게 된 Stack은 Vector의 기능을 전부 사용할 수 있게된다.
따라서 C++의 경우처럼 Stack STL이 완벽한 LIFO 구조를 가질 수도 없게되고, 앞서 말한 Vector의 모든 단점을 그대로 물려받게 되는 것이다.
'Computer Science > Spring & Java' 카테고리의 다른 글
[JPA]스프링 프록시 (0) | 2022.11.21 |
---|---|
[JPA]스프링 연관관계 매핑 (0) | 2022.10.23 |
java 면접 질문 리스트2 (0) | 2022.08.07 |
JAVA 면접 질문1 (0) | 2022.07.21 |
스프링 기술면접 정리 (0) | 2022.07.07 |