[Java] 11-1 java.lang 패키지

Woohyun Shin·2021년 8월 18일
0

Java

목록 보기
10/10

java.lang 패키지는 자바 프로그램의 기본적인 클래스를 담고 있는 패키지이다. 그래서 java.lang 패키지에 있는 클래스와 인터페이스는 import 없이 사용할 수 있다.

이번 파트에서는 java.lang 패키지에 속하는 주요 클래스에 대해 공부해볼 것이다.

Object : 자바 클래스의 최상위 클래스로 사용
System : 표준 입력 장치(키보드)로부터 데이터를 입력받을 때 사용, 표준 출력 장치(모니터)로 출력하기 위해 사용, 자바 가상 기계를 종료할 때 사용, 쓰레기 수집기를 실행 요청할 때 사용
Class : 클래스를 메모리로 로딩(실행할 프로그램을 보조기억장치에서 주기억장치로 가져오는 것)할 때 사용
String : 문자열을 저장하고 여러 가지 정보를 얻을 때 사용
Wrapper(Byte/Short/Character/Integer/Float/Double/Boolean/Long) : 기본 타입의 데이터를 갖는 객체를 만들 때 사용, 문자열을 기본 타입으로 변환할 때 사용, 입력값 검사에 사용
Math : 수학 함수를 이용할 때 사용

자바 API 도큐먼트

API(Application Programming Interface)는 라이브러리라고 부르기도 하는데, 프로그램 개발에 자주 사용되는 클래스 및 인터페이스의 모음을 말한다. 우리가 사용해온 String 클래스와 System 클래스도 모두 API에 속하는 클래스이다.

방대한 자바 표준 API 중에서 우리가 원하는 API를 쉽게 찾아 이용할 수 있도록 도와주는 것이 바로 API 도큐먼트이다.

https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/package-summary.html

Object 클래스

우리는 클래스를 선언할 때 extends 키워드로 다른 클래스를 상속하지 않더라도 암시적으로 java.lang.Object 클래스를 상속하게 된다. 따라서 자바의 모든 클래스는 Object 클래스의 자식이거나 자손 클래스이다.

Object는 자바의 최상위 부모 클래스에 해당하며 필드가 없고 생성자와 메소드로 구성되어 있다. 모든 클래스의 최상위 부모가 Object이므로 모든 클래스에서 Object의 메소드를 사용할 수 있다.

객체 비교(equals())

public boolean equals(Object obj){...}

equals() 메소드의 매개 타입은 Object인데, 이것은 모든 객체가 매개값으로 대입될 수 있음을 말한다. 왜냐하면 모든 객체는 Object 타입으로 자동 타입 변환될 수 있기 때문이다.

Object 클래스의 equals() 메소드는 비교 연산자인 ==과 동일한 결과를 리턴한다. 두 객체가 동일한 객체라면 true를 리턴하고 아니면 false를 리턴한다.

boolean result = obj1.equals(obj2);
		
boolean result2 = (obj1==obj2); //결과가 동일

자바에서는 두 객체를 동등 비교할 때 equals() 메소드를 흔히 사용한다.

equals() 메소드는 두 객체를 비교해서 논리적으로 동등하면 true를 리턴하고 그렇지 않으면 false를 리턴한다.(같은 객체건 다른 객체건 상관없이 객체가 저장하고 있는 데이터가 동일함을 뜻함)

예를 들어 String 객체의 equals() 메소드는 String 객체의 번지를 비교하는 것이 아니고 문자열이 동일한지 조사한다. 이것이 가능한 이유는 String 클래스가 Object의 equals() 메소드를 재정의(오버라이딩)해서 번지 비교가 아닌 문자열 비교로 변경했기 때문이다.

일반적으로 Object의 equals() 메소드는 직접 사용되지 않고 하위 클래스에서 재정의하여 논리적으로 동등 비교할 때 이용된다.

equals() 메소드를 재정의할 때는 매개값(비교 객체)이 기준 객체와 동일한 타입의 객체인지 먼저 확인해야 한다. Object 타입의 매개 변수는 모든 객체가 매개값으로 제공될 수 있기 때문에 instanceof 연산자로 기준 객체와 동일한 타입인지 제일 먼저 확인해야 한다.

만약 비교 객체가 다른 타입이라면 equals() 메소드는 false를 리턴해야 한다. 비교 객체가 동일한 타입이면 기준 객체 타입으로 강제 타입 변환해서 필드값이 동일한지 검사하면 된다.

필드값이 모두 동일하다면 true를 리턴하고 아니면 false를 리턴하도록 한다.

package sec03.exam02;

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 타입으로 강제 타입 변환하고 id 필드값이 동일한지 검사
			if(id.equals(member.id)) {
				return true;
			}
		}
		return false; //매개값이 Member 타입이 아니거나 id필드값이 다를 경우 false 리턴
		
	}
}
package sec03.exam02;

public class MemberExample {

	public static void main(String[] args) {
		// TODO 자동 생성된 메소드 스텁
		Member obj1 = new Member("blue");
		Member obj2 = new Member("blue");
		Member obj3 = new Member("red");
		
		if(obj1.equals(obj2)) { //매개값이 Member 타입이고 id필드값도 동일하므로 true
			System.out.println("obj1과 obj2는 동등합니다.");
		}
		else {
			System.out.println("obj1과 obj2는 동등하지 않습니다.");
		}
		
		if(obj1.equals(obj3)) { //매개값은 Member 타입이지만 id필드값이 다르므로 false
			System.out.println("obj1과 obj3는 동등합니다.");
		}
		else {
			System.out.println("obj1과 obj3는 동등하지 않습니다.");
		}
	}

}

obj1과 obj2는 동등합니다.
obj1과 obj3는 동등하지 않습니다.

객체 해시코드(hashCode())

객체 해시코드란 객체를 식별하는 하나의 정수값을 말한다. Object 클래스의 hashCode() 메소드는 객체의 메모리 번지를 이용해서 해시코드를 만들어 리턴하기 때문에 객체마다 다른 값을 가지고 있다.

우선 hashCode() 메소드를 실행해서 리턴된 해시코드 값이 같은지를 본다. 해시코드 값이 다르면 다른 객체로 판단하고, 해시코드 값이 같으면 equals() 메소드로 다시 비교한다.

그렇기 때문에 hashCode() 메소드가 true가 나와도 equals()의 리턴값이 다르면 다른 객체가 된다.

profile
조급함보다는 꾸준하게

0개의 댓글