월루를 꿈꾸는 대학생

[Java] 자바 무슨 일이 일어나고 있는가? 본문

Programing/Java

[Java] 자바 무슨 일이 일어나고 있는가?

하즈시 2023. 8. 5. 01:14
728x90

1.1 역사의 흐름은 무엇인가?

멀티코어 CPU 대중화에 의한 하드웨어적 변화가 소프트웨어에도 영향을 미침
자바의 경우 코어 하나만 사용을 했었는데 이젠 하나로는 하드웨어를 온전히 다 활용하지 못하는 경우가 발생하게 되었고 자바 8에서도 쓰레드가 아닌 병렬 실행을 통해서 보다 나은 성능을 제공

  1. ==스트림 api==
  2. ==메서드에 코드 자체를 전달
  3. ==인터페이스의 디폴트 메서드

스트림 api로 인해서 코드를 전달하는 간결 기법(메서드 참조 & 람다) 와 인터페이스의 디폴트 메서드를 사용할 수 있다.

메서드 코드 전달 기법

  • 파라미터화 구현
  • 조금 다른 기능을 하는 비슷한 메서드 두개를 하나로 통합한 후 인수를 통해서 다른 동작을 하도록 하는 것

1.2 왜 아직도 자바는 변화하는가?

자바는 처음부터 잘 설계된 객체지향 언어로 시작

1.2.2 스트림 처리

스트림처리

  • 스트림이란? 공장 생산라인처럼 어떤 항목을 연속으로 제공하는 어떤 기능'

참고 사이트
![[Pasted image 20230709202630.png]]

  • 한 번에 하나씩 만들어지는 연속적인 데이터 항목들의 모임
  • 입력 스트림에서 하나의 데이터를 읽으면 출력 스트림에서 데이터를 하나씩 기록
  • 스트림 api는 조립라인처럼 어떤 항목을 연속으로 제공하는 기능!
  • 작업을 (데이터베이스 질의) 고수준으로 추상화 하여 일련의 스트림을 만들어 처리가능
  • **공짜 병렬성

1.2.3 동작 파라미터화로 메서드에 코드전달

코드 일부를 api로 전달
메서드를 ==다른 메서드의 인수==로 넘겨주는 기능을 제공 = **동작 파라미터화

1.2.4 병렬성과 공유 가변 데이터

스트림 메서드로 전달하는 코드는 다른 코드와 동시에 실행하더라도 안전하게 실행되어야 한다. 이러한 코드는 공유된 가변 데이터 에 접근할 수 없어야한다.
= ==순수 함수, 부작용없는 함수 , 상태 없는 함수==

1.2.5 자바가 진화해야하는 이유

자바는 고전적인 객체지향에서 벗어나 함수형 프로그래밍으로 진화하는 중
언어는 하드웨어나 프로그래머 기대의 변화에 부응하는 방향으로 변화해야한다.

1.3 자바 함수

함수 = 정적 메서드 , 수학적인 함수 즉 계산식
자바 8에서는 함수를 값처럼 취급한다

자바에서 조작할 수 있는 값 :기본값 (int, double), 객체(인스턴스 , String형식, new Integer , 배열 등)

프로그래밍 핵심 : 값을 바꾸는 것

  • 일급시민 : 값을 바꿀 수 있음, 구조체 (메서드 , 클래스)값의 구조 표현에 도움
  • 이급시민 : 메서드 , 클래스

1.3.1 메서드와 람다를 일급 시민으로

메서드를 값으로 취급할 수 있는 기능
1. 메서드 참조

람다 : 익명함수
메서드 뿐만 아니라 람담(익명함수)를 포함 일급값 취급

Filep[] hiddenFiles = new File(".").listFiles(new FileFilter()){
    public boolean accept(File file){
        return file.isHidden();
    }
}
File[] hiddenFiles = new File(".").listFiles(File::isHidden);

isHidden이라는 함수를 값처럼 사용해서 메서드의 인수로 직접 전달
new로 객체참조를 생성해서 객체를 주고 받은 거 처럼 자바8에서 메서드 참조를 사용해서 값을 전달할 수 있게 되었다.

public static List<Apple> filterGreenApples(List<Apple> inventory) {  
  List<Apple> result = new ArrayList<>();  
  for (Apple apple : inventory) {  
    if ("green".equals(apple.getColor())) {  
      result.add(apple);  
      // 녹색사과만 선택해서 리스트에 넣어서 반환 = 필터
    }  
  }  
  return result;  
}

필터 : 특정 항목을 선택해서 반환

public static List<Apple> filterHeavyApples(List<Apple> inventory) {  
  List<Apple> result = new ArrayList<>();  
  for (Apple apple : inventory) {  
    if (apple.getWeight() > 150) {  
      result.add(apple);  
    }  
  }  
  return result;  
}

두 함수 다 비슷하게 기능하는 함수 복붙함수
➡️ 어떤 코드에 버그가 있으면 해당 복붙 코드 다 고쳐야함 ;;
➡️ 자바8에서는 코드를 인수로 넘길 수 있으므로 filter를 중복 구현하지 않아도 오케이

🙋🙋🙋🙋🙋🙋🙋🙋🙋🙋🙋🙋

public static boolean isHeavyApple(Apple apple){
    return apple.getWeight()>150;
}
// 위의 isHeavyApple을 Predeicate로 넘김 
// java.util.function에서 가져옴
public interface Predicate<T>{
    boolean test(T t);
}

static List<Apple> filterApples(List<Apple> inventory, Predicate<Apple> p){
// 파라미터로 Predicate가 들어옴 
// Predicate와 비슷한 isHeacyApple이 저기에 들어가면서 해당 사과를 조건에 맞는 필터링을 한다?
    List<Apple> result = enw ArrayList<>();
    for(Apple apple : inventory){
        if(p.test(apple)){
            result.add(apple);
        }
    }
    return result;
}
public static boolean isGreenApple(Apple apple) {  
  return "green".equals(apple.getColor());  
}  

public static boolean isHeavyApple(Apple apple) {  
  return apple.getWeight() > 150;  
}

다음과 같이 표현 가능
2장과 3장에서 자세히 할 예정

1.3.3 메서드 전달에서 람다로

??

1.4 스트림

스트림api를 이용하면 컬렉션 api와 다른 방식으로 데이터 처리가 가능
스트림의 경우 라이브러리 내부에서 모든 데이터가처리 내부반복

1.4.1 멀티스레딩은 어렵다

멀티스레딩 환경에서 공유 데이터 접근하고 갱신하는 경우 의도치 않은 결과를 초래할 수 있음
![[Pasted image 20230709235608.png]]

스트림api를 통해서 컬렉션 처리하면서 발생하는 문제들을 해결

반복되는 패턴 등 필터링 , 데이터 추출, 그룹화
처리할 데이터를 앞뒤로 나누어 각자 처리하고 나중에 합침
![[Pasted image 20230709235635.png]]

참고

1.5 디폴트 메서드와 자바 모듈

디폴트 메서드 : 인터페이스를 쉽게 바꿀 수 있음

728x90

'Programing > Java' 카테고리의 다른 글

[Java] 동작 파라미터화  (0) 2023.08.05
JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가  (0) 2022.09.13
CH10 날짜와 시간 & 형식화  (0) 2021.05.16
ch9 java api  (0) 2021.05.09
ch 8 알고리즘  (0) 2021.04.18