Java 컴파일 과정 | 👨🏻‍💻 Tech Interview

마지막 업데이트: 2022년 7월 8일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
  1. 삭제할 Node의 오른쪽 자식 중, 가장 작은 값을 삭제할 Node의 Parent Node가 가리키도록 한다.
  2. 삭제할 Node의 왼쪽 자식 중, 가장 큰 값을 삭제할 Node의 Parent Node가 가리키도록 한다.

2.3.5. 바이너리(로컬) 소스

로컬 파일 시스템의 콘텐츠를 빌더로 스트리밍하는 것을 Binary 빌드라고 합니다. 이러한 빌드의 경우 BuildConfig.spec.source.type 의 해당 값이 Binary 입니다.

이 소스 유형은 oc start-build 를 사용할 때만 활용하므로 고유합니다.

바이너리 유형 빌드에서는 로컬 파일 시스템의 콘텐츠를 스트리밍해야 하므로 이미지 변경 트리거와 같이 바이너리 유형 빌드를 자동으로 트리거할 수 없습니다. 바이너리 파일을 제공할 수 없기 때문입니다. 마찬가지로 웹 콘솔에서 바이너리 유형 빌드를 시작할 수 없습니다.

바이너리 빌드를 사용하려면 다음 옵션 중 하나를 사용하여 oc start-build 를 호출합니다.

  • --from-file : 지정한 파일의 콘텐츠가 빌더에 바이너리 스트림으로 전송됩니다. 파일에 URL을 지정할 수도 있습니다. 그러면 빌더에서 빌드 컨텍스트 상단에 있는 것과 동일한 이름으로 파일에 데이터를 저장합니다.
  • --from-dir 및 --from-repo : 콘텐츠가 보관되고 빌더에 바이너리 스트림으로 전송됩니다. 그러면 빌더가 빌드 컨텍스트 디렉터리 내에서 아카이브 콘텐츠를 추출합니다. --from-dir 을 사용하면 추출된 아카이브에 URL을 지정할 수도 있습니다.
  • --from-archive : 지정하는 아카이브가 빌더로 전송되며 빌드 컨텍스트 디렉터리 내에서 추출됩니다. 이 옵션은 --from-dir 과 동일하게 작동합니다. 이러한 옵션에 대한 인수가 디렉터리인 경우 먼저 호스트에서 아카이브가 생성됩니다.

위에 나열된 각 사례에서 다음을 수행합니다.

  • BuildConfig 에 이미 Binary 소스 유형이 정의되어 있는 경우 효과적으로 무시되고 클라이언트에서 전송하는 내용으로 교체됩니다.
  • BuildConfig 에 Git 소스 유형이 정의되어 있는 경우 Binary 및 Git 을 함께 사용할 수 없으므로 해당 BuildConfig가 동적으로 비활성화되고 빌더에 제공하는 바이너리 스트림의 데이터에 우선순위가 지정됩니다.

HTTP 또는 HTTPS 스키마를 사용하여 파일 이름 대신 URL을 --from-file 및 --from-archive 로 전달할 수 있습니다. URL과 함께 --from-file 을 사용하는 경우 빌더 이미지의 파일 이름은 웹 서버에서 전송한 Content-Disposition 헤더 또는 헤더가 없는 경우 URL 경로의 마지막 구성 요소에 따라 결정됩니다. 지원되는 인증 형식이 없는 경우 사용자 정의 TLS 인증서를 사용하거나 인증서 검증 작업을 비활성화할 수 없습니다.

oc new-build --binary=true 를 사용하면 명령에서 바이너리 빌드와 Java 컴파일 과정 | 👨🏻‍💻 Tech Interview 관련된 제한을 적용합니다. 생성된 BuildConfig 의 소스 유형이 Binary 이므로 이 BuildConfig 로 빌드를 실행하는 유일한 방법은 --from 옵션 중 하나와 함께 oc start-build 를 사용하여 필수 바이너리 데이터를 제공하는 것입니다.

Dockerfile 및 contextDir 소스 옵션에는 바이너리 빌드에서 특별한 의미가 있습니다.

Dockerfile은 바이너리 빌드 소스와 함께 사용할 수 있습니다. Dockerfile을 사용하고 바이너리 스트림이 아카이브인 경우 해당 콘텐츠는 아카이브의 모든 Dockerfile에 대한 대체 Dockerfile 역할을 합니다. Dockerfile을 --from-file 인수와 함께 사용하고 파일 인수의 이름이 Dockerfile인 경우 Dockerfile의 값이 바이너리 스트림의 값을 대체합니다.

