이전 내용
[java] 예외 (클래스, 처리), 다중 catch, 예외 떠넘기기, String args[]
이전 내용 [java] 인터페이스 상속, 중첩 클래스, 중첩 인터페이스이전 내용 [java] instanceof, 인터페이스, 구현 클래스이전 내용 [java] 추상 클래스, 추상 메소드이전 내용 [java] 클래스의 타입 변
puppy-foot-it.tistory.com
java.lang 패키지
◆ java.lang 패키지: 자바 프로그램의 기본적인 클래스를 담고 있는 패키지. 자바의 모든 프로그램에서 자동으로 포함된다.
[java.lang 패키지의 주요 클래스]
클래스 | 용도 | |
Object | - 자바 클래스의 최상위 클래스로 사용 | |
System | - 표준 입력 장치(키보드)로부터 데이터를 입력받을 때 사용 - 표준 출력 장치(모니터)로 출력하기 위해 사용 - 자바 가상 기계(JVM)를 종료할 때 사용 - 쓰레기 수집기(가바지 콜렉터, GC)를 실행 요청할 때 사용 |
|
Class | - 클래스를 메모리로 로딩할 때 사용 | |
String | - 문자열을 저장하고 여러 가지 정보를 얻을 때 사용 | |
Wrapper | Byte, Short, Character, Integer, Float, Double, Boolean, Long |
- 기본 타입의 데이터를 갖는 객체를 만들 때 사용 - 문자열을 기본 타입으로 변환할 때 사용 - 입력값 검사에 사용 |
Math | - 수학 함수를 이용할 때 사용 |
Object 클래스
Object 클래스는 자바의 최상위 부모 클래스로, 자바의 모든 클래스는 Object 클래스의 자식이거나 자손 클래스이다.
Object 클래스는 필드를 가지지 않으며, 총 11개의 메소드만으로 구성되어 있다.
◆ 주요 메소드
메소드 | 설명 |
boolean equals(Object obj) | - 두 객체가 동일한지 비교 : 동일하면 true, 그렇지 않으면 false 리턴 - 기본적으로는 객체의 메모리 주소를 비교하지만, 이 메소드를 오버라이드하여 객체의 내용(예: 속성 값) 비교가 가능하도록 할 수 있음 |
int hashCode() | - 객체의 해시 코드 값 반환 * 객체 해시코드: 객체를 식별하는 하나의 정수값. - equals() 메소드를 오버라이드할 경우, hashCode()도 반드시 함께 오버라이드해야 함. |
String toString() | - 객체의 문자열 표현을 반환 * 객체 문자열 표현(문자 정보): 기본적으로 '클래스이름@16진수해시코드'로 구성된 문자 정보 리턴 - 디버깅이나 로깅 시 유용하며, 사용자 정의 클래스에서 내용을 표시하도록 오버라이드 |
Class getClass() | - 객체의 런타임 클래스 정보 반환 - 해당 객체가 어떤 클래스의 인스턴스인지 확인 가능 |
Object clone() | - 해당 객체의 복제본 생성 - 이 메소드를 사용하려면 클래스가 Cloneable 인터페이스를 구현해야 함. |
void finalize() | - 가비지 컬렉션을 수행하기 전에 객체가 소멸되기 직전에 호출되는 메소드 - 이 메소드는 사용 자제 권장 |
void notify() | - wait된 스레드 실행을 재개할 때 호출 |
void notifyAll() | - wait된 모든 스레드 실행을 재개할 때 호출 |
void wait() void wait(long timeout) void wait(long timeout, int nanos) |
- 스레드를 일시적으로 중지할 때 호출 - 주어진 시간만큼 스레드를 일시적으로 중지할 때 호출 |
// 객체 동등 비교 메소드
public class Member {
public String id;
public Member(String id) {
this.id = id;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Member) { // 매개값이 Member 타입인지 확인
Member member = (Member) obj; // Member 타입으로 강제 변환하고
if (id.equals(member.id)) { // id 필드값이 동일한지 검사
return true; // 동일할 경우 true 반환
}
}
return false; // 매개값이 Member 타입이 아니거나, id 필드값이 다른 경우 false 반환
}
@Override
public int hashCode() {
return id.hashCode(); // id 가 동일한 문자열인 경우 같은 해시코드 리턴
}
@Override
public String toString() {
return "Member [id=" + id + "]";
}
}
※ 이클립스에서 자바 사용 시, toString() 메소드를 수작업으로 쓰지 않고 자동으로 생성하는 방법
[Source] - [Generate toString()]
원하는 변수들을 추가하고 Generate 클릭
코드에 아래와 같이 자동으로 추가된다.
@Override
public String toString() {
return "Member [id=" + id + "]";
}
※ Object의 toString() 메소드의 리턴값은 자바 애플리케이션에서는 별 값어치가 없는 정보이므로, Object 하위 클래스는 toString() 메소드를 재정의하여 간결하고 유익한 정보를 리턴하도록 되어 있다.
- java.util 패키지의 Date 클래스: 현재 시스템의 날짜외 시간 정보 리턴
- java.lang 패키지의 String 클래스: 저장하고 있는 문자열 리턴
[Object 클래스의 값을 비교하고 출력해보는 예제]
public class MemberExample {
public static void main(String[] args) {
Member obj1 = new Member("blue");
Member obj2 = new Member("blue");
Member obj3 = new Member("red");
// 해시코드 호출
System.out.println(obj1.hashCode());
System.out.println(obj2.hashCode());
System.out.println(obj3.hashCode());
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(obj1);
String str = obj1.toString();
System.out.println(str);
}
}
System 클래스
여태까지 콘솔에 출력을 위해 사용했던 명령어를 기억하는가.
System.out.println();
System 클래스를 이용하면 운영체제의 일부 기능 (프로그램 종료, 키보드로부터 입력, 모니터로 출력, 현재 시간 읽기 등) 을 이용할 수 있다.
[System 클래스의 주요 기능 및 메소드]
1. 입출력 스트림:
- System.out: 표준 출력 스트림. 일반적으로 콘솔에 메시지를 출력하는 데 사용된다. ex) System.out.println()이라는 메소드를 사용하여 메시지 출력.
- System.err: 표준 오류 출력 스트림. 에러 메시지 등을 출력할 때 사용.
- System.in: 표준 입력 스트림. 사용자가 입력한 데이터를 읽어오는 데 사용.
2. 환경 변수 및 시스템 속성:
- System.getProperty(String key): 지정된 키에 대한 시스템 속성 값을 가져오기. ex) Java 버전이나 운영체제 정보 확인.
- System.getenv(String name): 지정된 환경 변수의 값에 접근.
3. 가비지 컬렉션:
- System.gc(): JVM에게 가비지 컬렉션 요청. 하지만 이 호출이 반드시 가비지 컬렉션이 발생하는 것은 아니며, JVM의 결정에 따라 다름.
4. 시간 측정:
- System.currentTimeMillis(): 현재 시간을 밀리초 단위로 반환. 성능 측정 등에 유용하게 사용.
- System.nanoTime(): 현재 시간을 나노초 단위로 반환. 더 정밀한 시간 측정 가능.
5. 배열 복사:
- System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length): 하나의 배열에서 다른 배열로 요소를 복사. 효율적인 배열 복사를 위해 사용.
6. 프로그램 종료:
- System.exit(0): 현재 실행하고 있는 프로세스를 강제 종료시키는 역할. exit() 메소드는 int 매개값(종료 상태값)을 지정하도록 되어 있다. ▶ 정상 종료일 경우 0
public class SystemExample {
public static void main(String[] args) {
// 표준 출력 스트림 사용
System.out.println("Hello, World!");
// 현재 시스템 속성 출력
System.out.println("Java 버전: " + System.getProperty("java.version"));
System.out.println("운영체제: " + System.getProperty("os.name"));
// 시간 측정
long startTime = System.currentTimeMillis();
// 가상의 작업 수행
for (int i = 0; i < 1000000; i++) {
Math.sqrt(i);
}
long endTime = System.currentTimeMillis();
System.out.println("소요 시간: " + (endTime - startTime) + " 밀리초");
}
}
Class 클래스
클래스의 의름, 생성자 정보, 필드 정보, 메소드 정보 등의 메타 데이터를 java.lang 패키지에 소속된 Class 클래스로 관리한다. 이 클래스는 자바 프로그램 내에서 클래스의 정보를 동적으로 접근하고 조작하는 데 사용된다.
[Class 클래스의 주요 기능 및 메소드]
1. 클래스 정보 접근:
- getName(): 클래스의 이름 반환.
- getSuperclass(): 해당 클래스의 슈퍼클래스(부모클래스) 반환.
- getInterfaces(): 클래스가 구현한 인터페이스(들) 반환.
2. 필드, 메소드, 생성자 정보:
- getDeclaredFields(): 해당 클래스의 모든 필드 정보 가져옴.
- getDeclaredMethods(): 해당 클래스의 모든 메소드 정보 가져옴.
- getDeclaredConstructors(): 해당 클래스의 모든 생성자 정보 가져옴.
3. 인스턴스 생성:
- newInstance(): 해당 클래스의 새로운 인스턴스 생성. 단, 기본 생성자가 필요하며, 이는 예외 처리가 필요하다.
4. 어노테이션 정보:
- getAnnotations(): 클래스에 사용된 어노테이션 정보 반환.
class Person {
private String name;
public int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void introduce() {
System.out.println("안녕하세요! 제 이름은 " + name + "이고, 나이는 " + age + "세입니다.");
}
}
public class ClassExample {
public static void main(String[] args) {
try {
// Person 클래스의 Class 객체 생성
Class<?> personClass = Class.forName("Person");
// 클래스 정보 출력
System.out.println("클래스 이름: " + personClass.getName());
System.out.println("슈퍼클래스: " + personClass.getSuperclass());
// 생성자 정보 출력
System.out.println("생성자 정보: ");
for (var constructor : personClass.getDeclaredConstructors()) {
System.out.println(constructor);
}
// 메소드 정보 출력
System.out.println("메소드 정보: ");
for (var method : personClass.getDeclaredMethods()) {
System.out.println(method);
}
// 필드 정보 출력
System.out.println("필드 정보: ");
for (var field : personClass.getDeclaredFields()) {
System.out.println(field);
}
// 인스턴스 생성
Object personInstance = personClass.getDeclaredConstructor(String.class, int.class)
.newInstance("Alice", 30);
// 메소드 호출
personClass.getMethod("introduce").invoke(personInstance);
} catch (Exception e) {
e.printStackTrace();
}
}
}
String 클래스
String 클래스는 자바에서 문자열을 다루기 위한 중요한 클래스로, 이 클래스는 문자열 값을 표현하고 조작하기 위한 다양한 메소드들을 제공한다. 자바의 String 객체는 불변(immutable)이기 때문에, 한 번 생성된 문자열 객체는 그 내용이 변경되지 않는다. 이러한 불변성 덕분에 문자열 객체는 안전하게 공유될 수 있다.
[String 클래스의 대표적인 메소드]
String 클래스는 문자열의 추출, 비교, 찾기, 분리, 변환 등과 같은 다양한 메소드를 가지고 있다.
리턴 타입 | 메소드 이름(매개변수) | 설명 |
char | charAt(int index) | 특정 위치의 문자 리턴 |
boolean | equals(Object anObject) | 두 문자열 비교 |
boolean | equalsIgonoreCase(Object anObject) | 대소문자 구분 없이 두 문자열 비교 |
byte[] | getBytes() | byte[]로 리턴 |
byte[] | getBytes(Charset charset) | 주어진 문자셋으로 인코딩한 byte[]로 리턴 |
int | IndexOf(String str) | 문자열 내에서 주어진 문자열의 위치 리턴 |
int | length() | 총 문자 수 리턴 |
String | concat(String str) | 두 문자열 결합 |
String | replace(CharSequence tartgeet, CharSequence replacement) | target 부분을 replacement로 대치한 새로운 문자열 리턴 |
String | substring(int beginIndex) | beginIndex 위치에서 끝까지 잘라낸 새로운 문자열 리턴 |
String | substring(int beginIndex, int endIndex) | beginIndex 위치에서 endIndex 전까지 잘라낸 새로운 문자열 리턴 |
String | toLowerCase() | 알파벳 소문자로 변환한 새로운 문자열 리턴 |
String | toUpperCase() | 알파벳 대문자로 변환한 새로운 문자열 리턴 |
String | trim() | 앞뒤 공백을 제거한 새로운 문자열 리턴 |
String | valueOf(int i) valueOf(double d) |
기본 타입 값을 문자열로 리턴 |
[String 클래스 예제 코드]
public class StringExample {
public static void main(String[] args) {
// 문자열 생성
String greeting = "Hello, World!";
// 문자열 길이
System.out.println("길이: " + greeting.length());
// 특정 문자 접근
System.out.println("첫 번째 문자: " + greeting.charAt(0));
// 부분 문자열
System.out.println("부분 문자열: " + greeting.substring(7, 12));
// 문자열 결합
String newGreeting = greeting.concat(" How are you?");
System.out.println("결합된 문자열: " + newGreeting);
// 문자열 비교
System.out.println("비교 결과: " + greeting.equals("Hello, World!"));
// 문자열 치환
String replacedGreeting = greeting.replace("World", "Java");
System.out.println("치환된 문자열: " + replacedGreeting);
// 대문자 변환
System.out.println("대문자: " + greeting.toUpperCase());
}
}
Wrapper 클래스
◆ 포장 객체: 자바의 기본 타입의 값을 갖는 객체. 기본 타입의 값을 내부에 두고 포장하여 외부에서 변경할 수 없으며, 내부의 값 변경 시에는 새로운 포장 객체를 만들어야 한다.
Wrapper 클래스는 이러한 포장 객체를 위해 제공되는 클래스로, 래퍼 클래스를 사용하면 기본 타입의 값을 객체 형태로 사용할 수 있다. 이는 컬렉션 클래스(ArrayList, HashMap 등)와 같은 데이터 구조에 저장할 때 필요하다.
※ 컬렉션 클래스
자바에서 데이터의 집합을 다루기 위해 제공되는 클래스 및 인터페이스의 집합이다. 컬렉션 프레임워크는 데이터를 저장, 검색, 조작하는 데 필요한 통합된 구조를 제공하여, 다양한 유형의 데이터 집합을 효과적으로 관리할 수 있도록 돕는다.
- ArrayList: 가변 길이의 배열로 구현된 리스트. 요소에 빠르게 접근할 수 있지만, 요소 삽입 및 삭제 시 성능이 저하될 수 있다.
- HashMap: 해시 테이블을 기반으로 한 Map 구현. 키-값 쌍을 저장하며 빠른 접근 속도를 제공한다.
기본 데이터 타입 | 래퍼 클래스 |
boolean | Boolean |
byte | Byte |
char | Character |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
◆ 박싱(Boxing)과 언박싱(UnBoxing): 기본 데이터 타입과 래퍼 클래스 간의 변환
- 박싱: 기본 타입의 값 → 포장 객체: 원시 타입의 값을 해당하는 객체 형태로 감싸게 된다.
- 언박싱: 포장 객체 → 기본 타입의 값: 래퍼 클래스 객체의 값이 원사티입으로 변환되며, 언박싱은 기본 데이터 타입의 안전한 접근을 허용한다.
박싱의 예: int 라는 숫자를 Integer 라는 상자에 포장
int primitiveInt = 42; // 기본 데이터 타입
Integer wrappedInt = Integer.valueOf(primitiveInt); // 명시적 박싱
언박싱의 예: Integer 상자에서 int 값을 꺼냄
Integer wrappedInt = Integer.valueOf(42); // 래퍼 클래스
int primitiveInt = wrappedInt.intValue(); // 명시적 언박싱
자바 5부터는 자동 방식 및 언박싱 기능이 도입되어, 개발자가 명시적으로 변환하지 않아도 자바가 자동으로 처리해 준다.
Integer autoBoxedInt = primitiveInt; // 자바가 자동으로 박싱
int autoUnboxedInt = wrappedInt; // 자바가 자동으로 언박싱
◆ 문자열을 기본 타입으로 변환
포장 클래스는 문자열을 기본 타입 값으로 변환할 때도 많이 사용된다.
대부분의 포장 클래스에는 'parse+기본 타입 이름'으로 되어 있는 정적(static) 메소드가 있는데, 이 메소드는 문자열을 매개값으로 받아 기본 타입 값으로 변환한다.
기본타입의 이용 | |
byte | num = Byte.parseByte("1 Q"); |
short | num = Short.parseShort("100"); |
int | num = lnteger.parselnt("1000"); |
long | num = Long.parselong("10000"); |
float | num = Float.parseFloat("2.5F"); |
double | num = Double.parseDouble("3.5"); |
boolean | bool = Boolean.parseBoolean("true"); |
◆ 포장 값 비교
포장 객체는 내부의 값을 비교하기 위해 == 나 != 연산자를 사용하면 내부의 값이 아닌 포장 객체의 참조를 비교하기 때문에 사용하지 말고, 아래의 두 가지 방법으로 비교하는 것이 좋다.
- equals() 메소드로 비교
- 직접 내부 값을 언박싱해서 비교
[값의 범위]
- boolean: true, false
- char: \u0000 ~ \u007f
- byte, short, int : -128 ~ 127
public class ValueCompareExample {
public static void main(String[] args) {
System.out.println("[-128~127 초과값일 경우]");
Integer obj1 = 300;
Integer obj2 = 300;
System.out.println("== 결과: " + (obj1 == obj2));
System.out.println("언박싱 후 결과: " + (obj1.intValue() == obj2.intValue()));
System.out.println("equals() 결과: " + obj1.equals(obj2));
System.out.println();
System.out.println("[-128~127 범위값일 경우]");
Integer obj3 = 10;
Integer obj4 = 10;
System.out.println("== 결과: " + (obj3 == obj4));
System.out.println("언박싱 후 결과: " + (obj3.intValue() == obj4.intValue()));
System.out.println("equals() 결과: " + obj3.equals(obj4));
}
}
Math 클래스
Math 클래스는 수학 계산에 사용할 수 있는 메소드를 제공하며, Math 클래스가 제공하는 메소드는 모두 정적(static) 메소드이므로 Math 클래스로 바로 사용이 가능하다. 이 클래스는 수학 계산을 위해 최적화딘 알고리즘이 구현되어 있어, 효율적으로 계산을 수행한다.
※ 정적 메소드란?
정적 메소드는 클래스 수준에서 호출할 수 있는 메소드다. 이 메소드는 특정 인스턴스(객체)를 생성하지 않고도 클래스명으로 직접 호출할 수 있다. 즉, 정적 메소드는 클래스에 속하며, 객체의 상태에 의존하지 않는다.
[주요 메소드]
매소드 | 설명 | 예제 코드 | 리턴값 |
int abs(int a) double abs(double a) |
절대값 | int v1 = Math.abs(- 5); double v2 = Math.abs(- 3.14); |
v1 = 5 v2 = 3.14 |
double ceil(double a) | 올림값 | double v3 = Math.ceil(5.3), double v4 = Math.ceil(- 5.3); |
v3 = 6.0 v4 =-5.0 |
double floor(double a) | 버림값 | double v5 = Math.floor(5.3); double v6 = Math.floor(—5.3); |
v5 = 5.0 v6 = - 6.0 |
int max(int a. int b) double max(double a, double b) |
최대값 | int v7 = Math.max(5. 9); double v8 = Math.max(5.3. 2.5); |
v7 = 9 v8 = 5.3 |
int min(int a. int b) double min(double a. double b) |
최소값 | int v9 = Math.min(5, 9); double v1 0 = Math.min(5.3. 2.5); |
v9 = 5 v10 = 2.5 |
double random() | 랜덤값 | double v11 = Math.random(); | 0.0 <= v11 <1.0 |
double rint(double a) | 가까운 정수의 실수값 | double v12 = Math.rint(5.3); double v13 = Math.rint(5.7); |
v12 = 5.0 v13 = 6.0 |
long round(double a) | 반올림값 | long v14 = Math.round(5.3); long v15 = Math.round(5.7); |
v14 = 5 v15 = 6 |
double sqrt(double a) | 제곱근 | double v16 = Math.sqrt(25); | v16 = 5 |
double pow(double a, double b) | 제곱 | double v17 = Math.pow(2, 5); | v17 = 32 |
double log(double a) | 로그 및 지수 |
자연 로그(밑이 e) 계산을 수행 | |
double exp(double a) | e의 a제곱을 반환 | ||
double sin(double a) | 삼각함수 |
라디안 단위의 사인값 반환 | |
double cos(double a) | 라디안 단위의 코사인값 반환 | ||
double tan(double a) | 라디안 단위의 탄젠트값 반환 |
[참고]
혼자 공부하는 자바
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/module-summary.html
https://jocoma.tistory.com/entry/javalang-%ED%8C%A8%ED%82%A4%EC%A7%80
다음 내용
[java] java 스레드(thread) - 멀티, 메인, 작업 / 동기화 메소드
이전 내용 [java] java.lang 패키지이전 내용 [java] 예외 (클래스, 처리), 다중 catch, 예외 떠넘기기, String args[]이전 내용 [java] 인터페이스 상속, 중첩 클래스, 중첩 인터페이스이전 내용 [java] instanceo
puppy-foot-it.tistory.com
'프로그래밍 및 기타 > Java, Spring Boot' 카테고리의 다른 글
[java] 스레드 제어 (0) | 2025.04.10 |
---|---|
[java] java 스레드(thread) - 멀티, 메인, 작업 / 동기화 메소드 (1) | 2025.04.10 |
[java] 예외 (클래스, 처리), 다중 catch, 예외 떠넘기기, String args[] (0) | 2025.04.09 |
[java] 인터페이스 상속, 중첩 클래스, 중첩 인터페이스 (0) | 2025.04.08 |
[java] instanceof, 인터페이스, 구현 클래스 (0) | 2025.04.08 |