카테고리 없음

[Java] 배열, 람다의 기초

우디혜 2021. 3. 1. 23:10

배열

변수의 크기 * 갯수만큼 연속적으로 공간을 할당받고, 특정 element에 접근할 때, 주소값 + index로 접근이 가능하다. 생성 시에 크기가 정해지는 특성 때문에 동적으로 크기를 바꿀 수 없다.

index는 왜 0부터 시작할까

1부터 시작하면 맨 첫 0 번째 메모리 공간을 낭비하게 된다.

0부터 시작해야 마지막 수가 N이 되어서 깔끔하다

 

선언 위치에 따라 달라지는 메모리 할당 위치

스택 영역에 생성되는 배열 a

 

main() 메소드 안 : 배열 a가 스택에 생성

main() 메소드 밖 : 배열 a가 코드 영역에 생성

 

C에서의 주소연산, 배열과 포인터

*(a + 2) == a[2] 같은 의미다. 즉, 배열에서 인덱스로 접근을 하는 방식은 포인터가 가리키는 곳의 주소 연산을 하는 것과 동일한 방식으로 이루어진다. 이렇게 공간 복잡도 O(1), 시간 복잡도를 낮추는 형태로 배열 내 임의의 값에 접근할 수 있다.

 

그리고 *(a + 2)가 가능한 이유는 C에서는 int 포인터 double 포인터 등 타입별로 다른 포인터가 존재한다. 따라서 a가 double[] 를 가리키고 있다면 실제 주소값 연산은 a 배열의 처음 주소값 + 8 * 2 (메모리의 기본 단위는 바이트, 그리고 double은 8바이트이므로)으로 이루어질 것이다.

 

함수형 프로그래밍

함수형 프로그래밍이란, 쉽게 말해 순수 함수들의 조합으로 사이드 이펙트를 방지하는 프로그래밍을 말한다.

 

일급 객체(일급 시민)

변수에 할당할 수 있고, 인자 혹은 반환값으로 넘길 수 있다면 해당 객체는 일급 객체라고 할 수 있다. 

 

자바에서 일급 객체

자바에서 객체는 변수에 할당할 수 있고, 인자나 반환값으로도 넘길 수 있기 때문에 일급 객체에 속하지만, 메소드는 그렇지 않다. 대신 자바에서 함수형 프로그래밍이 등장하면서 함수를 객체 단위로 wrapping하여 함수를 하나의 일급객체로 취급할 수 있게 되었다. 엄밀히 말하면 자바에서는 함수도 객체이기 때문에, @FunctionalInterface 어노테이션을 사용하여 하나의 객체에 하나의 함수만 존재할 수 있도록 약속(컴파일러가 강제)한다.

 

미리 정의되어 있는 함수형 인터페이스

- runnable과 compator를 제외하고는 모두 java.util.function 패키지 내에 존재한다.

 

Runnable, Compartor  → 매개변수 X / 리턴타입 X

Supplier  → 매개변수 X / 리턴타입 O

Consumer  → 매개변수 1개 / 리턴타입이 X

Function  → 매개변수 1개 / 리턴타입이 O

BiFunction  → 매개변수 2개 / 리턴타입이 O

BiConsumer  → 매개변수 2개 / 리턴타입 X

 

이외에도 함수형 인터페이스를 구현하고 @FunctionalInterface을 선언하여 직접 커스텀으로 만들어 줄 수 있다.

 

람다

FunctionalInterface를 구현하는 대신, 람다식을 사용해서 익명으로 함수를 만들어줄 수도 있다(즉, 람다식 자체도 하나의 객체라고 볼 수 있다 -> 익명 객체와 동일한 역할). 람다는 메소드를 하나의 식으로 표현할 수 있도록 해준다. 자바에서 메소드는 클래스에 종속적이기 때문에 클래스를 만들어주거나 객체를 생성하는 번거로움이 있었지만, 람다를 사용하면 메소드로 해야할 역할을 클래스 구현 혹은 객체 생성 여부와 상관없이 수행할 수 있다.

 

Stream

데이터 소스를 추상화한 연속된 요소. 데이터 소스가 추상화 되어있기 때문에 스트림 안에 담긴 데이터들은 데이터 타입에 상관없이 같은 방식으로 데이터를 다룰 수 있다.

 

- 데이터 소스를 변경하지 않는다. (순수 함수)

- 일회성이다. 한 번 사용하면 재사용할 수 없다.

- 병럴로 실행할 수 있다는 장점이 있지만, CPU 자원을 많이 먹게된다.

 

 

👀 함수형은 보통 성능이 좋지 않다. 함수형이라 매개변수를 다 복사해야하는 등 여러가지 성능문제가 존재하기 때문에 잘 판단하고 사용해야 한다.

 

😂 아직 공부해야할 부분이 너무도 많다 엉엉