TOP
본문 바로가기
프로그래밍 및 기타/Java, Spring Boot

[java] java.lang 패키지

by 기록자_Recordian 2025. 4. 9.
728x90
반응형
이전 내용
 

[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

 

728x90
반응형