반응형
목차
라이브러리
- 프로그램 개발 시 활용할 수 있는 클래스와 인터페이스들을 모아놓은 것
- 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 - 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(); - e.getMessage()
- 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()
- 객체의 문자 정보 리턴
- equals
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 메소드 자동 생성
- NoArgsConstructor
System 클래스
- out
- 출력
- err
- 에러 출력
- in
- 입력
- exit
- 종료
- currentTimeMillis
- 현재 시간을 밀리초 단위의 long 값으로 리턴
- nanoTime
- getProperty
- getenv
- 진행 시간 읽기
- 1970년 1월 1일 0시부터 시작해서 현재까지 진행된 시간을 리턴
- long currentTimeMillis
- 1/1000 초 단위로 진행된 시간을 리턴
- long nanoTime()
- 1/10^9 초 단위로 진행된 시간을 리턴
- long currentTimeMillis
// 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나노초가 소요되었습니다. - 1970년 1월 1일 0시부터 시작해서 현재까지 진행된 시간을 리턴
시스템 프로퍼티
- 자바 프로그램이 시작될 때 자동 설정되는 시스템의 속성
- 운영체제 종류, 사용자 정보, 자바 버전 등 기본 사양
- 속성
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
반응형
'Java' 카테고리의 다른 글
| 4/14 - 컬렉션 자료 구조, 람다 (0) | 2025.04.19 |
|---|---|
| 4/11 - 멀티 스레드, 컬렉션 자료구조 (2) | 2025.04.12 |
| 4/8 - 상속, 인터페이스, 중첩 선언과 익명 객체 (0) | 2025.04.12 |
| 4/7 - 클래스 (1) | 2025.04.12 |
| 이것이 자바다 - 챕터5 연습 문제 (0) | 2025.04.05 |