본문 바로가기

자바공부

자바 모듈 개념 공부

728x90
반응형

명품 자바 프로그래밍 6장

 

* 모듈(module)은 java 9에서 처음 도입된 개념으로, 패키지(package)서로 관련 있는 클래스나 인터페이스의 컴파일된 클래스(.class) 파일들을 한 곳에 담는 컨테이너이고, 모듈패키지들을 담는 컨테이너로 모듈 파일(.jmod)로 저장한다

즉, 패키지는 클래스&인터페이스 저장소. 모듈은 패키지 저장소

 

* java.base 모듈

자바의 모듈들 중에서 꼭 필요한 기본 모듈이 java.base 모듈이며 java.base.jmod 파일에 들어있다.

 

* 모듈 기반의 자바 실행 환경

자바 실행 환경(java run time environment)이란 자바 응용프로그램이 실행되는데 필요한 제반 환경으로서, 응용프로그램이 실행 중에 사용하는 자바 API 클래스와 자바 가상 기계(JVM)등으로 이루어진다.

 

* 자바 모듈화의 목적

자바 컴포넌트들을 필요에 따라 조립하여 사용하기 위함.

세밀한 모듈화를 통해, 필요없는 모듈이 로드되지 않게 하여, 컴퓨터 시스템에 불필요한 부담을 줄인다. 특히 하드웨어가 열약한 소형 IoT 장치에서도 자바 으용프로그램이 실행되고 성능을 유지하게 한다.

 

* 주요 패키지

1) java.lang

System을 비롯하여 문자열, 수학 함수, 입출력 등과 같이 자바 프로그래밍에 필요한 기본적인 클래스에 인터페이스를 제공. import문을 사용하지 않아도 자동으로 import된다.

2) java.util

날짜, 시간, 벡터, 해시맵 등 다양한 유틸리티 클래스와 인터페이스를 제공

3) java.io

키보드, 모니터, 프린터, 파일 등에 입출력 하는 클래스와 인터페이스를 제공

4) java.awt와 javax.swing

AWT(Abstract Windowing Toolkit)

GUI 프로그래밍에 필요한 클래스와 인터페이스를 제공

 

잠깐!

개발자는 자바 JDK의 클래스가 가진 메소드를 다 기억하거나 이해할 수 없기 때문에 항상 자바 API문서를 열어놓고 작업하는 것이 좋다.

https://docs.oracle.com/en/java/javase/16/docs/api/index.html

 

Overview (Java SE 16 & JDK 16)

This document is divided into two sections: Java SE The Java Platform, Standard Edition (Java SE) APIs define the core Java platform for general-purpose computing. These APIs are in modules whose names start with java. JDK The Java Development Kit (JDK) AP

docs.oracle.com

 

* Object 클래스

Object는 java.lang 패키지에 속한 클래스이며, 모든 클래스에 강제로 상속된다.

Object 만이 아무 클래스도 상속받지 않는 유일한 클래스로 계층 구조 상 최상위 클래스이다.

 

ex) Object 클래스로 객체의 속성 알아내기

class Point{
	private int x, y;
	public Point(int x, int y) {
		this.x=x;
		this.y=y;
	}
}

public class ObjectPropertyEx {
	public static void print(Object obj) {
		System.out.println(obj.getClass().getName()); // 클래스 이름
		// obj가 가리키는 객체의 클래스 이름 출력
		System.out.println(obj.hashCode()); // 해시 코드 값
		// obj가 가리키는 객체의 해시코드 출력
		System.out.println(obj.toString()); // 객체를 문자열로 만들어 출력
		// obj가 가리키는 객체를 문자열로 출력
		System.out.println(obj);  // 객체 출력
	}
	
	public static void main(String[] args) {
		Point p = new Point(2,3);
		print(p);
	}
}

실행 결과

Point

366712842 // 해시코드의 16진수 값. 실행할 때마다 달라짐

Point@15db9742

Point@15db9742  // 클래스명 + 해시코드 16진수

 

* Object 클래스의 toString()를 오버로딩하여 자신만의 문자열을 리턴하기

ex) Point 클래스에 toString()을 작성한 예

class Point{
	private int x, y;
	public Point(int x, int y) {
		this.x=x;
		this.y=y;
	}
	public String toString() { // Point 객체를 문자열로 리턴하는 toSring() 작성
		return "Point(" + x + "," + y + ")";
	}
}

public class ToStringEx{
	public static void main(String[] args) {
		Point p = new Point(2,3);
		System.out.println(p.toString());
		System.out.println(p); // p는 p.toString()으로 자동 변환
		System.out.println(p+" 입니다."); // p.toString() + "입니다"로 자동 변환
	}
}

실행 결과

Point (2,3)

Point (2,3)

Point (2,3) 입니다.

 

* == 연산자와 equals() 메소드

== 연산자는 두 객체의 내용물이 같은지 비교하는 것이 아니라, 두 레퍼런스가 같은지, 즉 두 레퍼런스가 동일한 객체를 가리키는지 비교한다.

ex) a==b : false // 서로 다른 객체를 가리키고 있으므로 false

a==c: true // 서로 같은 객체를 가리키고 있으므로 true

실행 중 객체와 레퍼런스 관계

equals() 메소드는 Object의 equals(Obect obj)는 인자로 건네진 객체 obj와 자기 자신을 비교하여 두 객체의 내용이 같은지를 비교하는 메소드이다.

ex) a.equals(b) : true // 서로 같은 내용을 가지고 있으므로 true

a.equals(c) 혹은 b.equals(c) : false // 서로 다른 내용을 가지고 있으므로 false

Point 객체와 레퍼런스

equals() 메소드를 사용시 주의사항!

내용의 동일성은 전적으로 클래스 작성자가 정의할 문제이기 때문에, 클래스 작성자가 클래스에 equals() 메소드를 오버라이딩하는 것이 원칙이다.

ex) Point 클래스에서 equals() 메소드를 오버라이딩

class Point{
	private int x, y;
	public Point(int x, int y) {
		this.x=x;
		this.y=y;
	}
	public boolean equals(Object obj) { // equals() 오버라이딩
		Point p = (Point)obj; //객체 obj를 Point 타입으로 다운 캐스팅
		if(x==p.x&&y==p.y)return true;
		else return false;
	}
}

public class EqualsEx{
	public static void main(String[] args) {
		Point a = new Point(2,3);
		Point b = new Point(2,3);
		Point c = new Point(2,3);
		if(a==b) // false
			System.out.println("a==b");
		if(a.equals(b)) // true
			System.out.println("a equals to b");
		if(a.equals(c)) // false
			System.out.println("a equals to c");
	}
}

실행경과

a equals to b

반응형