티스토리 뷰
Java란?
Java 란 1991년 제임스 고슬링(James Gosling) 을 비롯한 Sun Microsystem 연구원들이 개발한 고급 프로그래밍 언어다. 초기에는 가전제품이나 휴대용 디바이스에 사용하기 위한 언어로 개발되었으나, 현재는 앱이나 웹 어플리케이션에서 많이 사용되고 있다. Java의 특징은 아래와 같다.
- 객체 지향 프로그래밍 언어
객체지향 프로그래밍(OOP; Object-Oriented Programming) 이란 속성과 기능을 가진 단위인 객체(object) 간의 연결로 이루어지는 프로그래밍 패러다임이다. Java는 클래스(class) 라는 문법을 통해 객체를 설계하고, 설계된 객체는 필요한 시점에 동적으로 로드된다. - 메모리 관리가 용이
개발자가 직접 메모리를 관리하지 않고 가비지 컬렉터(Garbage Collector) 시스템이 자동으로 관리한다. 따라서 메모리 관련 사항을 개발자가 신경쓰지 않아도 되므로 생산성이 높다. - 플랫폼 독립적 : Write once, run anywhere
작성된 Java는 바이트코드(Byte code) 라는 중간 파일로 저장되며,각 플랫폼에 설치된 자바 가상 머신(JVM) 에서 최종 컴파일되어 실행된다. 즉 개발자는 플랫폼과 관계없이 일관된 프로그래밍 방식을 사용하므로 이식성과 생산성이 높다.
Java 용어
1. Java SE
Java는 다양한 환경에서 필요한 사항들을 Edition 이라는 개념으로 구분한다. 그중 SE(Standard Edition) 는 자바 개발에 필수적인 도구들이나 라이브러리 API를 정의하는 기본 표준이다. 네트워크나 인터넷 등 서버 애플리케이션을 개발하기 위한 표준인 Java EE(Enterprise Edition) 도 존재한다.
ex) Java SE 11.0.13 (LTS) : 주버전은 11, 개선버전은 0, 총 13번의 업데이트를 거쳤으며 장기 지원 서비스(Long Term Service)를 제공하는 버전
2. JDK
JDK (Java Development Kit : 자바 개발 도구) 는 Java SE의 구현체로, 자바실행환경(JRE) 과 컴파일러 등의 개발도구를 포함한다. Oracle이 제공하는 공식 JDK(유료)와, 전면 무료버전인 Open JDK 가 있다.
3. JRE
JRE (Java Runtime Environment : 자바 실행 환경) 은 자바가상머신(JVM) 과 각종 라이브러리 API를 포함하는 단위로, 단순히 자바 어플리케이션을 구동하기 위해서는 JRE만 있으면 된다.
4. JVM
JVM (Java Virtual Machine : 자바 가상 머신) 독자적인 규격에 따라 Java 바이트코드(.class) 를 실행할 수 있는 가상의 운영체제(프로그램)이다.
5. 모듈(Module)
Java 플랫폼은 JDK 11부터 모듈 시스템을 도입하여, Java API가 패키지가 아닌 모듈단위로 관리된다. 모듈에 대한 정보는 모듈 기술자(Module Descriptor : module-info.java) 에 아래와 같이 기술된다.
module 모듈명 {
requires 모듈명1;
requires 모듈명2;
exports 패키지명1;
exports 패키지명2;
}
JVM과 Java 작동 원리

Java는 컴파일러를 통해 소스파일을 바이트코드(Byte code) 로 변환하며, JVM은 이를 읽어 애플리케이션을 실행한다. 실행 환경에 따라 JVM과 그 구동방식은 다를 순 있어도, 소스파일과 바이트코드는 언제나 동일하기 때문에 개발자는 실행 환경과 무관하게 개발할 수 있는 것이다.
클래스 로더(Class Loader) 는 바이트코드를 읽어 클래스(class)파일을 찾아 메모리를 할당하며, 실행 엔진(Execution Engine)은 인터프리터 나 JIT 컴파일러 로 바이트 코드를 해석하고, 애플리케이션의 시작점인 main 메서드를 찾아 실행한다. 애플리케이션이 실행되면서 나타나는 여러가지 변화는 메모리 영역에서 일어나게 되는데, 구체적으로는 아래와 같다.
※ 아래의 내용은 객체지향언어에서 사용하는 변수, 상수, 정적변수, 메서드 등을 용어를 알아야 이해할 수 있다.