추출된 아카이브 콘텐츠를 캡슐화하는 바이너리 스트림의 경우 contextDir 필드의 값이 아카이브 내 하위 디렉터리로 해석되고, 유효한 경우 빌드를 실행하기 전에 빌더가 해당 하위 디렉터리로 변경됩니다.

# [Java] 컴파일 과정

자바는 OS에 독립적인 특징을 가지고 있다. 그게 가능한 이유는 JVM(Java Vitual Machine) 덕분이다. 그렇다면 JVM(Java Vitual Machine)의 어떠한 기능 때문에, OS에 독립적으로 실행시킬 수 있는지 자바 컴파일 과정을 통해 알아보도록 하자.


# 자바 컴파일 순서

개발자가 자바 소스코드(.java)를 작성합니다.

자바 컴파일러(Java Compiler)가 자바 소스파일을 컴파일합니다. 이때 나오는 파일은 자바 바이트 코드(.class)파일로 아직 컴퓨터가 읽을 수 없는 자바 가상 머신이 이해할 수 있는 코드입니다. 바이트 코드의 각 명령어는 1바이트 크기의 Opcode와 추가 피연산자로 이루어져 있습니다.

컴파일된 바이크 코드를 JVM의 클래스로더(Class Loader)에게 전달합니다.

클래스 로더는 동적로딩(Dynamic Loading)을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역(Runtime Data area), 즉 JVM의 메모리에 올립니다.

# 클래스 로더 세부 동작

로드 : 클래스 파일을 가져와서 JVM의 메모리에 로드합니다.

검증 : 자바 언어 명세(Java Language Specification) 및 JVM 명세에 명시된 대로 구성되어 있는지 검사합니다.

준비 : 클래스가 필요로 하는 메모리를 할당합니다. (필드, 메서드, 인터페이스 등등)

분석 : 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경합니다.

초기화 : 클래스 변수들을 적절한 값으로 초기화합니다. (static 필드)

실행엔진(Execution Engine)은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 Java 컴파일 과정 | 👨🏻‍💻 Tech Interview 실행합니다. 이때, 실행 엔진은 두가지 방식으로 변경합니다.

인터프리터 : 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행합니다. 하나하나의 실행은 빠르나, 전체적인 실행 속도가 느리다는 단점을 가집니다.

JIT 컴파일러(Just-In-Time Compiler) : 인터프리터의 단점을 보완하기 위해 도입된 방식으로 바이트 코드 전체를 컴파일하여 바이너리 코드로 변경하고 이후에는 해당 메서드를 더이상 인터프리팅 하지 않고, 바이너리 코드로 직접 실행하는 방식입니다. 하나씩 인터프리팅하여 실행하는 것이 아니라 바이트 코드 전체가 컴파일된 바이너리 코드를 실행하는 것이기 때문에 전체적인 실행속도는 인터프리팅 방식보다 빠릅니다.

엑셀 파일 크기 줄이기, 모든 해결방법 총정리 :: 엑셀 위키

이번 포스트에서는 기존 24.1MB 파일을 최대 2.63MB 까지, 약 90% 가량, 파일 크기를 줄일 수 있는 ;엑셀 파일 크기 줄이기 모든 방법'을 단계별로 알아봅니다.

엑셀 파일 크기 줄이기

엑셀 파일크기 줄이기 모든 방법을 단계별로 알아봅니다.

엑셀 파일크기 줄이기 모든 방법 알아보기

1. 파일을 바이너리 형식으로 변경하기

엑셀 파일을 기존 형식(*.xls, *.xlsx 또는 *.xlsm(매크로 포함시)) 에서 바이너리 형식(*.xlsb) 로 변경시 최소 10% ~ 최대 35% 까지 파일 용량을 줄일 수 있습니다.

기존 엑셀 파일은 데이터를 XML 형태로 관리하는 반면, 바이너리 포맷은 바이너리형식(*.bin) 으로 저장 합니다. 따라서 바이너리 형식을 사용할시, 기존 엑셀형식 대비 아래의 장/단점이 있습니다.

바이너리 파일 사용시 좋은점
  • 가장 쉽고 빠른 엑셀 파일 크기 줄이기 방법입니다. 파일 또한 별도의 파일로 저장되므로, 기존 엑셀파일은 그대로 유지 되며, 문제가 있을 경우에도 쉽게 복구가 가능합니다.
  • 바이너리 파일 포맷(*.bin)은 기존 엑셀포맷(*.xml)보다 큰 용량의 파일에서 더욱 빠르게 동작 합니다. 다만 보편적으로 사용되는 파일 용량에서는 두 형식모두 빠르게 동작합니다.
  • 매크로 포함 파일(*.xlsm) 또한 모든 매크로를 유지 한 채 파일 용량을 줄일 수 있습니다.
