loading
본문 바로가기
BACK-END/JAVA

JDK(Java Development Kit) & JAVA ?

by pikiforyou 2020. 8. 10.

 

JDK 의 종류 및 프로그램

J2SE(Java 2(to) Standard Edition) - 일반적인 자바 프로그램을 만들 수 있는 기본 패키지 (콘솔/응용을 포함)

JSEE(Java 2(to) Enterprise Edition) - 엔터프라이즈급 프로그램 만들때사용 .EJB/SERVLET등의 기술사용 (기업용/웹 포함)

J2ME(Java 2 Micro Edition) - 휴대폰등의 소형 시스템에서 사용할 프로그램을 만들 수 있는 패키지

 

콘솔프로그램 : 결과가 콘솔창에 뿌려짐

응용프로그램 : =윈도우 프로그램(최소,최대,종료버튼이 있는 체제를 생각하면 좋다.)

웹 : 결과가 브라우저에 뿌려짐

모바일 : 결과가 모바일화면(스마트폰)에서 뿌려짐

 

 

 

 

디렉토리 구조

- bin / binary(2진)

주로 실행파일이 들어있는 디렉토리라고 생각하면 된다.  EX) .exe, .dll ...

컴파일러, 인터프리터등

*계산기-> 프로그래밍 버젼으로 변경시, 자동으로 진법으로 계산해준다.

 

- lib / library

프로그래밍에 필요한 정보등이 들어있음. 갖다쓰는 도구들이라고 생각하면 좋다.

개발툴에 의해 사용되는 파일들 ex) .jar ...

*jre > lib > rt.jar 은 자바에서 사용하는 클래스들이 들어있다. 

 

- jre / java runtime environment 자바실행환경

개발도구를 제외하고 실행에 필요한 최소한의 환경만을 제공.

 

 

 


 

PATH 변경 (윈도우 기준)

cd.. 또는 dir 을 이용해서 계속 경로를 변경해주기는 번거롭다.

path 변경이 되지않은 상태에서 터미널창에 자바를 찾고자한다면 이런식으로 뜨게된다.

...CMD 화면이라고 가정시

C:\USERS\DARAM > javac -version
	//찾을수 없다고 나온다.

C:\USERS\Program Files\Java\bin > javac -version
	//찾아진다
   

현재 javac 의 위치는 C:\USERS\Program Files\Java\bin 폴더에 있기때문에

그 외의 경로에서는 검색이 되지않기때문이다.

밑의 과정으로 path 변경을 해주면, 이제 어느 경로에서 검색해도 javac.exe가 실행될 수 있게된다.

 

 

 PATH 변경 경로

내컴퓨터 > 속성 > 고급시스템설정 > 환경변수설정 > 시스템변수의 편집 > path에 등록

[위에서부터 순차적으로 검색하므로 순위를 따져서 입력하면 좋다]

 

 

 환경변수 등록 경로 

내컴퓨터 > 속성 > 고급시스템설정 > 환경변수설정 > 시스템변수의 새로만들기 >

JAVA_HOME / 

JDK설치한 곳의 주소지정.  EX) C:\Program Files\Java\jdk1.8.0_60

-환경변수를 등록하는 이유는 path와는 별개로, 다른 어플리케이션이 JDK에 인스톨된 파일을 찾기위해서

JAVA_HOME을 참조하기때문에 등록하는것이다. 

 

>> 맥북용 경로설정은 따로 포스팅했다.

2020/08/12 - [BACK-END/JAVA] - Mac 에서 자바 path 및 환경변수 설정하기 * 맥에서 JDK 초기설정

 

 

 

자바의 특징

1. 플랫폼 독립성

JVM(java Virtual Machine : 자바가상머신)은 크로스플랫폼이다.

JVM이 프로그램의 바이트코드(.class)를 운영체제에 따라서 자동으로 컴파일해줘서

어떤 운영체제에서든지 하나의 프로그램으로도 실행이 되게하기때문에

플랫폼에 대한 의존성이 없다.

 

2. 객체 지향언어

>> OOP 에 관한 포스팅은 이곳에서 확인하자

2020/08/19 - [BACK-END/JAVA] - OOP(객체지향 프로그래밍) / 접근지정자

 

3. 멀티 스레드 지원

대표적으로 자바스크립트는 싱글스레드여서 비동기가 굉장히 중요했다.

 

4. 자동 메모리 관리

JVM에 가비지콜렉터가 있어 자동으로 메모리를 회수하며,

