[Java] java.lang 패키지와 유용한 클래스

📁 java.lang 패키지

자바 프로그래밍에 기본이 되는 클래스드를 모아둔 패키지

import문 없이 바로 사용 가능하다.

📁 Object 클래스

모든 클래스의 최고 조상

멤버로 11개의 메서드를 가지고 있다.

📂 equals()

객체 자신과 다른 객체를 비교하여 결과를 boolean값으로 반환하는 메서드
Object에서는 주소값을 비교하도록 구현되어 있으므로 적절한 멤버로 비교할 수 있도록 오버라이딩해야 한다.

public boolean equals(Object obj)

📂 hashcode()

객체의 해시코드를 반환하는 메서드

  • equals()와 함께 객체 비교에 사용된다.
  • 규약상 equals()의 결과와 hashcode()의 비교 결과가 같도록 오버라이딩해주는 것이 좋다.
public int hashcode();

Object에서는 객체의 주소값을 이용해 해시코드를 만든다.
Objects 클래스의 hash()를 사용하면 간편하게 오버라이딩할 수 있다.

public int hashcode() {
	Objects.hash(멤버변수, 멤버변수...);
}

📂 toString()

인스턴스에 대한 정보를 문자열로 변환해 반환하는 메서드

public String toString()

Object에서는 클래스정보, 클래스명, 객체의 주소값을 반환한다.

📂 clone()

자신을 복제하여 새로운 인스턴스를 생성하는 메서드

protected Object clone()

clone()의 오버라이딩

  • 메서드를 사용할 클래스는 Clonable 인터페이스를 구현해야 한다.
  • 제어자를 public으로 바꾸어야 한다.
  • 공변 반환타입을 사용해 리턴타입을 자손 타입으로 변경할 수 있다.
class Circle extends Point implements Clonable {
	Point p;
    double r;
    
    Circle(Point p, double r) {
    	this.p = p;
        this.r = r;
	}
	public Circle clone() {}
}

인스턴스의 복사

  • 얕은복사
    객체의 주소값만을 복사해 원본과 복사본이 같은 객체를 공유하도록 하는 복사
public Circle clone() {
	Circle c = null;
	try {
    	c= super.clone();
	} catch(CloneNotSupportedException e) {}
    return c;
}

 

  • 깊은복사
    객체의 값을 복사해 한쪽의 변경이 다른 한쪽에 영향을 미치지 않는 복사
public Circle clone() {
	Circle c1 = null;
	
    try {
    	c= super.clone();
	} catch(CloneNotSupportedException e) {}   
    
    Circle c2 = c1;
    c2.p = new Point(this.p.x, this.p.y);
	
    return c2;
}

📂 getClass()

클래스에 대한 정보를 가진 Class 객체를 반환한다.

public Class getClass()

 
클래스 객체를 얻는 방법은 다음과 같다.

클래스명.getClass();
인스턴스.getClass();
Class.forName("클래스명");

📁 String 클래스

문자열을 다루기 위한 클래스

⭐️ 변경할 수 없는 클래스

String 클래스는 문자열을 저장하기 위한 멤버변수 char[] value를 가지고 있다.
String 인스턴스를 만들 때 매개변수로 입력한 문자열은 value에 문자형 배열로 저장된다.
배열은 생성하면 길이를 변경할 수 없기 때문에 내부적으로 배열을 가진 String 클래스 역시 변경할 수 없는 클래스가 된다.

public class String {
	char[] value;
}

만약 이미 만들어진 String 인스턴스에 다른 문자열 값을 대입한다면, 그건 인스턴스를 수정하는 것이 아니라 새롭게 인스턴스를 만들어 주소값을 할당하는 것이라고 할 수 있다.

빈 문자열

길이가 0인 배열을 만들 수 있는 것처럼 길이가 0인 빈 문자열을 만들 수도 있다.

문자열 생성방법

(1) 문자열 리터럴

문자열 리터럴은 컴파일시 클래스파일에 저장되며 같은 내용의 리터럴은 한번만 저장된다.
따라서 같은 내용의 문자열을 만들 경우 원래 있던 리터럴을 재사용하게 되므로 등가비교연산자를 사용할 수 있다.

