🔑 JAVA
2. Java 8의 변경사항에는 무엇이 있는지 설명하시오.
👉🏻 Java 8 버전에는 람다 표현식(Lamda expressions), 스트림 API(Stream API), java.time 패키지, 나즈혼(Nashorn)이 주목할만한 특징입니다. 람다 표현식은 메소드를 하나의 식으로 표현한 것입니다. 식별자 없이 실행할 수 있는 함수 표현식을 의미하며, 따라서 익명 함수(Anonymous function)라고도 부릅니다. (+) 사용 예
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
new Thread(new Runnable() {
public void run() {
System.out.println("전통적인 방식의 일회용 스레드 생성");
}
}).start();
new Thread(()->{
System.out.println("람다 표현식을 사용한 일회용 스레드 생성");
}).start();
|
스트림 API는 저장된 데이터에 접근하는 경우 반복문이나 반복자를 사용하여 매번 코드를 작성하는 불편한 점이 있었는데 이러한 문제점을 보완하기 위해서 도입된 방법입니다. 데이터를 추상화하여 다루므로, 다양한 방식으로 저장된 데이터를 읽고 쓰기 위한 공통된 방법을 제공합니다. 따라서 배열이나 컬렉션 뿐만 아니라 파일에 저장된 데이터도 모두 같은 방법으로 다룰 수 있습니다.
(+) 사용 예
//Before
List<Shape> list = new ArrayList<Shape>();
for(Shape s : shapes){
if(s.getColor() == RED){
list.add(s);
}
}
//After
shapes.stream().filter(s -> s.getColor() == Red).collect(toList());
java.time 패키지는 Calendar 클래스의 문제점을 보완하기 위해 도입되었습니다. Calendar 인스턴스는 불변객체가 아니라서 값이 수정될 수 있었고, 윤초와 같은 특별한 상황을 고려하지 않았으며 월(month)를 나타낼 때 1월부터 12월을 0~11까지로 표현해야 하는 불편함이 있었습니다.
(+) 사용 예
LocalDate today = LocalDate.now();
System.out.println("올해는 " + today.getYear() + "년입니다.");
LocalDate otherDay = today.withYear(1982);
System.out.println("올해는 " + otherDay.getYear() + "년입니다.");
오라클의 나즈혼은 자바스크립트의 기본 엔진으로 사용되었던 모질라의 리노(Rhino)가 자바의 최신 개선 사항 등을 제대로 활용하지 못하는 노후화된 모습을 보완하기 위해 도입된 자바스크립트의 새로운 엔진입니다. 나즈혼은 리노에 비해 성능과 메모리 관리 면에서 크게 개선되었습니다.
3. 인터페이스와 추상 클래스의 각각의 특징과 차이점을 설명하시오.
👉🏻 추상 클래스는 클래스 내 추상 메소드가 하나 이상 포함되거나 아예 없거나 abstract로 정의된 경우를 말합니다. 반면 인터페이스는 모든 메소드가 추상 메소드인 경우입니다.(Java 8에서는 default 키워드를 이용해서 일반 메소드의 구현도 가능합니다.)
추상 클래스는 일반 변수들과 생성자를 가질 수 있습니다. 어떤 클래스가 추상 클래스를 상속받을 때에는 extends를 씁니다. 클래스 안에 한 개 이상의 추상 메소드가 있다면 그 클래스 앞에는 반드시 'abstract 클래스명'으로 표기되어야 하며, abstract와 final 키워드를 동시에 표기할 수 없습니다. 추상 클래스는 오버라이딩의 강제성을 부여하는데, 추상 메소드를 오버라이딩 하지 않고는 객체 생성이 불가능합니다.
인터페이스는 인터페이스로부터 상속되는 클래스가 있다면 새로운 메소드에 대한 내용을 반드시 구현해야 합니다. 인터페이스는 final을 붙일 수 없고, 변수들은 static이어야 합니다. 즉, 일반 변수와 생성자를 가질 수 없습니다. 어떤 클래스가 인터페이스를 상속받을 때에는 implements를 씁니다. 클래스가 다른 클래스를 상속하면서 인터페이스를 구현하는 것도 가능한데, 이럴 때는 extends 다음에 implements를 순서대로 쓰면 됩니다. 자바는 다중상속이 불가능한데, 인터페이스는 이 다중상속을 대체합니다.
즉, 추상 클래스의 상속과 인터페이스의 상속의 차이점은 상속(abstract)의 목적은 클래스의 확장과 코드의 재사용이며 인터페이스 상속의 목적은 요구사항을 구현하는 것입니다.
4. Call by value와 Call by reference에 대해 설명하시오.
👉🏻 Call by value은 값에 의한 호출입니다. 함수가 호출될 떄, 메모리 공간 안에서는 함수를 위한 별도의 임시공간이 생성되는데 call by value 호출 방식은 전달되는 변수 값을 복사해서 함수 인자로 전달합니다. 이때 복사된 인자는 함수 안에서 지역적으로 사용되기 때문에 local value 속성을 가집니다. 따라서 함수 안에서 인자 값이 변경되더라도, 외부 변수 값은 변경되지 않습니다.
//출처-https://re-build.tistory.com/3
Class CallByValue{
public static void swap(int x, int y) {
int temp = x;
x = y;
y = temp;
}
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("swap() 호출 전 : a = " + a + ", b = " + b);
swap(a, b);
System.out.println("swap() 호출 후 : a = " + a + ", b = " + b);
}
}
//결과
/*
swap() 호출 전 : a = 10, b = 20
swap() 호출 후 : a = 10, b = 20
*/
👉🏻 Call by reference는 참조에 의한 호출입니다. 이 호출 방식은 함수 호출 시 인자로 전달되는 변수 값이 아닌 주소(Address)를 넘겨줌으로써, 주소를 참조(Reference)하여 데이터를 변경할 수 있습니다. 따라서 함수 안에서 인자 값이 변경되면 전달된 객체의 값도 변경됩니다.
//출처-https://re-build.tistory.com/3
Class CallByReference{
int value;
CallByReference(int value) {
this.value = value;
}
public static void swap(CallByReference x, CallByReference y) {
int temp = x.value;
x.value = y.value;
y.value = temp;
}
public static void main(String[] args) {
CallByReference a = new CallByReference(10);
CallByReference b = new CallByReference(20);
System.out.println("swap() 호출 전 : a = " + a.value + ", b = " + b.value);
swap(a, b);
System.out.println("swap() 호출 전 : a = " + a.value + ", b = " + b.value);
}
}
/* 결과
swap() 호출 전 : a = 10, b = 20
swap() 호출 후 : a = 20, b = 10
*/
👉🏻 Java 호출 방식은 함수에 전달되는 인자의 데이터 타입에 따라 함수 호출 방식이 달라집니다. primitive type(원시 자료형)은 call by value 호출 방식을 사용합니다. 자료형에는 int, short, long, float, double, char, boolean이 있습니다. reference type(참조 자료형)은 call by reference 호출 방식이며 자료형에는 array, Class instance, String이 있습니다. String은 약간 특이한데, 참조 자료형이지만 Java에서 동작할 때는 원시 자료형처럼 적용됩니다.
정리하자면, Call by value의 경우 데이터 값을 복사해서 함수로 전달하기 때문에 원본 데이터가 변경될 가능성이 없습니다. 하지만 인자를 넘겨줄 때 마다 메모리 공간을 할당해야 하기 때문에 공간의 낭비가 일어날 수 있습니다.
Call by reference의 경우 메모리 공간 할당 문제는 해결했지만, 원본 값이 변경될 수 있다는 위험이 존재합니다.
출처: https://wooaoe.tistory.com/47?category=822650 [개발개발 울었다]
'Programming > JAVA' 카테고리의 다른 글
정적 변수와 메소드(static), 싱글톤 패턴 (0) | 2021.11.24 |
---|---|
자바에서 final, static 사용법? (0) | 2021.11.24 |
쓰레드, GC, 쿠키와 세션, Anomaly (0) | 2021.11.23 |
더 알아볼 개념들 (0) | 2021.11.15 |
인터페이스(interface) (0) | 2021.11.15 |