23.01.29 WIL

Kuno17·2023년 1월 30일
0

TIL/WIL

목록 보기
12/38
post-thumbnail

학습

객체지향 개념과 컬렉션 프레임워크 그리고 JVM에 대한 공부.
프로그래머스 알고리즘 문제 Lv0 , LV1 풀이.

객체지향 개념

상당히 설명하기 쉽지않은 영역이나 공부한 내용을 정리하면 다음과 같다.
노션 정리
https://kuno17.notion.site/4-e784932750744520898cf5af42673624

JVM ,JDK , JRE

JDK : Java Development Kit / 자바 개발 도구
JRE : Java Runtime Environment / 자바 실행 환경
JVM : Java Virtual Machine / 자바 가상 기계


자바의 호환성

Java는 Write Once Use Anywhere 이라는 목적을 가진다.
즉 "소스파일을 하나만 작성하면 어디에서든지 사용이 가능하다!"

Java를 사용하여 기계의 기종별 즉, 운영체제에 구애받지 않고 개발을 할 수 있게 되었다.
Java의 목적파일은 반기계어인 바이트코드(.class)인데 이는 운영체제가 아니라 JVM에서 사용
소스코드를 바이트 코드로 컴파일 해주는게 자바 컴파일러(javac)

Compile 언어와 Interpreter 언어

Compile 언어

  • 소스파일 전체를 컴파일 한 후 기계어를 CPU와 메모리를 통해 읽어서 바로 실행하는 언어
  • 종류 : C,C++,JAVA,C#
  • 특징
    - 소스파일 클기가 크면 컴파일이 오래걸린다.
    - 컴파일된 후에 기계어로 바로 실행 → 속도 빠르다.
    -Java는 javac에 의해 바이트코드로 컴파일 되지만 JVM에서는 인터프리터로 실행됩니다. 그러므로 Compile 언어이지만, Interpreter 언어의 특징을 동시에 가집니다.

Interpreter 언어

  • 소스파일을 컴파일하지 않고서 Interpreter를 사용하여 소스파일을 한줄 씩 번역하면서 실행하는 방식의 언어
  • 종류 : Javascript , Ruby, Python 등
  • 특징
    - 컴파일 언어처럼 별도의 목적파일이 존재하지 않는다.
    - 컴파일 과정 없이 바로 실행되기 때문에 수정 및 디버깅시 유리함.
    - Interpreter 만 존재하면 어디서든지 실행이 가능하기 때문에 자유롭고 독립적.
    - 실시간으로 번역 되면서 실행되기 때문에 실행 속도가 느리다.

JVM (Java Virtual Machine)

  • Java 프로그램이 실행되는 가상 컴퓨터'

  • 매우 복잡한 구조를 가진다. 그중 Runtime Data Area를 정리.

  • JVM이 프로그램을 수행하기 위해 OS로 부터 할당받는 메모리 영역.

  • JVM stack(Thread별로 1개씩 존재)
    - Thread의 Method가 호출될 때 수행 정보(메서드 호출 주소, 매개변서,지역변수, 연산 스택)가 Frame단위로 JVM stack에 저장, 메서드 호출 종료시 stack에서 제거.

Heap 영역(모든Thread가 공유)

흔히 코드에서 'new'명령어로 생성된 인스턴스 변수가 놓이는 곳.
스택영역에 저장되는 로컬변수(lv),매개변수와 달리 힙영역에서 보관되는 메모리는 메소드 호출이 끝나도 주소를 일어버려서 Garbage Collector가 지워버리기 전까지는 삭제되지 않는다
인스턴스와 배열이 동적으로 생성되는 공간.
그리고 Garbage Collection의 대상이 되는 영역.
모든 Thread가 공유하기 때문에 동기화 문제가 발생할 수 있다.

Heap의 구성

Java 8 이후

  • 수정될 필요가 있는 데이터(static Object나 상수화된 String Object)
  • 수정될 필요가 없는 데이터(class, method 등의 메타데이터)
    수정될 필요가 있는 데이터는 Heap으로 옮겨 최대한 GC의 대상이
    되도록 했고 수정될 필요가 없는 데이터는 OS가 Native Memory에서
    직접 관리하도록 위임했다.

Garbage Collector

  • Java 객체의 2가지 특징으로 인해 객체의 생명주기를 직접 관리해서
    불필요한 객체를 메모리에서 해제시키도록 하는 개념(GC)이 등장하게 되었다.
    첫번째 특징은 대부분의 객체는 금방 접근 불가능 상태(unreachable)가 되는 것이다.
    두번째 특징은 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다는 것이다.
    이 2가지 특징이 GC를 탄생시켰다.

  • Heap의 인스턴스 중 Thead의 JVM stack에서 도달할 수 없는 것들(Unreachable)이
    GC의 대상. 중요한건, 도달할 수 없는 것들을 pick 하는 것이 아니라 도달할 수 있는
    것들을 pick한 후 나머지들을 메모리에서 제거한다.
    이 방식을 Mark and Sweep 이라고 한다.

후기

JVM과 Heap Area에 대해서 간략히 알아보았으나 그조차 방대해 보인다...
끝없는 자바의 세계가 있는것 같다. 자세한 내용과 과정들은 이후 다시한번 정리해야겠다.

객체지향 개념의 경우는 분량이 상당한 부분도 없지않아 있지만 내가 이개념을 확실히 이해했는지에 대한 검증방법을 아직 잘 모르겠다.. 코드들 작성하면서 알아가는 방법 밖에 없을것 같다.

이후에 나오는 다형성과 추상클래스 그리고 인터페이스까지 모두 내용을 확인해야 했기때문에 빠듯한 1주일을 보낼 수 있엇던것 같다. 이제 배운 내용을 기반으로 알고리즘과 실제 프로그램을 일부분 만들어 보면서 연습해야 할 것 같다.

profile
자바 스터디 정리 - 하단 홈 버튼 참조.

0개의 댓글