바이너리 파일 사용시 주의사항
  • XML 파일 포맷은 사용하는데에 저작권이 필요하지않아, 다양한 외부 프로그램에서 작업이 가능합니다. 반면, 바이너리 파일 포맷은(*bin) 파일 사용시 저작권이 필요하므로 엑셀 이외의 외부 프로그램과 함께 사용할 경우 주의가 필요 합니다.
  • 바이너리 파일포맷은 파워쿼리/파워피벗 기능을 미지원 합니다.
  • 바이너리 파일포맷은 파일의 매크로 포함여부를 파일 실행전까지 알 수 없으므로, 모르는 Java 컴파일 과정 | 👨🏻‍💻 Tech Interview 파일의 경우 실행시 주의가 필요 합니다.
바이너리 파일형식으로 변경하는 방법
2. 사용하지 않는 워크시트, 또는 숨겨진 시트 삭제하기

파일을 여러 버전으로 나눠 관리할경우, '수정전', '작업중', '최종' 등의 여러 시트로 나눠 단계별로 작업하게 됩니다. 그럴경우, 최종 버전의 시트만 남기고 그 외 불필요한 시트를 제거함으로써 엑셀 파일 크기를 절약 할 수 있습니다.

  1. 엑셀 파일의 아무 시트나 우클릭한 뒤, '숨기기 취소' 를 클릭하여 숨겨진 시트가 있는지 확인 합니다.(만약 '숨기기 취소'가 비활성화 되어 있으면, 숨겨진 시트가 없다는 것이므로 다음단계로 이동합니다.)
3. 불필요한 함수 제거하기

파일 작성이 완료되었고, 최종본으로 파일을 공유할 경우 불필요한 함수를 제거하여 파일 크기를 절약 할 수 있습니다.

  1. 시트에 불필요한 Java 컴파일 과정 | 👨🏻‍💻 Tech Interview 수식이 들어가 있는지 확인 합니다. 화면 상단의 [수식] - [수식표시]를 클릭 하거나 단축키 Ctrl + ' (키보드 상단 숫자 '1'의 왼쪽키)를 누르면 시트에 입력된 수식을 모두 표시합니다.
4. 고화질 이미지 압축하기

인터넷에서 다운받은 고화질의 그림파일을 이미지압축 없이 그대로 엑셀 파일에 삽입 할 경우, 엑셀 파일 용량이 급격히 커지는 문제가 발생합니다. 따라서, 고화질의 이미지를 엑셀 파일에 삽입해야 할 경우 TinyPNG 와 같은 무료 온라인 이미지 압축 툴을 사용하거나, 엑셀에서 자체적으로 이미지 파일을 압축 할 수 있습니다.

그림파일의 품질을 유지한 채로 압축해야 할 경우, TinyPNG 사용을 권장합니다.

  1. 압축할 그림을 선택한 뒤, '그림서식' - '그림 압축' 으로 이동 합니다.
5. 불필요한 범위 찾아 제거하기

문서를 작성하다보면, 사용자의 실수로 인하여 불필요한 셀 또는 범위가 입력 될 때가 있습니다. 그럴경우 불필요한 셀을 찾아 제거 하면 엑셀 파일 용량을 줄이고 동작속도를 향상시킬 수 있습니다.

  1. 화면에서 Ctrl + End 키를 입력합니다. 시트에서 마지막으로 사용된 셀로 이동 합니다. 화면에서는 보이지 않았지만 사용자의 실수로 시트 끝부분에 오탈자가 입력된 것을 확인할 수 있습니다.
6. 피벗테이블의 피벗캐시 또는 원본데이터 제거하기

만약 대용량의 데이터를 사용중이고, 피벗테이블로 보고서를 작성중이라면 파일크기를 줄이기 위해 '피벗캐시' 또는 '원본데이터'를 제거 할 수 있습니다.

피벗테이블을 생성하게 되면 (*화면에는 보이지 않는) '피벗캐시'라는 데이터 복제본이 생성 되어 피벗테이블과 연결되며, 피벗테이블은 '원본데이터' 대신 피벗캐시에서 데이터를 읽어오게 되는데요. 즉, 피벗테이블을 생성하면 '피벗캐시'와 '원본데이터' 라는 2개의 중복된 데이터가 생성 됩니다.

