본문 바로가기
Java

4/9 - 라이브러리와 모듈, 예외 처리, java.base 모듈 (1)

by Jiwon_Loopy 2025. 4. 12.
반응형

목차


라이브러리


  • 프로그램 개발 시 활용할 수 있는 클래스와 인터페이스들을 모아놓은 것
  • JAR 파일 형태로 존재 (패키지 + 클래스)
  • 프로젝트 연결 (프로퍼티 → 빌드패스 → 라이브러리 추가)
  • 모듈 연결
    • 모듈을 프로젝트에 연결
    • 모듈(jar) 프로젝트 연결
  • 필요한 라이브러리 → mvnrepository.con → 다운로드 (maven, gradle 용 복사)
  • BuildPath → Configure Build Path → 등록
package pack1;

public class A {
	public void method() {
		System.out.println("A=method 실행");
	}
}

package pack2;

public class B {
	public void method() {
		System.out.println("B=method 실행");
	}
}

package app;

import pack1.A;
import pack2.B;

public class Main {

	public static void main(String[] args) {
		A a = new A();
		B b = new B();
		
		a.method();
		b.method();
	}

}

실행 결과

A=method 실행
B=method 실행
  • 콘솔에서 실행
D:\\java\\workspace\\my_application_1\\bin>cd..

D:\\java\\workspace\\my_application_1>cd bin

D:\\java\\workspace\\my_application_1\\bin>java -classpath D:\\java\\workspace\\my_lib\\dist\\my_lib.jar;. app.Main
A=method 실행
B=method 실행

모듈


  • JavaProject 생성 → Create module-info.java file 체크 → 모듈명 입력으로 생성
  • 모듈 내보내기
// A 모듈
package pack1;

public class A {
	public void method() {
		System.out.println("A=method 실행");
	}
}

package pack2;

public class B {
	public void method() {
		System.out.println("B=method 실행");
	}
}
// B 모듈
package pack3;

public class C {
	public void method() {
		System.out.println("A=method 실행");
	}
}

package pack4;

public class D {
	public void method() {
		System.out.println("B=method 실행");
	}
}

// A 모듈 내보내기
module my_module_a {
	exports pack1;
	exports pack2;
}
// B 모듈 내보내기
module my_module_b {
	exports pack3;
	exports pack4;
}
// A, B 모듈 가저오기
module my_application_2 {
	requires my_module_a;
	requires my_module_b;
}

 

모듈 추가

package app;

import pack1.A;
import pack2.B;
import pack3.C;
import pack4.D;

public class Main {

	public static void main(String[] args) {
		A a = new A();
		B b = new B();
		C c = new C();
		D d = new D();

		a.method();
		b.method();
		c.method();
		d.method();
	}
}

실행 결과

A=method 실행
B=method 실행
C=method 실행
D=method 실행
  • 배포용 파일 만들기
    • Export → JAR File → src 폴더만 체크 → Select the export destination → Browse → 해당 모듈파일 이동 → .jar 확장자로 저장
    • BuildPath → Configure Build Path →Library → JAR and class folders on the build path → Modulepath 선택 → Add External JARs → 각 모듈의 dist 파일로 이동하여 jar파일 추가
    module my_application_3 {
    	requires my_module_a;
    	requires my_module_b;
    }
    
    package app;
    
    import pack1.A;
    import pack2.B;
    import pack3.C;
    
    public class Main {
    	public static void main(String[] args) {
    		A a = new A();
    		B b = new B();
    		C c = new C();
    		
    		a.method();
    		b.method();
    		c.method();
    	}
    }
    
    실행 결과
    
    A=method 실행
    B=method 실행
    C=method 실행
    
    
  • 패키지 은닉
    • export 키워드를 쓰지 않으면 내보내지지 않아 해당 모듈을 은닉 처리 할 수 있다.
    • transitive로 전달(전이 의존)
      • a가 b에 의존한다고 해서 모두 쓸 수 있는 것은 아님

