본문 바로가기
DEV/Java

[자바] 1. 기본 프로그래밍 구조

by 어쩌다개발 2022. 1. 11.
반응형

1. Hello World

package ch01.sec01;

public class HelloWorld {
    public static void main(String[] args) {
    	System.out.println("Hello, World!");
    }
}

1.1. 함수와 메서드의 차이

1) 함수(function) : 어떠한 기능을 수행, 전역과 지역에 상관없이 독립된 기능을 수행한다.
2) 메서드(mothod) :  함수처럼 어떠한 기능을 수행하지만, 함수와의 차이가 있다면 메서드는 클래스 및 객체와 연관되어 있다.
클래스 내에 선언되어 있는 함수가 메서드이다.

결론 : 함수가 메서드보다 더 큰 개념으로 메소드는 함수에 속한다고 할 수 있지만, 함수와 메서드는 다르다.

ex) 함수는 sum(), abs() 같이 독립적으로 사용하고, 메서드는 A라는 객체가 존재할 때 A.upper(), A.lower()와 같은 형태로 사용한다.

1.2. main Method

1) 클래스 안에 선언된 함수이다.
2) 프로그램이 실행될 때 첫번째로 호출되는 메서드이다.
3) 특정 객체를 대상으로 동작하지 않게 하려고 static으로 선언했다.

  • static은 java 프로그램이 실행하기 전에 static 메서드나 static 변수를 첫 단계로 메모리에 올려 프로그램을 실행킨다.
    (실행시 static이 1순위)
  • 프로그램이 종료될 때까지 사라지지 않는다.
  • main함수가 실행되기 위해서는 메모리에 미리 올라가야한다.
  • 메모리에 올라가있지 않으면, 시작점인 main() 메소드를 호출하려고 하는데 메모리에는 main이 없기 때문에 실행을 할 수가 없다.
  • main 메소드는 누군가 호출하기 전에 미리 메모리에 있어야 하기 때문에 static을 붙이는 것이다.

1.3. 그 외

1) 자바는 몇 가지 명령을 빠르게 실행하는데 사용하는 스크립팅 언어가 아니다. 자바는 클래스와 패키지로 구조화했을 때 이점을 얻는 대규모 프로그램 개발용 언어를 목표로 만들어졌다.

2. 자바 프로그램을 컴파일하고 실행하기

2.1.  자바 설정

 JRE
 (Java Run Environment)
 자바 애플리케이션을 실행하기 위한 JVM 구현하는 환경/ 개발이 아닌 자바파일 실행만  경우 JRE 설치 
 JDK
 (Java Development Tool Kit
) 
 자바 기반의 애플리케이션을 개발하는데 필요한 번들/ 자바 개발 도구로 자바 개발을 위한 자바 컴파일러(javac), 자바 가상 머신(JVM), 각종 자바 Library, JRE등을 포함한 키트 
 JVM 
 (
Java Virtual Machine, 
 자바 가상 머신)
 자바 애플리케이션을 클래스 로더를 통해 읽어 들여 자바 API 함께 실행 
 - 자바와 OS 사이에서 중개자 역할을 수행하여 플랫폼에 구애받지 않고 재사용 가능하게 해주는 역할 
 - 메모리관리, Garbage Collection 역할 
 - 스택기반의 가상머신 

** JVM, JRE, JDK는 플랫폼에 의존적이지만 JDK를 통해 작성된 프로그램은 독립적 플랫폼으로 실행될 수 있다.

2.2. 자바 실행 원리

1) 원시코드 작성(.java) 
2) 컴파일(javac) : 컴파일러가 작성한 소스 코드에 오류가 없는지 확인 
3) 바이트코드 생성(.class)  
- 컴파일러에서 자바 바이트코드로 변환하여 .class 파일 생성 
- 컴파일 바이트코드는 플랫폼에 무관하게 사용가능 

** 자바 바이트 코드란?  
자바 가상 머신이 이해할 수 있는 언어로 변환된 자바 소스 코드를 의미하는데, 자바 컴파일러에 의해 변환되는 코드의 명령어 크기가 1바이트라서 자바 바이트 코드라고 불리고 있음. 이러한 자바 바이트 코드의 확장자는 .class이며 자바 바이크 코드는 자바 가상 머신만 설치되어 있으면, 어떤 운영체제에서라도 실행될 수 
있다.

4) 가상머신을 통해 프로그램 실행 : JVM 통해 바이트코드를 읽어 .class 파일을 실행  