- 메서드 영역 : 바이트 코드를 통해 읽은 클래스의 정보와 각종 정적 변수, 상수 등이 저장된다.
- 스택 영역: 메서드 호출과 관련된 정보(지역 변수, 매개변수, 반환 값 등)가 저장되는 영역으로, 각 스레드에는 별도의 스택 영역이 할당되며, 일반적으론 main 스레드 하나만 존재한다.
- 힙 영역: 객체나 배열과 같은 동적으로 할당된 데이터가 저장되는 영역으로, JVM의 모든 스레드에 의해 공유된다.
- PC 레지스터(PC Registers) : 현재 실행 중인 Java 가상 머신의 명령 주소를 보관한다
- 네이티브 메서드 스택(Native Method Stack): Java가 아닌 언어로 작성된 코드를 위한 스택이다.
Java 네이밍 컨벤션
Java의 구성 요소는 개발자가 직접 이름을 붙여줄 수 있는데, 이 이름을 식별자(identifer) 라고 부른다. 식별자 명명 규칙은 반드시 지켜야 하며, 지키지 않을 경우 컴파일 단계에서 오류가 발생하므로, 아래의 규칙은 반드시 지켜져야 한다.
- 하나 이상의 단어로 이루어져야 한다.
- 첫번째 글자는 숫자가 될 수 없다.
- ‘$’, ‘_’ 외의 특수 문자는 사용할 수 없다
- Java의 예약어는 사용할 수 없다.
여기서 예약어(keyword)란, Java에서 특정한 용도로 사용하기 위해 사전에 정의한 단어들을 의미한다.
| 분류 | 종류 |
| 제어문관련 | if, else, switch, case, default, while, do, for, break, continue, return, yield … |
| 접근제한자 | public, protected, private … |
| 클래스선언 | class, interface, enum, extends, implements, package, import … |
| 인스턴스관련 | new, this, super … |
| 예외처리 | try, catch, finally, throw, throws … |
| 기타 | static, final, abstract, native, synchronized, strictfp, transient, volatile, assert, instanceof … |
이와는 달리 반드시 지킬 필요는 없지만, 개발자들이 통상적으로 정한 명명 규율(convention)이 있다. 사용하는 규율은 식별자에 따라 다르며, 아래와 같은 종류가 있다.
| 명칭 | 예시 | 설명 및 사용처 |
| 파스칼 케이스(Pascal Case) | HelloWorld | 각 단어의 두문자가 대문자 소스코드 명, 클래스 명등 네임스페이스(namespace)와 관련된 이름 |
| 카멜 케이스(Camel Case) | helloWorld | 첫 글자가 소문자인 파스칼 케이스 변수, 함수 등 코드 내부의 식별자와 관련된 이름 |
| 스네이크 케이스(Snake Case) | hello_world | 각 단어 사이를 언더바(_)로 이음 Java에선 잘 사용하지 않음 |
| 스크리밍 스네이크 케이스 (Screaming Snake Case) |
HELLO_WORLD | 전체 글자가 대문자인 스네이크 케이스 상수(constace)명 |
| 케밥 케이스(kebab case) | hello-world | 각 단어 사이를 하이픈(-)으로 이음 Java에선 잘 사용하지 않음 |
Java 소스파일 구조
package base;
import java.lang.*;
/**
API 주석
*/
public class Hello {
public static void main(String[] args) {
/*
여러 줄 주석
*/
System.out.println("Hello, Java!"); // 주석
System.out.printf("%d번째 삶", 3);
}
}
Eclipse 나 IntelliJ 와 같은 통합개발환경(IDE; Integrated Development Environment) 는 소스코드들을 보통 프로젝트 내의 src(source의 약자) 폴더에 보관하고 관리한다. Hello.java로 저장되어 있는 위 코드를 바탕으로 Java 소스파일의 기본적인 구조에 대해 간단하게 살펴보도록 하자.
- 패키지 선언
- 패키지(package) 는 동일한 목적의 클래스들을 하나의 그룹으로 묶어 관리하기 위한 집합이다. 패키지 선언은 소스코드 최상단에 package 예약어를 사용해서 이루어진다.
- 임포트 선언
- 임포트(import) 는 이 클래스에서 사용할 다른 클래스를 선언하기 위한 예약어이다. 위의 예시에선 java.lang 패키지의 모든 소스파일(*)을 임포트하고 있는데, 대부분의 IDE는 lang 패키지를 자동으로 임포트하고 있으므로 생략해도 된다.
- 클래스 선언
- 클래스(class) 는 Java 프로그램을 구성하는 기본단위이자 객체의 설계도이다. 1개의 소스파일(.java) 내에는 최대 1개의 public 클래스 가 있으며, 이 public 클래스는 소스파일과 이름이 같아야 한다. 물론 public이 아닌 다른 클래스는 몇개고 선언 가능하며, 이름이 소스파일과 같을 필요도 없다.
- main 메서드
- 클래스 내부에서 객체의 기능을 담당하는 함수를 메서드(method) 라고 부르는데, 그 중 main 메서드는 Java 애플리케이션의 진입점(entry point) 으로 실행시 JVM에 의해 가장 먼저 호출되는 부분이다. 따라서 프로젝트 내에는 최소 1개의 main 메서드가 존재해야 한다.
- 주석
- 주석(comment) 은 컴파일시에 제외되는 코드로, 가독성을 높이기 위해 사용된다. 한줄 주석은 //, 여러줄 주석은 /*~*/ 를 사용하며, 사용자나 개발자를 위한 문서(Javadoc) 을 만들 때는 /** ~ */ 라는 API 주석을 사용한다. 주석은 코드 어디에나 사용 가능하지만, 문자열 중간에는 사용할 수 없다.
- 출력문
- Java는 문자열을 출력하기 위한 다양한 기능을 제공하는데, 기본적으로는 System.out.println 메서드를 사용한다. 이 메서드는 끝에 자동으로 개행을 해주는데, 개행이 필요하지않다면 print 메서드를 사용하면 된다.
Java 컴파일
일반적으로 Java 애플리케이션 개발은 IDE에서 이루어지므로 아래와 같이 직접적인 명령어는 쓸 일이 많지 않지만, linux 계통 혹은 cmd에서 명령어를 사용해야 할 경우에는 아래를 참고하도록 하자.
- 환경변수 설정(윈도우)
- JAVA_HOME : 주 사용 JDK의 설치 경로
- Path : %JAVA_HOME%\bin
- CLASSPATH : %JAVA_HOME%\lib
- 버전 확인
javac -version # 컴파일러 버전 java -version # JVM 버전 - 소스파일 컴파일
javac Hello.java # 한글이 있을경우 javac -encoding UTF-8 Hello.java # javac -d [바이트코드경로] [소스경로/module-info.java] [소스경로/*.java] # javac -d C:\\MyProject\\bin C:\\MyProject\\src\\module-info.java C:\\MyProject\\src\\*.java
자바 컴파일러(javac.exe)로 소스파일을 컴파일한다. 이 때, 한글파일이 있다면 chcp 65001 을 입력하여 콘솔 인코딩을 변경하거나, 인코딩 옵션을 추가한다. - 파일 실행
java Hello # java -p [바이트코드경로] -m [모듈명/패키지이름.클래스이름] # java -p C:\MyProject\bin -m com.myapp/com.myapp.Main
'Java > 문법' 카테고리의 다른 글
| [Java] 02. 변수와 타입 (12) | 2024.05.10 |
|---|
- Total
- Today
- Yesterday
- Java
- SQL이란
- APS
- 배열
- oracle
- 테이블
- StringBuilder
- 데이터베이스
- BufferedWriter
- DBMS
- 자료구조
- dialect
- 알고리즘
- db의 역사
- BufferedReader
- DB
- SQL
- Scanner
- 레코드
- db오브젝트
- 필드
- 입출력
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |