[F-lab 모각코 챌린지 43일차]TIL

JeongheeKim·2023년 7월 13일

TIL

목록 보기
43/66

학습계획


  • 스프링 입문을 위한 자바객체지향의 원리와 이해 1장,2장 학습
  • 운영체제 정의
  • 이중모드

Today I Learned


자바는 왜 JVM을 만들었을까?

JVM이 없었다면 OS버전마다 배포되는 설치파일을 따로 필요했다. JVM은 각 OS플랫폼에 맞는 중재자역할을 한다. 프로그래머는 OS에 맞는 JVM을 설치하면 각 플랫폼에 맞는 JVM이 프로그램 구동을 도와준다.

기본적인 프로그램이 메모리를 사용하는 방식으로 크게 아래 구조로 사용한다.

  • 코드 실행영역
  • 데이터 저장 영역
    • static영역
    • stack영역
    • heap영역

main메서드가 실행되기 전 메모리에서 어떤일이 발생할까?

public class Start {
	public static void main(String[] args) {
		System.out.println("hello oop!");
	}
}
  1. JRE는 프로그램 코드안에 main()가 있는지 확인한다.
  2. main()가 있는지 확인하면 JVM을 부팅 시켜 목적파일을 실행한다.
  3. JVM은 목적파일 실행 전에 전처리를 한다.
    1. 자바프로그램에서 반드시 포함하는 java.lang패키지를 static영역에 올린다.
    2. mian()이 호출되도록 stack 프레임에 할당된다.
      1. 메소드가 stack 프레임에 할당되는 기준은 중괄호로 메소드를 정의한 범위
      2. 단, main()가 시작되는 중괄호에 스택프레임이 생성되고 닫히는 중괄호에 stack프레임이 제거된다.
    3. 메서드의 매개변수를 stack프레임의 가장 아래에 저장한다.
  4. main()은 프로그램의 시작이자 끝을 알리기도 한다. main()가 끝나면 JRE는 JVM을 종료하고 JRE자체도 운영체제 메모리에서 사라진다.

위의 메소드가 실행 되면 메모리 상에는 큰 변화는 없다. 실제 코드를 실행 하는 코드 실행 영역에서 별도 처리가 있기 때문

변수와 메모리

public class Start2 {
	public static void main(String[] args) {
		int i;
		i = 10;

		double d = 20.0;
	}
}

main()가 들어있는 stack 영역만 그려보면

d20.0
i10
args

블록 구문과 메모리: 블록 스택 프레임

main 메서드에 if 조건문이 존재 시 메인 스택 프레임에 중첩으로 if 스택 프레임이 생성된다.

public class Start3 {
	public static void main(String[] args) {
		int i = 10;
		int k = 20;

		if(i==10) {
			int m = k + 5;
			k = m;
	} else {
		int p = k + 10;
		k = p;
	}
	
	//k = m+p;
}

if문이 종료되면 m변수가 스택 프레임에서 삭제된다. 변수 m은 지역변수 이므로 스택 프레임안에서 생명주기를 갖는다. 주석을 풀게되면 m 변수는 삭제되어 컴파일 오류가 난다.

static변수(클래스 변수)는 static영역에 자리 잡으면 JVM이 종료될때까지 static영역에 존재
객체 멤버변수는 heap에서 생명주기를 갖으며 GC에 의해 변수 생명 주기를 종료한다.

외부 스택 프레임에서 내부 스택 프레임에 접근하는것은 불가능하다.


운영체제란?

실행할 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 프로그램

항상 컴퓨터가 부팅될 때 메모리 내 커널영역에 따로 적재되어 실행된다.

커널영역을 제외한 나머지영역을 사용자가 이용하는 사용자 영역이라 칭한다.

운영체는 커널 영역에서 실행되고 사용자 영역에 적재된 프로그램들에게 자원을 할당하고 실행되도록 돕는다.

  • 시스템 자원 프로그램에 실행에 필요한 요소
  • 커널
    • 운영체제에 포함되어 응용프로그램과 하드웨어의 연결 담당

응용 프로그램이 직접 자원에 접근하지 못하도록 운영체제에게 요청하고 운영체제가 대신 작업을 처리해준다. 이러한 방식은 이중모드로써 구현된다.

  • 이중모드(dual mode)
    • CPU가 명령어를 실행하는 모드
      • 사용자 모드
        • 운영체제 서비스를 제공받을 수 없는 실행 모드 = 커널영역의 코드를 실행 불가
        • 보통의 응용프로그램이 사용자 모드로 실행됨
      • 커널 모드


def solution(s):
    data = s[2:-2].split(("},{"))
    answer =[]
    data.sort(key = len)
    for item in data:
        it = item.split(",")
        for i in it:
            if int(i) not in answer:
                answer.append(int(i))
    return answer
    

배열에 이쓴 값을 검사하기 위해 배열의 모든 존재를 검사하므로 O(n제곱) 발생
검색 비용을 줄이기 위해 딕셔너리 자료구조(딕셔너리는 자료 검색 시간복잡도가 O(1)이므로) 사용

    data = s[2:-2].split(("},{"))
    answer = {}
    data.sort(key = len)
    for item in data:
        it = item.split(",")
        for i in it:
            num = int(i)
            if num not in answer:
                answer[num] = 1
    return list(answer)

0개의 댓글