(2) 인스턴스 생성

인스턴스를 생성할 경우 new 연산자에 의해 메모리를 동적으로 할당받아 매번 새로운 인스턴스가 생성된다.
같은 내용의 문자열이라도 저장된 위치가 다르기 때문에 등가비교연산자를 사용할 수 없고 equals()로 비교해야 한다.

📂 split()

주어진 구분자를 기준으로 문자열을 분할해 저장한 문자열 배열을 반환하는 메서드.

public String[] split(String regex)
public String[] split(String regex, int limit)

📂 join()

여러 문자열 사이에 구분자를 넣어 결합하는 메서드. jdk1.8부터 추가되었다.

public static String join(CharSequence delimiter, CharSequence... elements)

Cf. StringJoiner 클래스

join()과 유사하게 구분자를 기준으로 문자열을 결합하는 클래스.

public StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix))
public StringJoiner add(CharSequence newElement)

📂 format()

형식화된 문자열을 만들어내는 메서드. printf()와 사용 방법이 동일하다.

public static String format(String format, Object... args)

📂 value()

기본형 변수를 문자열로 만들어 반환하는 메서드.

public static String valueOf(boolean b)
public static String valueOf(char c)
public static String valueOf(int i)
public static String valueOf(long l)
public static String valueOf(float f)
public static String valueOf(double d)

📁 StringBuffer 클래스

버퍼를 사용해 변경이 가능한 문자열을 저장하는 가변 클래스

📂 버퍼 Buffer

문자열을 저장하기 위한 문자 배열

StringBuffer는 내부적으로 버퍼를 가지고 있어 String과 달리 변경이 가능하다.

StringBuffer의 인스턴스를 생성할 때에는 버퍼의 길이를 지정해주어야 한다.

public StringBuffer() {
	capacity = 16;
}
public StringBuffer(int capacity) {
	this.capacity = capacity;
}
  • 버퍼의 크기가 저장하려는 문자열보다 작을 경우 새롭게 문자 배열을 생성해 값을 복사하는 작업이 추가적으로 수행된다.
    따라서 저장할 문자열의 길이를 고려해 처음부터 버퍼를 적절한 크기로 지정해주는 것이 좋다.
  • 버퍼의 크기를 지정하지 않는 경우 자동으로 16으로 생성된다.

StringBuffer의 메서드

public StringBuffer append(String str)				// 버퍼에 문자열 추가
public StringBuffer insert(int offset, String str)	// 지정된 위치에 문자열 삽입
public StringBuffer delete(int start, int end)		// 지정된 위치의 문자열 삭제

📁 StringBuilder 클래스

StringBuffer와 사용하는 방법이 동일하지만 동기화 기능을 제공하지 않는 클래스

싱글쓰레드에서는 성능상 StringBuffer보다 StringBuilder를 사용하는 것이 좋다.

📁 Math 클래스

수학과 관련된 static 메서드의 집합

static int abs(T f)				// 주어진 값의 절댓값 반환
static double ceil(double a)	// 주어진 값을 올림하여 반환
static double floor(double a)	// 주어진 값을 버림하여 반환
static int max(T a, T b)		// 두 값을 비교해 큰 값 반환
staitc int min(T a, T b)		// 두 값을 비교해 작은 값 반환
static double random()			// 0~1 사이의 임의의 난수 반환
static double round(double a)	// 소수점 첫째자리에서 반올림한 정수값 반환

/* 매개변수 T에는 정수형, 실수형 타입이 들어올 수 있다. */

📁 래퍼클래스

기본형 값을 감싸서 객체로 사용하는 클래스