리플렉션


  • 실행 도중에 타입(클래스, 인터페이스 등)을 검사하고 구성 멤버를 조사하는 것

예외와 예외 클래스


  • 오류
    • 에러
      • 컴퓨터, 하드웨어 고장
      • 제어 불가
    • 일반 예외
      • 제어 가능
  • 예외
    • 일반 예외
      • 컴파일러가 예외 처리 코드 여부를 검사
      • 빨간 줄
    • 실행 예외
      • 컴파일러가 예외 처리 코드 여부를 검사하지 않음
      • 실행 시 예외 발생
  • 강제 예외 발생
    • throw new 예외클래스();
  • 사용자 정의 예외 클래스
    • Exception을 상속받고 생성자에서 super(msg);
  • 용도
    • 프로그램이 중지되지 않도록
    • 디버깅 (버그 원인)
    • 어쩔 수 없이
  • Throwable
    • 자바의 모든 에러, 예외 클래스가 상속 받는 클래스
    • 예외 클래스는 Exception 클래스를 상속 받음
    • Trowable
      • Exception
      • Error
package ch11.sec02.exam01;

public class ExceptionEx {
	public static void main(String[] args) {
		System.out.println("시작");
		int a = 3;
		int b = 0;
		int c = a/b; // 예외 발생
		System.out.println("끝");		
	}
}

실행 결과

시작
Exception in thread "main" java.lang.ArithmeticException: / by zero
	at ch11.sec02.exam01.ExceptionEx.main(ExceptionEx.java:8)

  • 기본 예외 처리
    • try - catch - finally
      • 발생하는 예외를 예상하여 처리할 수 있게 해주는 구문
      package ch11.sec02.exam01;
      
      public class ExceptionEx {
      	public static void main(String[] args) {
      
      		try {
      			System.out.println("시작");
      			int a = 3;
      			int b = 0;
      			int c = a / b; // 예외 발생
      			System.out.println("끝");
      		} catch (ArithmeticException e) {
      			System.out.println("예외 발생");
      		} finally {
      			System.out.println("무조건 실행");
      		}
      	}
      }
      
      실행 결과
      
      시작
      예외 발생
      무조건 실행
      
    • 예외 발생 시 catch로 넘어옴
    • finally는 항상 실행됨
try {
		// 예외가 발생 가능성 있는 코드
	} catch (Exception e) {
	  // 예외가 발새하면 실행되는 코드
	} finally {
		// 항상 실행되는 코드
	}
  • 예외 보는 법
    • e.getMessage()
      • 단순 문자열
    • e.toString()
      • 예외 + 메세지
    • e.printStackTrace()
      • 모든 예외 메세지
    package ch11.sec02.exam01;
    
    public class ExceptionEx {
    	public static void main(String[] args) {
    
    		try {
    			System.out.println("시작");
    			int a = 3;
    			int b = 0;
    			int c = a / b; // 예외 발생
    			System.out.println("끝");
    		} catch (ArithmeticException e) {
    			System.out.println("예외 발생");
    			System.out.println(e.getMessage());
    			System.out.println(e.toString());
    			e.printStackTrace();
    		}
    	}
    }
    
    실행 결과
    
    시작
    예외 발생
    / by zero // System.out.println(e.getMessage());
    java.lang.ArithmeticException: / by zero // System.out.println(e.toString());
    java.lang.ArithmeticException: / by zero
    	at ch11.sec02.exam01.ExceptionEx.main(ExceptionEx.java:10) // e.printStackTrace();
    
  • catch 구문을 연속적으로 참조하여 쓸 수 있음
  • catch는 단 1개만 걸림
  • Exception은 모든 예외 클래스의 부모 클래스 이므로, 해당 클래스를 매개변수로 catch 구문에서 에러를 잡을 때 예외를 알아내기 가장 쉽다.
  • 예외 순서는 작은 것부터 큰 것으로
    • 상위 예외 클래스는 항상 마지막에 작성
    • Exception의 경우 항상 마지막

