java.lang
패키지는 Java 프로그래밍 언어의 핵심 클래스를 포함하고 있는 패키지로, 자주 사용되는 기본 클래스들을 포함하고 있습니다. lang
패키지가 있고, 그외에도 io
, math
, time
, util
등의 패키지도 기본적으로 포함되어 있습니다.lang
패키지의 대표적인 클래스들로는 Object
, String
, 래퍼 클래스들(Integer
, Boolean
, 등), Class
, System
등이 있습니다.lang
패키지에서 중요하게 다룰 수 있는 내용들이 상당히 많고 복잡하기 때문에 우선은 필요한 개념들을 하나씩 차례대로 정리해볼 예정입니다. Object
클래스String
클래스Integer
, Double
, Boolean
, 등)Class
, System
, Math
, 등) java.lang
패키지의 핵심 클래스 중 Object
클래스에 대해 자세히 살펴보겠습니다.Object
클래스는 Java에서 모든 클래스의 최상위 부모 클래스입니다. 모든 클래스는 Object
클래스를 상속받으며, Object
클래스에 정의된 메서드들은 모든 Java 객체에서 사용할 수 있습니다.Object
클래스는 모든 클래스의 부모이기 때문에, 모든 Java 객체는 Object
타입으로 참조될 수 있습니다. Object obj1 = new String("Hello");
Object obj2 = new Integer(10);
Object obj3 = new ArrayList<>();
obj1
, obj2
, obj3
은 각각 String
, Integer
, ArrayList
객체를 참조하지만, 모두 Object
타입으로 선언되었습니다. Object
클래스의 하위 타입으로, 배열 자체가 Object
로 취급됩니다. Object
타입으로 참조할 수 있으며, 배열의 요소도 Object
타입으로 처리할 수 있습니다.int[] intArray = {1, 2, 3};
Object objArray = intArray; // 배열을 Object로 참조
System.out.println(objArray instanceof Object); // true
Object[] objects = new Object[3];
objects[0] = new String("Hello");
objects[1] = new Integer(10);
objects[2] = new int[]{1, 2, 3};
objects
배열은 String
, Integer
, int[]
타입의 객체들을 하나의 배열로써 관리할 수 있습니다.public class Person {
private String name;
public Person(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{name='" + name + "'}";
}
}
Person
클래스는 Object
클래스의 toString()
메서드를 오버라이드하여 자신만의 문자열 표현을 정의하고 있습니다. Object
클래스를 수정하지 않고도 새로운 기능을 확장한 예입니다.toString()
메서드는 객체의 문자열 표현을 반환하는 메서드입니다. Object
클래스에서 기본적으로 제공되는 toString()
메서드는 클래스 이름과 해시 코드를 반환합니다.// java.lang.Object 中 toString() 메서드
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
toString()
메서드를 오버라이드하여 객체의 속성이나 상태를 의미 있는 문자열로 반환할 수 있습니다.public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
Person
클래스는 toString()
메서드를 오버라이드하여 객체의 상태를 표현하는 문자열을 반환하도록 구현되었습니다.equals()
메서드는 두 객체가 "동일"한지 "동등"한지를 비교하는 메서드입니다. Object
클래스의 equals()
메서드는 동일성(identity)을 비교하지만, 이를 오버라이드하여 객체의 동등성(equality)을 비교할 수 있습니다.// java.lang.Object 中 equals() 메서드
public boolean equals(Object obj) {
return (this == obj);
}
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
Person
클래스는 equals()
메서드를 오버라이드하여 두 객체의 동등성을 비교하도록 구현되었습니다.command+N
(Mac), Alt+Insert
(Win/Linux)clone()
: 객체의 복제를 지원하는 메서드입니다. Object 클래스에서 제공되며, Cloneable 인터페이스를 구현한 객체만 사용 가능합니다.@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
hashCode()
: 객체의 해시 코드를 반환하는 메서드입니다.
equals()
메서드를 오버라이드한 경우 hashCode()
메서드도 함께 오버라이드하는 것이 일반적입니다.getClass()
: 런타임 시 객체의 클래스 정보를 반환하는 메서드입니다.
Class<?> clazz = obj.getClass();
notify()
, notifyAll()
, wait()
: 스레드 간의 동기화를 위해 사용되는 메서드들입니다. 주로 멀티스레드 환경에서 스레드 간의 작업 조정에 사용됩니다.synchronized(obj) {
obj.wait();
obj.notify();
}
Java.lang 패키지
개요와 Object 클래스
에 대해서 정리해보았고, 다음 포스트에서는 Java.lang 패키지 중 String 클래스
에 대해서 정리해 보도록 하겠습니다.Object
클래스는 모든 Java 클래스의 최상위 부모 클래스이므로, 이 클래스에 정의된 메서드들은 Java에서 매우 중요합니다. String 클래스
도 Object 클래스
의 메서드를 상속받고 사용하므로, Object 클래스에 대한 이해는 Java 프로그래밍의 기초이고 상당히 중요한 의미를 가집니다.