com.eomcs.lang.ex07

메서드 호출과 JVM Stack 메모리 영역

파라미터도 로컬 변수
메서드가 호출될 때 만들어진다.
메서드 호출이 끝나면 사라진다.

내부적으로 사용하는 로컬 변수 목록
내부적으로 배열로 다룬다.

메서드 호출이 끝나면 그 메서드가 사용한 메모리는 사라진다.
m2 메모리 사라짐

스스로 그림으로 그릴 줄 알아야 됨

밑에서 위로 쌓인다
최근에 호출된 메소드가 위로 간다
후입선출
선입후출

스택 방식을 "Last In First Out(LIFO;후입선출, FILO:선입후출)"라 부른다.

컴파일 하지 않고 다이렉트로 클래스 파일 만드는 거 해 볼 거임

sublime 다운로드 받기

https://www.sublimetext.com/3

이 파일은 자바 클래스 파일이다.

public class Test {
  public static void main(String[] args) {
  }
}

이게 최소 버전

하위 버전에서 상위 저번을 읽어들이면 안 됨

cafe babe 이건 자바 클래스가 맞아
major_version을 봤는데 3d
당신이 갖고 있는 클래스 파일은 현재 JVM과 맞지 않습니다
하위 버전에서 상위 버전을 실행할 수 없습니다

hello world bytecode 검색

https://medium.com/@davethomas_9528/writing-hello-world-in-java-byte-code-34f75428e0ad

중간에 공백 넣으면 알아서 공백 날아감

javap HelloWorld.class

javap ← 자바 프로파일러
클래스 파일 안을 들여다본다

명세서에 나와 있는 대로 코드값을 줘야

기계어 코드도 바이트로 되어 있다
기계어 코드를 직접 작성하려면 기계어 코드 명세서를 보고 작성해야 된다
컴파일러의 도움을 받는다

07 00 02 → 클래스 이름은 두 번째에 있지~~~
01 00 0a 48 65 6c 6c 6f 57 6f 72 6c 64

16자

javap -verbose HelloWorld.class

atmega128 instruction set summary 검색

https://ww1.microchip.com/downloads/en/DeviceDoc/AVR-Instruction-Set-Manual-DS40002198A.pdf

Assembly Language와 기계어

어셈블리어
실제 기계어로 직접 코딩하는 사람 없음
암기하기 힘드니까 기계어에 흡사한 어셈블리 명령어
화면에 출력할 때 그나마 알아먹기 좋음
기계어마다 CPU마다 다름
문서 보고 작성하는 게 힘드니까 어셈블리어 언어라는 걸 만듦

어셈블리 컴파일러를 사용해서 진짜 기계어로 바꿈

*.asm
*.c

기계에 가까운 Low Level Language
인간에게 가까운 High Level Language

바이트 코드: 가상 기계어. 진짜 기계어는 아님.

https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-6.html#jvms-6.5

intel instruction set

class 파일은 바이트 코드를 그냥 보여주는 게 아니라 가공해서 보여주는 거다.

com.eomcs.lang.ex07.Exam0450.java
메서드 : 스택 메모리 응용 II - 재귀호출

재귀 호출을 다른 함수라고 생각하면 한 번에 끝남

재귀호출과 JVM Stack

다른 메서드 호출한다고 생각하면 됨
다시 안으로 들어가고 다시 안으로 들어가고
거울 안에 거울 안에 거울 안에
그렇게 생각하면 안 됨
메서드 안에서 메서드를 호출하든 관심 없음
로컬변수를 스택 메모리에 만듦
같은 메소드든 다른 메소드든 그런 거 안 따짐

재귀호출
수학식을 손쉽게 구현할 수 있음

sum(5) = 5 + sum(5-1)
sum(n) = n + sum(n-1)

주의!
메서드 호출이 너무 깊어지면 JVM Stack 메모리 부족으로 시스템 오류(StackOverflow)가 발생할 수 있다.

한 번 호출할 때마다 JVM Stack 메모리 크기가 점점 커지니까 더 빨리 메모리가 찬다

반복문은 StackOverflow 안 일어남

반복문으로 쓸 수 있으면

반복문을 사용하는 경우보다 메모리를 많이 사용한다.

호출 단계가 많은 큰 수를 다룰 때는 재귀호출 대신 반복문을 사용하라!

JVM 실행할 때 옵션 붙여주기

시스템 엔지니어가 이런 작업을 한다.
시스템 디벨로퍼가 아니라 시스템 엔지니어

프로그램 아규먼트는 스트링 배열에 담겨서 main()를 호출할 때 넘어온다.
프로그램 아규먼트는 공백을 기준으로 문자열을 잘라서 배열을 만든다.
아규먼트가 없으면 빈 배열이 넘어온다.

Wrapper 클래스의 데이터 변환 함수

byte → Byte 클래스
short → Short 클래스
int → Integer 클래스
long → Long 클래스
float → Float 클래스

com.eomcs.lang.ex07.Exam0610.java
JVM 아규먼트

프로그램 아규먼트는 클래스 뒤에
JVM 아규먼트는 -D 클래스 앞에

$java -cp ./bin/main -D이름=값 -D이름=값 -D이름=값 com.eomcs.lang.ex07.Exam0610

System.getProperty(String) : String 꺼낸 건 문자열

JVM 아규먼트의 특징은 값에 대해서 이름을 부여할 수 있

프로그램 아규먼트는 나열한 순서를 지켜야 하지만

0개의 댓글