티스토리 뷰

Java/문법

[Java] 1. Java란?

개발자 김챠챠 2024. 5. 9. 16:07

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) 라고 부른다. 식별자 명명 규칙은 반드시 지켜야 하며, 지키지 않을 경우 컴파일 단계에서 오류가 발생하므로, 아래의 규칙은 반드시 지켜져야 한다.

  1. 하나 이상의 단어로 이루어져야 한다.
  2. 첫번째 글자는 숫자가 될 수 없다.
  3. ‘$’, ‘_’ 외의 특수 문자는 사용할 수 없다
  4. 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 소스파일의 기본적인 구조에 대해 간단하게 살펴보도록 하자.

  1. 패키지 선언
    • 패키지(package)동일한 목적의 클래스들을 하나의 그룹으로 묶어 관리하기 위한 집합이다. 패키지 선언은 소스코드 최상단에 package 예약어를 사용해서 이루어진다.
  2. 임포트 선언
    • 임포트(import) 이 클래스에서 사용할 다른 클래스를 선언하기 위한 예약어이다. 위의 예시에선 java.lang 패키지의 모든 소스파일(*)을 임포트하고 있는데, 대부분의 IDE는 lang 패키지를 자동으로 임포트하고 있으므로 생략해도 된다.
  3. 클래스 선언
    • 클래스(class) Java 프로그램을 구성하는 기본단위이자 객체의 설계도이다. 1개의 소스파일(.java) 내에는 최대 1개의 public 클래스 가 있으며, 이 public 클래스는 소스파일과 이름이 같아야 한다. 물론 public이 아닌 다른 클래스는 몇개고 선언 가능하며, 이름이 소스파일과 같을 필요도 없다.
  4. main 메서드
    • 클래스 내부에서 객체의 기능을 담당하는 함수를 메서드(method) 라고 부르는데, 그 중 main 메서드는 Java 애플리케이션의 진입점(entry point) 으로 실행시 JVM에 의해 가장 먼저 호출되는 부분이다. 따라서 프로젝트 내에는 최소 1개의 main 메서드가 존재해야 한다.
  5. 주석
    • 주석(comment) 은 컴파일시에 제외되는 코드로, 가독성을 높이기 위해 사용된다. 한줄 주석은 //, 여러줄 주석은 /*~*/ 를 사용하며, 사용자나 개발자를 위한 문서(Javadoc) 을 만들 때는  /** ~ */ 라는 API 주석을 사용한다. 주석은 코드 어디에나 사용 가능하지만, 문자열 중간에는 사용할 수 없다.
  6. 출력문
    • Java는 문자열을 출력하기 위한 다양한 기능을 제공하는데, 기본적으로는 System.out.println 메서드를 사용한다. 이 메서드는 끝에 자동으로 개행을 해주는데, 개행이 필요하지않다면 print 메서드를 사용하면 된다.

Java 컴파일


일반적으로 Java 애플리케이션 개발은 IDE에서 이루어지므로 아래와 같이 직접적인 명령어는 쓸 일이 많지 않지만, linux 계통 혹은 cmd에서 명령어를 사용해야 할 경우에는 아래를 참고하도록 하자.

    1. 환경변수 설정(윈도우)
      • JAVA_HOME : 주 사용 JDK의 설치 경로
      • Path : %JAVA_HOME%\bin
      • CLASSPATH : %JAVA_HOME%\lib
    2. 버전 확인
      javac -version # 컴파일러 버전
      java -version # JVM 버전

    3.  소스파일 컴파일
      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 을 입력하여 콘솔 인코딩을 변경하거나, 인코딩 옵션을 추가한다.

    4. 파일 실행
      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
링크
«   2025/12   »
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
글 보관함