on
자바를 자바라
자바를 자바라
자바 날먹 시험공부용 게시글 :D
---
[#1. JAVA의 특징]
1. 간결한 프로그래밍 문법
- C/C++에서 머리 빠개지는 포인터 개념이 없다
- Garbage Collector가 메모리 관리 알아서 처리
2. 이식성이 높다
- JVM(Java Virtual Machine) 사용. 운영체제에 영향받지 않는다. = 플랫폼에 독립적.
3. 객체지향 언어
- OOP(Object Oriented Programming)
4. 멀티 쓰레드 구현
5. 다양한 응옹 프로그램 작성 가능
6. 오픈 소스 라이브러리 풍부
★ # JRE와 JDK
JRE(Java Runtime Enviroment)
JDK(Java Development Kit)
자바 프로그램을 실행만 할거라면 JDK는 필요없이 JRE만 설치하면 된다 (JVM은 알아서 딸려온다)
개발을 하기 위해서는 컴파일러, 디버거 등이 포함된 JDK를 설치해야 한다.
# ★ ★ J AVA 코드가 실행되는 과정 ★ ★
# 바이트 코드란?
- 고급 언어로 작성된 코드를 JVM이 이해할 수 있는 언어로 변환된 코드. 고급 언어와 기계어의 중간다리 수준.(like 어셈블리어?)
- 명령어 크기가 1바이트라서 바이트 코드라고 불린다.
# 왜 바이트 코드가 필요할까? 고급 언어에서 기계어로 바로 바꾸면 안될까?
-> 바이트코드는 가상머신에서 돌아가는 프로그램을 위한 언어 표기법이다.
-> 같은 print 명령어라도 윈도우 OS에서 쓰이는 기계어와 맥 OS에서 쓰이는 기계어는 다르다. 그렇기 때문에 JVM이 공통적으로 이해할 수 있는 정도로 1차 번역을 거치고, OS에 따른 번역은 각 OS에 맞는 JVM이 처리하도록 하는 것.
* 컴파일 시에 주석은 번역하지 않는다
# JVM의 역할
1. 운영체제에 구애받지 않고 자바 프로그램을 실행할 수 있게 해준다.
2. 메모리 관리를 수행한다 (GC)
# JVM의 구조
1. Class Loader: JAVA 바이트코드 파일을 JVM 내부로 로드한다.
2. Execution Engine: 바이트코드를 해석하고 실행한다(바이트 코드를 기계어로 변환)
- JVM 내의 Runtime Data Area에 배치된 바이트 코드를 명령어 단위로 읽어 실행한다.
- 인터프리터, JIT 컴파일러, GC
3. Runtime Data Area: 프로그램 수행을 위해 OS에게 할당받은 메모리 공간.
- Heap: 동적으로 생성된 객체(new 명령어로 생성된 객체)가 저장되는 영역. GC가 관리. 모든 스레드에 공유
- Method Area: 클래스, 인터페이스, 메서드, static 변수 정보 등 저장. 모든 스레드가 공유
- Stack: 메서드 내에서 사용되는 지역변수, 매개변수, 리턴값 등 저장. 각 스레드마다 존재
- PC Register: 현재 수행중인 JVM 명령어 주소를 저장. 각 스레드마다 존재.
- Native Method Stack: 자바 외 다른 언어(C++ 등)의 동작을 위해 할당된 영역. 각 스레드마다 존재
* 자바에서 동적으로 객체를 생성하는 경우
-> 실제 객체는 Heap 영역에, 객체 주소를 담고있는 변수는 Stack 영역에 저장된다.
-> 정적 변수는 Stack에, 동적 변수는 Heap에.
* static 변수는 클래스 레벨에 붙는다는 이야기가 클래스랑 static 변수랑 같은 영역에 저장되있기 때문.
4. Garbage Collector
- 힙 영역에 생성된 객체 중, 참조되고 있지 않은 객체를 탐색 후 제거한다.
# 최종 요약
1. 자바로 코드를 짠다 (*.java)
2. javac 컴파일러가 바이트 코드(*.class)로 컴파일한다.
3. JVM의 Class Loader가 바이트 코드를 JVM 내부로 로딩한다
4. Execution Engine이 로딩된 바이트 코드를 해석한다
5. 해석된 바이트 코드는 Runtime Data Area에 배치되어 동작이 이루어진다.
> 5.1 - main 클래스가 Method Area에 맨 처음 올라간다
> 5.2 - main 클래스 속 정적 변수들은 Stack 영역에, 동적 변수와 객체들은 Heap 영역에 저장된다
> 5.3 - 메소드가 호출되면 새로운 스택을 생성. 지역변수를 해당 스택에 담아놓고 사용, 메소드가 종료되면 스택을 비우고 제거.
> 5.4 - 참조가 끊어진 객체는 GC가 수거한다
- 위 과정을 반복한다 -
[#2. JAVA의 자료형]
1. 기본형(Primitive Type)
- 논리형: Boolean
- 숫자형: byte, char, short, int, long, float, double
- NULL을 받을 수 없다!
2. 참조형(Reference Type)
- 객체의 주소를 저장하는 공간. 포인터 느낌.
- 클래스, 인터페이스, 배열, 문자열 등...
- NULL을 받을 수 있다
byte char short int long float double boolean 1byte 2byte 2byte 4byte 8byte 4byte 8byte 1byte
* 문자열은 String 클래스, 참조형이다.
* char는 2byte 정수형이다 - 실제로는 정수가 저장되어 있으나, 출력 시 문자로 매핑해서 보여주는 것.
* 매우 긴 숫자, 소숫점을 표현하기 위해서는 BigDecimal을 사용해볼 수 있다. (참조 타입)
[형변환]
- 큰 범위에서 작은 범위로의 변환은 데이터 손실을 유발할 수 있다.
- 기본형 변수는 참조형 변수로 형변환 될 수 없다. 기본형은 기본형끼리만 변환.
- 참조형 변수는 자신의 하위 클래스 객체로만 형변환 할 수 있다.
+) 기본형 타입의 데이터를 참조형 타입의 데이터로 만들기 위해서는 "포장 과정"(Boxing)이 필요하다
- Wrapper Class를 이용, 기본형을 감싸서 참조형으로 만든다. (형변환과는 다르다)
- int -> Integer, double -> Double 등...
- 참조형 타입의 데이터를 기본형 타입의 데이터로 돌려놓는 것을 언박싱(UnBoxing)이라고 한다.
from http://sedangdang.tistory.com/150 by ccl(A) rewrite - 2021-10-15 05:28:14