여러가지 예외


  • ArithmeticException
    • 0으로 나누었을 때 발생
  • ArrayIndexOutOfBoundsException
    • 배열의 범위를 벗어난 곳을 참조했을 때 발생
  • NullPointerException
    • Null 값이 발생했을 때 발생

API 도큐먼트


  • 자바에서 기본적으로 제공하는 클래스, 메서드

Java Platform, Standard Edition Documentation - Releases

 

Java Platform, Standard Edition Documentation - Releases

Java Platform, Standard Edition documentation, current and previous releases

docs.oracle.com

 

Java® Platform, Standard Edition & Java Development Kit Version 21 API Specification

 

Overview (Java SE 21 & JDK 21)

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

 

  • java.base 모듈
    • 모든 모듈이 의존하는 기본 모듈

Object 클래스


  • extends로 상속하지 않은 모든 클래스는 암시적으로 Object 클래스를 상속하게 됨
  • 주요 메서드
    • equals
      • 객체의 번지를 비교하고 리턴
    • hashcode
      • 객체의 해시 코드를 리턴
    • toString()
      • 객체의 문자 정보 리턴
package ch12.sec03.exam01;

public class Member {
	public String id;
	
	public Member(String id) {
		this.id = id;
	}
	
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Member target) {
			if(id.equals(target.id)) {
				return true;
			}
		}
		return false;
	}
	
	@Override
	public String toString() {
		return "[Member] id:" + this.id;
	}
}

package ch12.sec03.exam01;

public class EqualsExample {

	public static void main(String[] args) {
		Member obj1 = new Member("blue");
		Member obj2 = new Member("blue");
		Member obj3 = new Member("red");

		if (obj1.equals(obj2)) {
			System.out.println("obj1과 obj2는 동등합니다.");
		} else {
			System.out.println("obj1과 obj2는 동등하지 않습니다.");
		}

		if (obj1.equals(obj3)) {
			System.out.println("obj1과 obj3는 동등합니다.");
		} else {
			System.out.println("obj1과 obj3는 동등하지 않습니다.");
		}
		
		System.out.println();
		System.out.println(obj1.toString());
		System.out.println(obj2.toString());
		System.out.println(obj3.toString());

	}

}

실행 결과

obj1과 obj2는 동등합니다.
obj1과 obj3는 동등하지 않습니다.

[Member] id:blue
[Member] id:blue
[Member] id:red

Lombok


  • 설치
    • 사이트 최신 버전 → files에서 jar파일 다운로드

    • cmd → 해당 파일 실행
    D:\\java>java -jar lombok-1.18.38.jar
    
    • eclipse 프로젝트에 다운 받은 jar파일 넣고, Build Path → Add to Build Path
    • 어노테이션 @, 사용 가능
    package ch12.sec03.exam01;
    
    import lombok.Getter;
    import lombok.Setter;
    import lombok.ToString;
    
    @ToString
    @Getter
    @Setter
    public class Member {
    	public String id;
    	
    	public Member(String id) {
    		this.id = id;
    	}
    	
    	@Override
    	public boolean equals(Object obj) {
    		if(obj instanceof Member target) {
    			if(id.equals(target.id)) {
    				return true;
    			}
    		}
    		return false;
    	}
    	
    }
    
    package ch12.sec03.exam01;
    
    public class EqualsExample {
    
    	public static void main(String[] args) {
    		Member obj1 = new Member("blue");
    		Member obj2 = new Member("blue");
    		Member obj3 = new Member("red");
    		
    		System.out.println();
    		System.out.println(obj1.toString());
    		System.out.println(obj2.toString());
    		System.out.println(obj3.toString());
    		
    		System.out.println();
    		System.out.println(obj1.getId());
    		System.out.println(obj2.getId());
    		System.out.println(obj3.getId());
    		
    		obj1.setId("yellow");
    		obj2.setId("green");
    		obj3.setId("sky");
    		
    		System.out.println();
    		System.out.println(obj1.getId());
    		System.out.println(obj2.getId());
    		System.out.println(obj3.getId());
    	}
    
    }
    
    실행 결과
    
    Member(id=blue)
    Member(id=blue)
    Member(id=red)
    
    blue
    blue
    red
    
    yellow
    green
    sky
    
    
  • 순환 참조 (각 클래스가 서로 참조할 경우 ToString을 무한 참조하므로, 에러 발생)
  • 어노테이션 종류
    • NoArgsConstructor
      • 기본(매개변수가 없는) 생성자 포함
    • AllArgsConstructor
      • 모든 필드를 초기화시키는 생성자 포함
    • RequiredArgsConstructor
      • 기본적으로 매개변수가 없는 생성자 포함
      • final, @NonNull이 붙은 필드가 있다면 해당 필드만 초기화시키는 생성자 포함
    • Getter
    • Setter
    • EqualsAndHashCode
    • ToString
    • Data
      • Getter, Setter, hashCode, equals, toString 메소드 자동 생성

