Programming Language(100)
-
[Java] 람다식과 함수형 인터페이스 - 2/5
1. 람다식(Lambda Expression)이란? Stream 연산들은 매개변수로 함수형 인터페이스(Functional Interface)를 받도록 되어있다. 그리고 람다식은 반환값으로 함수형 인터페이스를 반환하고 있다. 그렇기 때문에 우리는 Stream API를 정확히 이해하기 위해 람다식과 함수형 인터페이스에 대해 알고 있어야 한다. [ 람다식(Lambda Expression) 이란? ] 람다식(Lambda Expression)이란 함수를 하나의 식(expression)으로 표현한 것이다. 함수를 람다식으로 표현하면 메소드의 이름이 필요 없기 때문에, 람다식은 익명 함수(Anonymous Function)의 한 종류라고 볼 수 있다. 익명 함수(Anonymous Function)란 함수의 이름이 없..
2022.08.24 -
[Java] Stream API에 대한 이해 - 1/5
1. Stream API에 대한 이해 [Stream API에 대한 소개] Java는 객체지향 언어이기 때문에 기본적으로 함수형 프로그래밍이 불가능하다. 하지만 JDK8부터 Stream API와 람다식, 함수형 인터페이스 등을 지원하면서 Java를 이용해 함수형으로 프로그래밍할 수 있는 API 들을 제공해주고 있다. 그 중에서 Stream API는 데이터를 추상화하고, 처리하는데 자주 사용되는 함수들을 정의해두었다. 여기서 데이터를 추상화하였다는 것은 데이터의 종류에 상관 없이 같은 방식으로 데이터를 처리할 수 있다는 것을 의미하며, 그에 따라 재사용성을 높일 수 있다. 예를 들어 주어진 배열이나 리스트의 데이터를 정렬된 상태로 출력하고자 한다고 하자. Stream API를 사용하지 않은 경우 다음과 같이..
2022.08.24 -
[일문일답][Java] Reflection의 개념 및 사용 방법
Reflection 이란? 리플렉션은 힙 영역에 로드된 Class 타입의 객체를 통해 원하는 클래스의 인스턴스를 생성할 수 있도록 지원하고, 인스턴스의 필드와 메소드를 접근 제어자와 상관 없이 사용할 수 있도록 지원하는 API이다. 여기서 로드된 클래스라고 함은, JVM의 클래스 로더에서 클래스 파일에 대한 로딩을 완료한 후 해당 클래스의 정보를 담은 Class 타입의 객체를 생성하여 메모리의 힙 영역에 저장해 둔 것을 의미한다. new 키워드를 통해 만드는 객체와는 다른 것임을 유의하자. 사용 방법 리플렉션을 사용하기에 앞서, 힙 영역에 로드된 클래스 타입의 객체를 가져와야 한다. 총 3가지 방법이 있다. 클래스 .class 로 가져오기 인스턴스 .getClass() 로 가져오기 Class.forNam..
2022.08.24 -
[일문일답][Java] 깊은 복사(Deep Copy)와 얕은 복사(Shallow Copy)
깊은 복사 : '실제 값'을 새로운 메모리 공간에 복사하는 것을 의미 (실제값이 다르다.) 얕은 복사 : '주소 값'을 복사한다. (즉, 참조하고 있는 실제값은 같다.) 얕은 복사의 경우 주소 값을 복사하기 때문에, 참조하고 있는 실제 값은 같다. @Getter @Setter @NoArgsConstructor @AllArgsConstructor static class Human implements Cloneable { private String name; private int age; // 복사 생성자 public Human(Human human) { this.name = human.name; this.age = human.age; } // 복사 팩터리 public static Human newInsta..
2022.08.24 -
[일문일답][Java] 'Call by value'와 'Call by reference'의 차이
함수 호출 방법은 크게 두가지가 있다. Call by value (값에 의한 호출) Call by reference (참조에 의한 호출) 이를 설명하기 위해, 많은 교재에서는 그림으로 예시를 들고 있다. 예를 들어, 컵에 물을 채워서 이 물을 직접 가져다가 다른 컵에서 사용하느냐, 아니면 똑같은 컵과 물을 한 컵 더 준비하여 사용을 하느냐라는 식이다. 언뜻 보면 이해가 쉬울 수 있지만, 오히려 헷갈릴 수가 있다. 이는 프로그래밍적으로 직접 접근해서 알아보는 것이 가장 확실하다. Call by value(값에 의한 호출)는 인자로 받은 값을 복사하여 처리를 한다. Call by reference(참조에 의한 호출)는 인자로 받은 값의 주소를 참조하여 직접 값에 영향을 준다. 간단히 말해 값을 복사를 하여 ..
2022.08.24 -
[일문일답][Java] 가비지 컬렉션 - 2
1. 다양한 가비지 컬렉션 알고리즘 JVM이 메모리를 자동으로 관리해주는 것은 개발자 입장에서 상당한 메리트이다. 하지만 문제는 GC를 수행하기 위해 Stop The World에 의해 애플리케이션이 중지되는 것에 있다. Heap의 사이즈가 커지면서 애플리케이션의 지연(Suspend) 현상이 두드러지게 되었고, 이를 막기 위해 다양한 가비지 컬렉션 알고리즘을 지원하고 있다. Serial GC Serial GC의 Young 영역은 앞서 설명한 알고리즘(Mark Sweep)대로 수행된다. 하지만 Old 영역에서는 Mark Sweep Compact 알고리즘이 사용되는데, 기존의 Mark Sweep에 Compact라는 작업이 추가되었다. Compact는 Heap 영역을 정리하기 위한 단계로 객체들이 연속되게 쌓이..
2022.08.24