포스트

Day05 Bytecode작성 및 Java실습(class,main())

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

1. Bytecode작성

1.1 Sublime 설치

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

이미지

1.2 Bytecode 작성

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

이미지

  • 기본 구조 작성
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    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: 0000
    
  • 터미널에서 javap를 실행하면 다음과 같은 결과가 나온다.
  • 이는 class를 설정 하지 않았다는 의미이다.

이미지

  • class 설정하기
    1
    2
    3
    4
    
    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라고 부른다.
1
2
3
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 함수 생성
    1
    2
    3
    
    static void main(String[] args){
      System.out.println("Hello World");
    }
    
  • main 함수를 만들기 위해서는 println의 위치가 필요 : ([Ljava/lang/String;)V. 를 활용하여 메소드 이름과 리턴값을 받는다
  • “Hello World”라는 문자열을 추가 : attribute Code를 통해 UTF-8의 문자열을 받는다.
1
2
0700 06  
0100 10 6a 61 76 61 2f 6c 61 6e 67 2f 53 79 73 74 65 6d

이미지

  • out 변수 설정 : 불러온 변수들을 연결 해줘야 한다.
    1
    2
    3
    4
    
    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
    
  • main과 출력하기 연결
    ```plaintext // 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
![이미지](https://blog.kakaocdn.net/dn/rM81O/btsHHTLJsZY/GULmtBAIqDOM006TkBdod0/img.png)

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

### 2. Java실습하기
#### 2.1 프로그램 언어의 발전과정
- 단순 명령문 코드를 구조화 하는 방향으로 발전  
- 명령문 >> 함수 >> 클래스 >> 패키지 >> 모듈

![이미지](https://blog.kakaocdn.net/dn/b1fnCK/btsHHdYwdu2/iivGDXTxdVOWW5LOJnV8o1/img.png)

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

![이미지](https://blog.kakaocdn.net/dn/dWHHyN/btsHIJIyfSr/b0dxvazdT9bkugGPVgzwRK/img.png)

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

![이미지](https://blog.kakaocdn.net/dn/TlvfQ/btsHHMsqvqu/vcquaPKAg3Kr0Jd1VDpoH1/img.png)

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

class B {
}

class C {
}

이미지

2.2 Filename과 public의 관계

  • Filename과 public은 일치해야한다(규칙)
  • 동일하지 않으면 오류가 발생한다.

2.3 Entry point : main() 메서드

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

이미지

  • main의 형식
    1
    
    public static void main(String[] 변수명)
    
1
2
3
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를 넘겨 출력하기.
    1
    2
    3
    4
    5
    6
    7
    
    class Test6 {
      public static void main(String[] args) {
          for (String it : args) {
              System.out.println("'" + it + "'");
          }
      }
    }
    
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.