피벗캐시 설명

피벗테이블을 생성하면 '피벗캐시'라는 임시데이터가 같이 생성됩니다.

'피벗캐시'는 슬라이서의 '보고서연결' 기능과 같이 피벗테이블이 빠르고 효율적으로 동작할 수 있도록 도와주지만, 만약 해당 파일이 완성된 보고서이고 이후에 많은 피벗테이블 편집이 일어나지 않을 경우 , 피벗캐시나 원본데이터를 제거함으로써 파일크기를 대폭 줄일 수 있습니다.

피벗캐시를 제거하는 방법

피벗캐시를 제거하면 원본데이터를 유지한 채 파일 크기를 손쉽게 줄일 수 있습니다. 단, 피벗캐시를 제거할 경우 반드시 '파일을 열 때 데이터 새로고침'에 같이 체크 해주어야 하며, 그렇지 않을 경우 파일 재실행 시, '피벗테이블 보고서를 업데이트 하려면 [데이터 새로고침] 명령을 사용하십시오' 라는 오류문구가 출력됩니다.

피벗테이블 데이터 새로고침 오류 문구

'파일을 열 때 데이터 새로고침' 을 체크하지 않을 경우 오류메세지가 출력됩니다.

  1. 피벗테이블을 우클릭 한 뒤, [피벗테이블 옵션]으로 이동 합니다.
피벗테이블 원본데이터를 제거하는 방법

피벗테이블의 원본데이터를 제거하면 피벗캐시를 제거하는 것보다 더욱 많은 파일 용량을 줄일 수 있습니다. 단, 원본데이터를 제거할 경우 더 이상 피벗테이블의 수정이 불가능해지므로 반드시 '백업파일'을 따로 저장 하도록 합니다.

이상으로 엑셀 파일 크기 줄이기 모든 방법 을 하나씩 알아봤습니다. (마지막 업데이트: 2020년 3월 7일)

바이너리의 단점

  • Node: 트리에서 데이터를 저장하는 기본 요소 (데이터와 다른 연결된 노드에 대한 Branch 정보 포함)
  • Root Node: Java 컴파일 과정 | 👨🏻‍💻 Tech Interview 트리 맨 위에 있는 노드
  • Level: 최상위 노드를 Level 0으로 하였을 때, 하위 Branch로 연결된 노드의 깊이를 나타냄
  • Parent Node: 어떤 노드의 다음 레벨에 연결된 노드
  • Child Node: 어떤 노드의 상위 레벨에 연결된 노드
  • Leaf Node (Terminal Node): Child Node가 하나도 없는 노드
  • Sibling (Brother Node): 동일한 Parent Node를 가진 노드
  • Depth: 트리에서 Node가 가질 수 있는 최대 Level

