Java 9의 가장 큰 특징은 직소(jigsaw) 프로젝트를 이용한 모듈 시스템 도입입니다.
라이브러리와 규모가 큰 시스템을 모듈화하고 강력한 접근 제어
=> 캡슐화를 통한 느슨한 결합으로 유지관리성 향상
=> 불필요하고 비인가된 모듈 간 결합을 방지하여 모듈의 올바른 사용을 유도
=> 보안성 향상
성능 최적화 : JPMS(Java Platform Module System)의 일환으로 JRE를 작은 단위의 모듈들로 쪼갰습니다. 이 덕분에 어플리케이션에서 실제로 사용하는 모듈만 패키징하여 배포 가능합니다.
=> 필요한 모듈만으로 경향화된 배포 가능. 용량이 작은 컴퓨터나 라즈베리파이와 같은 소형 기기에서 보다 경량화된 프로그램으로 실행 가능
=> JVM은 모듈 dependency graph를 이용해 애플리케이션에서 어떤 모듈을 필요로 하는지 체크. 만약 필요한 모듈을 못 찾으면 JVM은 missing module을 report하고 종료하므로 런타임 오류 방지
(JPMS 이전에는 해당 missing class 를 실제로 사용하려고 시도할 때(런타임 특정 시점) 오류를 발견)
com.jigsawtest1
module com.jigsawtest1 {
exports jigsaw.car;
}
package jigsaw.car;
public class Car {
private int price;
private String carName;
public Car(int price, String carName) {
this.price = price;
this.carName = carName;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getCarName() {
return carName;
}
public void setCarName(String carName) {
this.carName = carName;
}
public void changeCarName(String newName){
carName="new_"+newName;
}
@Override
public String toString() {
return "Car{" +
"price=" + price +
", carName='" + carName + '\'' +
'}';
}
}
package jigsaw.car.notexported;
public class PrivateCar {
private int price;
private String carName;
public PrivateCar(int price, String carName) {
this.price = price;
this.carName = carName;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getCarName() {
return carName;
}
public void setCarName(String carName) {
this.carName = carName;
}
public void changeCarName(String newName){
carName="new_"+newName;
}
@Override
public String toString() {
return "Car{" +
"price=" + price +
", carName='" + carName + '\'' +
'}';
}
}
org.jigsawtest2
module org.jigsawtest2 {
requires com.jigsawtest1;
}
package jigsaw.person;
import jigsaw.car.Car;
public class Person {
String name;
int age;
Car car;
public Person(String name, int age, Car car) {
this.name = name;
this.age = age;
this.car = car;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package jigsaw.person;
import jigsaw.car.Car; // module-info에 정의되어있으므로 다른 모듈이어도 사용 가능
//import jigsaw.car.notexported.PrivateCar;
/* com.jigsawtest1 모듈에 exports 되어있지 않은 패키지이므로 import해도 오류발생
Package 'jigsaw.car.notexported' is declared in module 'com.jigsawtest1',
which does not export it to module 'org.jigsawtest2' */
public class jigsawTest {
public static void main(String[] args){
Car car=new Car(10000,"super car");
System.out.println(car);
Person person=new Person("jerry",30,car);
person.car.changeCarName("bmw");
System.out.println(car);
// PrivateCar privateCar = new PrivateCar(10000,"super car"); 사용 불가
}
}
[output]
Car{price=10000, carName='super car'}
Car{price=10000, carName='new_bmw'}
[참고]