System 클래스


  • out
    • 출력
  • err
    • 에러 출력
  • in
    • 입력
  • exit
    • 종료
  • currentTimeMillis
    • 현재 시간을 밀리초 단위의 long 값으로 리턴
  • nanoTime
  • getProperty
  • getenv
  • 진행 시간 읽기
    • 1970년 1월 1일 0시부터 시작해서 현재까지 진행된 시간을 리턴
      • long currentTimeMillis
        • 1/1000 초 단위로 진행된 시간을 리턴
      • long nanoTime()
        • 1/10^9 초 단위로 진행된 시간을 리턴
    // 1부터 1000000까지의 합을 구하는 데 걸린 시간 계산
    package ch12.sec04;
    
    public class MeasureRunTimeExample {
    	public static void main(String args[]) {
    		long time1 = System.nanoTime();
    		int sum = 0;
    		for(int i = 1; i <= 1000000; i++) {
    			sum += i;
    		}
    		long time2 = System.nanoTime();
    		
    		System.out.println("1~1000000까지의 합: " + sum);
    		System.out.println("계산에 "+ (time2-time1) + "나노초가 소요되었습니다.");
    	}
    }
    
    실행 결과
    
    1~1000000까지의 합: 1784293664
    계산에 1801800나노초가 소요되었습니다.
    

시스템 프로퍼티


  • 자바 프로그램이 시작될 때 자동 설정되는 시스템의 속성
  • 운영체제 종류, 사용자 정보, 자바 버전 등 기본 사양
  • 속성
    • java.specification.version
      • 자바 스펙 버전
      • 17, 21 ..
    • java.home
      • JDK 디렉토리 경로
        • C:\Program Files\Java\jdk-17.0.3
    • os.name
      • 운영체제
        • Windows 10
    • user.name
      • 사용자 이름
        • xxx
    • user.home
      • 사용자 홈 디렉토리 경로
        • 경로
    • user.dir
      • 현재 디렉토리 경로
package ch12.sec04;

import java.util.Properties;
import java.util.Set;

public class GetPropertyExample {

	public static void main(String[] args) {
		String osName = System.getProperty("os.name");
		String userName = System.getProperty("user.name");
		String userHome = System.getProperty("user.home");
		System.out.println(osName);
		System.out.println(userName);
		System.out.println(userHome);
		
		System.out.println("----------------------");
		System.out.println(" key: value");
		System.out.println("----------------------");
		Properties props = System.getProperties();
		Set keys = props.keySet();
		
		for(Object objKey : keys) {
			String key = (String) objKey;
			String value = System.getProperty(key);
			System.out.printf("%-40s: %s\\n",key,value);
		}
		
	}

}

실행 결과

Windows 10
fzaca
C:\\Users\\fzaca
----------------------
 key: value