3. 이진 트리와 이진 탐색 트리 (Binary Search Tree)

  • 이진 트리: 노드의 최대 Branch가 2인 트리
  • 이진 탐색 트리 (Binary Search Tree, BST): 이진 트리에 다음과 같은 추가적인 조건이 있는 트리
    • 왼쪽 노드는 해당 노드보다 작은 값, 오른쪽 노드는 해당 노드보다 큰 값을 가지고 있음!

    4. 자료 구조 이진 탐색 트리의 장점과 주요 용도

    • 주요 용도: 데이터 검색(탐색)
    • 장점: 탐색 속도를 개선할 수 있음

    단점은 이진 탐색 트리 알고리즘 이해 후에 살펴보기로 함

    이진트리와 정렬된 배열간의 탐색 비교

    • 매우 복잡함. 경우를 나누어서 이해하는 것이 좋음

    5.4.1. Leaf Node 삭제

    5.4.2. Child Node 가 하나인 Node 삭제

    5.4.3. Child Node 가 두 개인 Node 삭제

    1. 삭제할 Node의 오른쪽 자식 중, 가장 작은 값을 삭제할 Node의 Parent Node가 가리키도록 한다.
    2. 삭제할 Node의 왼쪽 자식 중, 가장 큰 값을 삭제할 Node의 Parent Node가 가리키도록 한다.

    5.4.3.1. 삭제할 Node의 오른쪽 자식중, 가장 작은 값을 삭제할 Node의 Parent Node가 가리키게 할 경우

    • 삭제할 Node의 오른쪽 자식 선택
    • 오른쪽 자식의 가장 왼쪽에 있는 Node를 Java 컴파일 과정 | 👨🏻‍💻 Tech Interview 선택
    • 해당 Node를 삭제할 Node의 Parent Node의 왼쪽 Branch가 가리키게 함
    • 해당 Node의 왼쪽 Branch가 삭제할 Node의 왼쪽 Child Node를 가리키게 함
    • 해당 Node의 오른쪽 Branch가 삭제할 Node의 오른쪽 Child Node를 가리키게 함
    • 만약 해당 Node가 오른쪽 Child Node를 가지고 있었을 경우에는, 해당 Node의 본래 Parent Node의 왼쪽 Branch가 해당 오른쪽 Child Node를 가리키게 함

    5.5.2. Case1: 삭제할 Node가 Leaf Node인 경우

    5.5.2. Case2: 삭제할 Node가 Child Node를 한 개 가지고 있을 경우

    5.5.3. Case3-1: 삭제할 Node가 Child Node를 두 개 가지고 있을 경우 (삭제할 Node가 Parent Node 왼쪽에 있을 때)

    • 기본 사용 가능 전략
      1. 삭제할 Node의 오른쪽 자식 중, 가장 작은 값을 삭제할 Node의 Parent Node가 가리키도록 한다.
      2. 삭제할 Node의 왼쪽 자식 중, 가장 큰 값을 삭제할 Node의 Parent Node가 가리키도록 한다.
    • 기본 사용 가능 전략 중, 1번 전략을 사용하여 코드를 구현하기로 함
      • 경우의 수가 Java 컴파일 과정 | 👨🏻‍💻 Tech Interview 또다시 두가지가 있음
        • Case3-1-1: 삭제할 Node가 Parent Node의 왼쪽에 있고, 삭제할 Node의 오른쪽 자식 중, 가장 작은 값을 가진 Node의 Child Node가 없을 때
        • Case3-1-2: 삭제할 Node가 Parent Node의 왼쪽에 있고, 삭제할 Node의 오른쪽 자식 중, 가장 작은 값을 가진 Node의 오른쪽에 Child Node가 있을 때
          • 가장 작은 값을 가진 Node의 Child Node가 왼쪽에 있을 경우는 없음, 왜냐하면 왼쪽 Node가 있다는 것은 해당 Node보다 더 작은 값을 가진 Node가 있다는 뜻이기 때문임

          5.5.4. Case3-2: 삭제할 Node가 Child Node를 두 개 가지고 있을 경우 (삭제할 Node가 Parent Node 오른쪽에 있을 때)

          • 기본 사용 가능 전략
            1. 삭제할 Node의 오른쪽 자식 중, 가장 작은 값을 삭제할 Node의 Parent Node가 가리키도록 한다.
            2. 삭제할 Node의 왼쪽 자식 중, 가장 큰 값을 삭제할 Node의 Parent Node가 가리키도록 한다.
          • 기본 사용 가능 전략 중, 1번 전략을 사용하여 코드를 구현하기로 함
            • 경우의 수가 또다시 두가지가 있음
              • Case3-2-1: 삭제할 Node가 Parent Node의 오른쪽에 있고, 삭제할 Node의 오른쪽 자식 중, 가장 작은 값을 가진 Java 컴파일 과정 | 👨🏻‍💻 Tech Interview Java 컴파일 과정 | 👨🏻‍💻 Tech Interview Node의 Child Node가 없을 때
              • Case3-2-2: 삭제할 Node가 Parent Node의 오른쪽에 있고, 삭제할 Node의 오른쪽 자식 중, 가장 작은 값을 가진 Node의 오른쪽에 Child Node가 있을 때
                • 가장 작은 값을 가진 Node의 Child Node가 왼쪽에 있을 경우는 없음, 왜냐하면 왼쪽 Node가 있다는 것은 해당 Node보다 더 작은 값을 가진 Node가 있다는 뜻이기 때문임6. 이진 탐색 트리의 시간 복잡도와 단점

                • depth (트리의 높이) 를 h라고 표기한다면, O(h)
                • n개의 노드를 가진다면, ℎ = 𝑙 𝑜 𝑔 2 𝑛 h=log2n 에 가까우므로, 시간 복잡도는 𝑂 ( 𝑙 𝑜 𝑔 𝑛 ) O(logn)
                  • 참고: 빅오 표기법에서 𝑙 𝑜 𝑔 𝑛 logn 에서의 log의 밑은 10이 아니라, 2입니다.
                    • 한번 실행시마다, 50%의 실행할 수도 있는 명령을 제거한다는 의미. 즉 50%의 실행시간을 단축시킬 수 있다는 것을 의미함


0 개 댓글

답장을 남겨주세요