public class Integer {
	private int value;
int i1 = 100;
Integer i2 = new Integer(i1);

자바는 기본적으로 객체지향언어로서 모든 데이터를 객체로 다루지만 유일하게 기본형이라는 예외를 두고 있다.
객체는 참조변수를 통해서만 값을 읽을 수 있지만 기본형은 리터럴에 바로 접근할 수 있어 성능이 향상되기 때문이다.
그러나 때로는 기본형을 객체로 다루어야 할 일이 있기 때문에 래퍼클래스를 통해 이를 가능하게 했다.

📂 valueOf()

문자열을 래퍼클래스 타입의 객체로 만들어서 반환하는 메서드

static Boolean valueOf(String value)
static Byte valueOf(String value)
static Short valueOf(String value)
static Integer valueOf(String value)
static Long valueOf(String value)
static Float valueOf(String value)
static Double valueOf(String value)

📂 parse()

문자열을 기본형 타입 변수로 변환하는 메서드

static boolean parseBoolean(String value)
static byte parseByte(String value)
static short parseShort(String value)
static int parseInt(String value)
static long parseLong(String value)
static float parseFloat(String value)
static double parseDouble(String value)

📁 Number 클래스

래퍼클래스 중 숫자와 관련된 클래스들의 조상
객체의 값을 숫자와 관련된 기본형으로 변환하는 메서드를 정의하고 있다.

public abstract class Number {
	public abstract int intValue();
    public abstract long longValue();
    public abstract float floatValue();
    public abstract double doubleValue();
}

오토박싱, 언박싱

JDK1.5부터 추가된 기능
컴파일러가 필요에 따라 기본형 값을 래퍼클래스의 객체로, 래퍼클래스의 객체를 기본형 값으로 변환해주는 기능.

📁 Objects 클래스

Object의 보조클래스
모든 메서드가 static이며 객체 비교나 null체크에 유용하다.

📂 isNull(), nonNull()

객체가 null인지 확인해 결과값을 boolean으로 반환하는 메서드

public boolean isNull(Object obj)
public boolean nonNull(Object obj)

📂 requireNonNull()

매개변수의 유효성검사에 유용하게 사용되는 메서드.
객체가 null이면 NullPointerException을 발생시키며 msg에는 예외 메세지가 들어간다.

public static <T> T requireNonNull(T obj)
public static <T> T requireNonNull(T obj, String msg)
public static <T> T requireNonNull(T obj, Supplier<String> messageSupplier)

📂 compare()

두 객체를 비교하여 같으면 0, 작으면 음수, 크면 양수를 반환하는 메서드.

public static int compare(Object obj1, Object obj2, Comaprator c)

📂 equals(), deepEquals()

두 객체를 비교하는 메서드
Object 클래스의 메서드와 달리 널체크가 필요하지 않다.

public static boolean Equals(Object obj1, Object obj2)
public static boolean deepEquals(Object[][] obj1, Object[][] obj2)

📂 toString()

내부적으로 널체크를 해주는 것 외에는 Object의 메서드와 동일하다.

public static String toString(Object o)

📂 hash()

인스턴스 변수들을 집어넣으면 이를 조합해 해시코드를 반환하는 메서드.
Object의 hashCode()를 오버라이딩할 때 유용하게 사용된다.

public static int hash(Object... values)

📁 java.util.regex 패키지

정규식과 관련된 패키지
정규식이란 텍스트 데이터 중 원하는 조건과 일치하는 문자열을 찾아내기 위해 사용하는 것

📂 Pattern 클래스

정규식을 정의하는 데에 사용되는 클래스

// 정규식을 생성하는 메서드
public static Pattern compile(String regex)

// Matcher 인스턴스를 반환하는 메서드
public Matcher matcher(CharSequence input)

📂 Matcher 클래스

데이터와 정규식을 비교하는 데에 사용되는 클래스

// 텍스트 데이터가 정규식 형식과 일치하는지 반환하는 메서드
public boolean matches()

정규식 사용방법

  1. 정규식을 매개변수로 compile()을 호출해 Pattern 인스턴스를 얻는다.
  2. Pattern 인스턴스로 matcher()을 호출해 매개변수로 비교할 대상을 대입, Matcher 인스턴스를 얻는다.
  3. Matcher 인스턴스에 matches()를 호출해 정규식에 부합하는지 확인한다.
Pattern p = Pattern.compile(String regex);
Matcher m = p.matcher(CharSequence input);
if(m.matches()) ...