본문 바로가기
개발자 꿈나무의 하루/01_Boot Camp

(네이버클라우드 부트캠프) 5일차 - Bytecode작성 및 Java실습(class,main())

by kk_naks 2024. 5. 30.

1. Bytecode작성 

  1.1 Sublime 설치

     -16진수 코드 작성을 위해 sublime 설치

  1.2 Bytecode 작성 

     - 참고 레퍼런스 : Java Specification(21 version)
     - Java Class File 구조

     - 기본 구조 작성

Java File: CAFE BABE
Version 8: 0000 0034
Constant Pool Size of ZERO: 0000
Super Public: 0021
Unknown index of class in constant pool: 0000
Unknown index of super class in constant pool: 0000
zero interfaces: 0000
zero fields: 0000
zero methods: 0000zero
attributes: 0000

     - 터미널에서 javap를 실행하면 다음과 같은 결과가 나온다. 

     - 이는 class를 설정 하지 않았다는 의미이다. 

     - class 설정하기 

0003 // 총 3줄의 constant pool(tag 1줄 포함)을 생성 
07 0002 // 07의 코드는 클래스를 의미하고 2바이트 크기의 UTF-8의 할당
01 000a // 01은 UTF-8을 사용한다는 의미이고 0xa는 10개 글자를 할당
48 65 6c 6c 6f 57 6f 72 6c 64 // UTF-8의 아스키 코드 값("HelloWorld")

     - super class생성

     - java에는 root에 해당하는 class를 super class라고 부른다.

0700 04 // class 생성 2바이트(처음 2바이트 + 금번 2바이트)
0100 10 // 16자 UTF-8 입력
6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 // java/lang/Object (super class 의 위치)

 

     - main 함수 생성

static void main(String[] args){
	System.out.println("Hello World");
}

 

     - main 함수를 만들기 위해서는 println의 위치가 필요 : ([Ljava/lang/String;)V. 를 활용하여 메소드 이름과 리턴값을 받는다

     - "Hello World"라는 문자열을 추가 : attribute Code를 통해 UTF-8의 문자열을 받는다.

0700 06
0100 10 6a 61 76 61 2f 6c 61 6e 67 2f 53 79 73 74 65 6d

0700 08
0100 13 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 74 72 65 61 6d

0800 0a
0100 0b 48 65 6c 6c 6f 20 57 6f 72 6c 64

     - out 변수 설정 : 불러온 변수들을 연결 해줘야 한다. 

0900 0500 0c
0c00 0d00 0e
0100 03 6f 75 74
0100 15 4c 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74 53 74 72 65 61 6d 3b

 

     - #11 번지 : #5 -> #6번지의 값을 가져와서 #12 -> #13번지와 연결하고 #14번지와 연결

     - main과 출력하기 연결 

//println과 연결
0a00 0700 10
0c00 1100 12
0100 07 70 72 69 6e 74 6c 6e
0100 15 28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56

// main과 연결
0100 04 6d 61 69 6e
0100 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56
0100 04 43 6f 64 65

 

     - 프로그램 완성하기(기타 변수,스택 설정)

  1.3 결론

     - 하지마라, 걍 java로 소스파일을 만들어라 

 

2. Java실습하기

  2.1 프로그램 언어의 발전과정

     - 단순 명령문 코드를 구조화 하는 방향으로 발전 

     - 명령문 >> 함수 >> 클래스 >> 패키지 >> 모듈


     - C언어 : 여러개의 소스파일 컴파일 하여 오브젝트 파일 생성 >> 링커를 통해 실행 파일 생성

 

  2.2 Java로 컴파일 하기

     - Java 언어 : 하나의 소스파일에서 각 클래스의 파일을 컴파일 하여 각 클래스 파일을 생성 

 
     - 다음 코드를 컴파일 하면 3개의 class파일이 생성된다. 

class A {
}


class B {
}


class C {
}

  2.2 Filename과 public의 관계 

     - Filename과 public은 일치해야한다(규칙)

     - 동일하지 않으면 오류가 발생한다.

  2.3 Entry point : main() 메서드

     - main() 메서드의 개념 : 시작점

     - main의 형식

public static void main(String[] 변수명)
class Test4 {
    static void main(String[] a) {}
}

 

     - main의 형식을 지키지 않으면 main을 찾기 못해서 컴파일은 가능하나, JVM에서 실행을 할 수가 없다.

  2.3 Application argument : args

     - main의 parmeter과 args의 관계

     - 변수 args를 application argurment로 넘기면 String 배열에 변수 args를 parameter로 받는다.

 

     - 응용 : String[]에 여러개의 Application Args를 넘겨 출력하기.

class Test6 {
    public static void main(String[] args) {
        for (String it : args) {
            System.out.println("'" + it + "'");
        }
    }
}