----------------------
java.specification.version              : 17
sun.cpu.isalist                         : amd64
sun.jnu.encoding                        : MS949
java.class.path                         : D:\\java\\workspace\\thisisjava\\bin;D:\\java\\workspace\\thisisjava\\lib\\lombok-1.18.38.jar
java.vm.vendor                          : Eclipse Adoptium
sun.arch.data.model                     : 64
user.variant                            : 
java.vendor.url                         : <https://adoptium.net/>
java.vm.specification.version           : 17
os.name                                 : Windows 10
sun.java.launcher                       : SUN_STANDARD
user.country                            : KR
sun.boot.library.path                   : D:\\java\\eclipse\\plugins\\org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_17.0.10.v20240120-1143\\jre\\bin
sun.java.command                        : ch12.sec04.GetPropertyExample
jdk.debug                               : release
sun.cpu.endian                          : little
user.home                               : C:\\Users\\fzaca
user.language                           : ko
java.specification.vendor               : Oracle Corporation
java.version.date                       : 2024-01-16
java.home                               : D:\\java\\eclipse\\plugins\\org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_17.0.10.v20240120-1143\\jre
file.separator                          : \\
java.vm.compressedOopsMode              : Zero based
line.separator                          : 

java.vm.specification.vendor            : Oracle Corporation
java.specification.name                 : Java Platform API Specification
user.script                             : 
sun.management.compiler                 : HotSpot 64-Bit Tiered Compilers
java.runtime.version                    : 17.0.10+7
user.name                               : fzaca
stdout.encoding                         : UTF-8
path.separator                          : ;
os.version                              : 10.0
java.runtime.name                       : OpenJDK Runtime Environment
file.encoding                           : UTF-8
java.vm.name                            : OpenJDK 64-Bit Server VM
java.vendor.version                     : Temurin-17.0.10+7
java.vendor.url.bug                     : <https://github.com/adoptium/adoptium-support/issues>
java.io.tmpdir                          : C:\\Users\\fzaca\\AppData\\Local\\Temp\\
java.version                            : 17.0.10
user.dir                                : D:\\java\\workspace\\thisisjava
os.arch                                 : amd64
java.vm.specification.name              : Java Virtual Machine Specification
sun.os.patch.level                      : 
native.encoding                         : MS949
java.library.path                       : D:\\java\\eclipse\\plugins\\org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_17.0.10.v20240120-1143\\jre\\bin;C:\\Windows\\Sun\\Java\\bin;C:\\Windows\\system32;C:\\Windows;D:/java/eclipse//plugins/org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_17.0.10.v20240120-1143/jre/bin/server;D:/java/eclipse//plugins/org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_17.0.10.v20240120-1143/jre/bin;C:\\Program Files\\Java\\jdk-17\\bin;C:\\Program Files\\Common Files\\Oracle\\Java\\javapath;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Windows\\System32\\OpenSSH\\;C:\\Program Files\\Bandizip\\;C:\\Users\\fzaca\\AppData\\Local\\Microsoft\\WindowsApps;;D:\\java\\eclipse;;.
java.vm.info                            : mixed mode
stderr.encoding                         : UTF-8
java.vendor                             : Eclipse Adoptium
java.vm.version                         : 17.0.10+7
sun.io.unicode.encoding                 : UnicodeLittle
java.class.version                      : 61.0

메모


  • 자바6, 8 = 자바 1.6, 1.8
  • 개발 = JDK
  • 실행 = JRE
  • 지금은 JDK안에 JRE가 포함되어 있음
  • throw는 예외 떠넘기기, throws는 새로운 예외 발생
// throw
public void checkAge(int age) {
    if (age < 18) {
        throw new IllegalArgumentException("미성년자는 허용되지 않습니다.");
    }
}

// throws
public void readFile(String fileName) throws IOException {
    FileReader reader = new FileReader(fileName);
}
  • 롬복을 실행할 때 필요없으므로 서버에 올리지 않아도 됨
    • 빌드 시 어노테이션을 보고, 컴파일 시에 추가해줌 → 이 과정에서 이미 파일에 추가되므로 실제 서버에 jar 배포 시 필요하지 않음
728x90
반응형