** JVM 추가 설명 
자바 바이트 코드를 실행시키기 위한 가상의 기계로써 자바로 작성된 모든 프로그램은 JVM에서만 실행될 수 있으므로, 자바 프로그램을 실행하기 위해서는 JVM이 꼭 필요하다.
그래서 오라클은 대부분의 주요 운영체제뿐만 아니라 웹 브라우저, 스마트 폰, 가전기기 등에서도 자바 가상 머신을 설치 할 수 있게 지원하고 있다.
단, 자바 프로그램과는 달리 자바 가상 머신은 운영체제에 종속적이므로, 각 운영체제에 맞는 자바 가상 머신을 설치해야 된다.

  • Class Loader  : runtime 시점에 클래스를 로딩하게 해주며 클래스의 인스턴스를 생성하면 클래스 로더를 통해 메모리에 로드된다.
  • Rumtime Data Area : JVM 프로그램을 수행하기 위해 OS로부터 별도로 할당받은 메모리 공간 
  • Execution Engine : 클래스로더를 통해 JVM 내의 Runtime Data Area 배치된 바이트 코드는 Excution Engine 의해 실행되며, 실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행

참고) 최초 JVM 나왔을 당시에는 인터프리터 방식(한줄씩 해석하고 실행)이여서 속도가 느리다는 단점이 있었다.
그래서 JIT complier 방식(한번에 해석하고 실행) 통해 속도를 보완했다.

자바는 바이트코드로 컴파일하는 과정과, 바이트코드를 인터프리터하는 방식 2가지를 진행한다.
- 컴파일 방식 : 소스코드를 한번에 컴퓨터가 읽을 수 있는 기계어로 변환
- 인터프리터 방식 : 소스코드를 런타임시에 한줄 한줄 읽어가면 변환
JIT complier 방식을 도입하면서 이미 한번 읽어서 기계어로 변경한 소스코드는 더이상 번역하지 않는다.

 

저장소에 있는 경우, JIT 컴퍼일러가 번역을 안 하는게 아닌, 인터프리터가 읽지 않는다.

JIT 컴파일 설명 참고 : https://www.newiki.net/wiki/JIT_%EC%BB%B4%ED%8C%8C%EC%9D%BC

2.3. 자바 메모리 구조

1)변수의 생성 시점

  • 클래스 변수(또는 static변수) 생성 시기 : 클래스가 생성될 때 
  • 인스턴스 변수 생성 시기 : 인스턴스가 생성 될 때  
  • 지역변수 : 변수 선언문이 수행되는 시점 

2)클래스 변수(static 변수)  

  • 클래스 변수는 모든 인스턴스가 공통된 저장공간을 공유하게 되어 공유 변수라고도 부른다.
  • 일반적으로 멤버변수 중 모든 인스턴스에서 공통적으로 사용해야하는 것에 static을 붙인다.
  • static 붙은 멤버변수는 인스턴스를 생성하지 않아도 사용할 있다.

메서드 영역 : static 영역, 클래스 영역, 데이터 영역이라고도 부른다.
클래스의 정보가 JVM의 메모리 공간에 LOAD 될 때 할당 및 초기화되는 대상은 이 영역에 할당된다.
(바이트 코드, 클래스 멤버 변수, 메소드 정보, Type(Class or interface)정보, Constant Pool, static, final 변수 등)

스택 영역: 스택에 할당된 지역변수, 매개변수는 해당 메서드를 빠져 나가면 바로 소멸된다.
참조 변수의 경우 주소값을 가진다.
(지역 변수, 매개 변수, 기본형 데이터 등)

힙 영역: 인스턴스가 생성되는 메모리 공간이다.
JVM의한 Garage Collection의 대상이 되는 공간이다.
인스턴스 할당은 프로그래머가 하지만 소멸은 JVM이 한다.
(객체, 인스턴스 )

참고:

카이호스트만의 코어자바8

https://zeddios.tistory.com/233

https://velog.io/

https://catch-me-java.tistory.com/11

https://velog.io/@litien/JVM-구조

 

반응형

'DEV > Java' 카테고리의 다른 글

[자바] 사용자 정의 예외 만들기  (2) 2023.02.01
[자바] default method 와 static method  (2) 2023.02.01
[자바] 4. 배열 리스트  (0) 2022.01.15
[자바] 3. 문자열  (1) 2022.01.13
[자바] 2. 자료형 & 연산자  (0) 2022.01.13

댓글