개발자가 덜 신경을 써도 되기때문에 편리하며 다른 언어보다 안정성이 높은 편이다.

 

 


 

자바의 단점

1. 상대적으로 느리다

실행시 자바가상머신(JVM)을 거쳐야하므로 실행속도가 상대적으로 느린편이다.

대신 어느 운영체제에서든지 하나의 프로그램으로 작동할 수 있다.

 

2. 예외처리

자바는 예외처리가 잘 되어있지만, 개발자가 하나하나 처리해줘야 하는 단점도 있다.

또한, 다른 언어에 비해 작성해야하는 코드가 긴 편이다.

 

 

 


 

 

 

컴파일+인터프리터의 과정

 

public class HelloWorld {
	public static void main(String[] args) {
		System.out.println("Hello Java"); //println (소문자 l임을 주의하자)
	}
}

 

  • HelloWorld : 직접 만든 클래스명. Class명은  대문자로 시작하며, (클래스명).java로 저장
  • String, System, Date : rt.jar 에 들어가있는 내장 .class 도구. java.lang이 아닌것은 import 해줘야한다.

 

import java.util.Date; 
	//Date가 util항목에 있기때문에 이걸 쓰지않으면 에러난다

public class HelloWorld {
	public static void main (String[] args) {
		System.out.println("Hello Java");
		Date today = new Date();
		System.out.print("Today is ");
		System.out.println(today); //Today is 오늘날짜 출력
	}
}

 

 

 

 

 

  • Class loader : class파일을 RAM메모리에 로드한다. (휘발성 메모리)
  • Verification : 검증과정 (악성코드등을 검사)
  • Interpreter : Main 메소드를 찾는다. Main mathod가 없을시 컴파일은 되나, 실행은 되지않는다.
  • 컴파일 : 원시코드를 컴퓨터가 쓰는 바이트코드로 변환시켜주는것.
  • 인터프리트 : 위에서부터 순차적으로 실행하는 것

 

... CMD 화면이라 가정시

>javac TestFile.java //컴파일하는 과정
>java TestFile //실행하는 과정 (실제로는 TestFile.class가 생략됨)

여기서 TestFile.java는 원시코드이며

이를 컴파일해서 만들어지는 TestFile.class는 바이트코드이다.

메인의 모든것이 다 실행이되면 프로그램은 종료된다.

즉, 자바는 한번 컴파일을 한 후 인터프리트되며 실행되는 언어라고 생각하면 된다.

 

 

 

+추가

Class loader시 Static 은 메모리에 먼저 할당된다. static이 아닌 다른것들은 인터프리터할때 실행이 된다.

Static(정적멤버)가 먼저 실행되고 만들어지며, 그 외 Instance(인스터스 멤버)는 인스턴스화(객체화)를 해야 메모리에 생긴다. 이 순서의 차이를 잘생각해서 할당해야한다. 생명주기를 더 공부해보자.

 

 

 


 

프로그램 구조(자바 기본 구조)

package 패키지명; //패키지 선언부
import java.util.Date; //import 선언부

public class HelloWorld { //class 선언부
     //하나의 프로그램에는 반드시 main메서드가 있어야함(프로그램 진입점 Entry point)
     //특히 콘솔,윈도우 만들때는 반드시 필요함.
	public static void main (String[] args) {
		System.out.println("Hello Java");
	}
}

 

  • package 선언: 클래스나 인터페이스를 종류별로 묶어서 관리하기위한 선언. 무조건 소문자
  • import 선언: 필요한 자바클래스들을 가져다쓰기위한 선언.
  • class 선언: 클래스에서도 그 안의 Main Method부분은 지역으로 친다. 반드시 하나는 있어야 함.

 

예제 - 날짜를 다른방식으로 출력하기

 

import java.util.Date;
import java.text.SimpleDateFormat;

public class TodayScript {
	public static void main(String[] args) {
		//오늘 날짜 출력하기
		Date today = new Date();
		System.out.println("Today is ...");
		System.out.println(today);  // 결과물: Mon Aug 10 13:20:02 KST

		//2020-08-10 10:15:12 형식으로 출력해보자
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println(dateFormat.format(today)); // 결과물: 2020-08-10 10:15:12
	}	
}

 

 


참고하면 좋은 사이트

1. TIOBE - Ranking site https://www.tiobe.com/tiobe-index/

2. Flutter / dart언어를 사용, Android&IOS Mobile dev 할때 참고해보자 <-> Kotlin

댓글