자바는 왜 JVM을 만들었을까?
JVM이 없었다면 OS버전마다 배포되는 설치파일을 따로 필요했다. JVM은 각 OS플랫폼에 맞는 중재자역할을 한다. 프로그래머는 OS에 맞는 JVM을 설치하면 각 플랫폼에 맞는 JVM이 프로그램 구동을 도와준다.
기본적인 프로그램이 메모리를 사용하는 방식으로 크게 아래 구조로 사용한다.
main메서드가 실행되기 전 메모리에서 어떤일이 발생할까?
public class Start {
public static void main(String[] args) {
System.out.println("hello oop!");
}
}
위의 메소드가 실행 되면 메모리 상에는 큰 변화는 없다. 실제 코드를 실행 하는 코드 실행 영역에서 별도 처리가 있기 때문
변수와 메모리
public class Start2 {
public static void main(String[] args) {
int i;
i = 10;
double d = 20.0;
}
}
main()가 들어있는 stack 영역만 그려보면
| d | 20.0 |
|---|---|
| i | 10 |
| 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에 의해 변수 생명 주기를 종료한다.
외부 스택 프레임에서 내부 스택 프레임에 접근하는것은 불가능하다.
운영체제란?
실행할 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 프로그램
항상 컴퓨터가 부팅될 때 메모리 내 커널영역에 따로 적재되어 실행된다.
커널영역을 제외한 나머지영역을 사용자가 이용하는 사용자 영역이라 칭한다.
운영체는 커널 영역에서 실행되고 사용자 영역에 적재된 프로그램들에게 자원을 할당하고 실행되도록 돕는다.
응용 프로그램이 직접 자원에 접근하지 못하도록 운영체제에게 요청하고 운영체제가 대신 작업을 처리해준다. 이러한 방식은 이중모드로써 구현된다.
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)