TIL ... 2주차 Algorithm day 6 - 22.05.16

BYEONGMIN CHOI·2022년 5월 16일
0

TIL(Today I Learned)

목록 보기
4/24

2주차 알고리즘 3번째 날이다. 알고리즘 문제를 푸는데 있어 조금은 수월해졌지만 개념이 잘 잡혀있지 않아 어떤상황에 어떤 객체를 사용하는지, 어떤 적절한 라이브러리를 사용하여 문제를 풀어야하는지 잘 알지 못한다.

코드를 작성할때 생각해야할 것 \rightarrow 왜 이렇게 쓰는 걸까? 왜 이 메소드를 사용하는거지? 코드가 짧아지면 왜 좋은거지? 등등 많은 이유들을 생각하며 짜야한다는 것을 기억하자.

이번에 알고리즘 문제들을 풀며 의문점을 가졌던 것들을 적어보려한다.


Stream 과 for문의 속도차이

test code

        List<Integer> test = new ArrayList<>(1000000);

        long startTime = System.nanoTime();
        for (int i = 0; i < test.size(); i++) {
            test.set(i, 1);
        }
        long endTime = System.nanoTime();

        System.out.println(String.format("for-loop: %dns", endTime - startTime));

        startTime = System.nanoTime();
        test = test.stream().map(i -> i--).collect(Collectors.toList());
        endTime = System.nanoTime();

        System.out.println(String.format("Stream: %dns", endTime - startTime));
// 첫번째 실행
for-loop: 4553ns
Stream: 6306095ns

// 두번째 실행
for-loop: 3943ns
Stream: 5372920ns

// 세번째 실행
for-loop: 3835ns
Stream: 5323993ns
  • 위의 결과가 매번 다르긴하지만 명확하게 for-loop문이 빠르다는걸 알 수 있었다.

그럼 왜 속도가 차이가 날까?

  • for문은 단순 인덱스 기반
    • for문은 단순 인덱스 기반으로 도는 반복문으로 메모리 접근이기 때문에 Stream에 비해 빠르고 오버헤드도 없다.
    • A for loop through an array is extremely lightweight both in terms of heap and CPU usage. If raw speed and memory thriftiness is a priority, using a stream is worse.
      -> for문은 heap과 cpu 사용에 있어 매우 Stream에 비해 덜 사용한다. 만약 속도와 메모리 절약이 우선순위에 있다면, Stream의 사용은 최악이 될 것 이다.


  • for문은 컴파일러가 최적화를 시킨다.

왜 Stream을 사용하는 가?

  1. 가독성이 좋아진다.
  2. 코드로 작성해야하는 로직을 Stream에서 제공해주는 함수로 간결하게 해결할 수 있다.

참고 사이트 : https://stackoverflow.com/questions/44180101/in-java-what-are-the-advantages-of-streams-over-loops, https://pamyferret.tistory.com/49


자료형

  • Java의 데이터 유형 \rightarrow 8종류의 기본형(primitive type)과 참조형(reference type)으로 구성
  • Java Data Type
    • Primitive Type
      • Boolean Type(boolean)
      • Numeric Type
        • Integer Type
          • Integer Type(short, int, long)
          • Floating Point Type(float, double)
        • Charter Type(char)

    • Reference Type
      • Class Type
        • String Type
        • Wrapper Class
      • Interface Type
      • Array Type
      • Enum Type

기본 자료형 : Primitive Type

  • 기본 자료형은 반드시 사용하기전에 선언되어야 한다.
  • OS에 따라 자료형의 길이가 변하지 않는다.
  • 객체가 아니기 때문에 null을 가질 수 없다.

BigInteger

  • long 타입을 사용을 한다면 가장 큰값은 9223372036854775807이다. 이보다 정말 큰 숫자가 필요하다면 BigInteger을 사용해야 된다.
    BigInteger는 일반적인 오퍼레이터 연산자는 사용할 수 없고, .add(), .subtract(), .multiply(), .divide()메소드가 제공이 되고, 매개변수 또한 BigInteger를 받는다.

참조형 : Reference Type

  • 참조형은 기본형 8종류를 제외한 모든 데이터 유형이고, 기본적으로 java.lang.Object를 상속 받는다.
    참조 유형의 변수는 데이터를 그대로 저장하지 않고 데이터를 저장하는 메모리의 주소만 저장한다. 즉, 참조형의 변수는 데이터를 다른 영역에 저장하고 그 주소만을 이용한다.

참고 사이트 : https://www.devkuma.com/docs/java/data-type/

profile
스스로 성장하는 개발자가 되겠습니다.

0개의 댓글