본문 바로가기

BackEnd/Java

[java] 이것이 자바다 ch12 java.base 모듈(Object 클래스)

728x90

1. API 도큐먼트

   ▷ 자바 표준 모듈에서 제공하는 라이브러리를 쉽게 찾아서 사용할 수 있도록 도와주는 문서

   ▷ JDK 버전별로 사용할 수 있는 API 도큐먼트 사이트

      ▶ https://docs.oracle.com/en/java/javase/index.html

 

Java Platform, Standard Edition Documentation - Releases

Java Platform, Standard Edition documentation, current and previous releases

docs.oracle.com

 

2. java.base 모듈

   ▷ 모든 모듈이 의존하는 기본 모듈 의존하는 기본 모듈로, 모듈 중 유일하게 requires 하지 않아도 사용할 수 있습니다.

 

NO 패키지 용도
1 java.lang 자바 언어의 기본 클래스 제공
2 java.util 자료 구조와 관련된 컬렉션 클래스를 제공
3 java.text 날짜 및 숫자를 원하는 형태의 문자열로 만들어 주는 포맷 클래스를 제공
4 java.time 날짜 및 시간을 조작하거나 연산하는 클래스를 제공
5 java.io 입출력 스트림 클래스를 제공
6 java.net 네트워크 통신과 관련된 클래스를 제공
7 java.nio 데이터 저장을 위한 Buffer 및 새로운 입출력 클래스 제공

 

(1) java.lang

   ▷ 자바 언어의 기본적인 클래스를 담고 있는 패키지.

   ▷ 이 패키지에 있는 클래스와 인터페이스는 import 없이 사용할 수 있습니다.

 

 

 

◎ Object 클래스

   ▷ 클래스를 선언할 때 extends 키워들로 다른 클래스를 상속하지 않으면 암시적으로 java.lang.Object 클래스를 상속

      ▶ 자바의 모든 클래스는 Object의 자식이거나 자손 클래스

 


1. 객체 동등 비교
   ▷ Object의 equals() 메소드는 객체의 번지를 비교하고 boolean 값을 리턴

public boolean equals(Object obj)



2. 객체 해시코드
   ▷ 객체를 식별하는 정수. Object의 hashCode() 메소드는 객체의 메모리 번지를 이용해서 해시코드를 생성하기 때문에 객체마다 다른 정수값을 리턴합니다.

public int hashCode()


   ▷ hashCode()가 리턴하는 정수 값이 같은지 확인하고, equals() 메소드가 true를 리턴하는지 확인해서 동등 객체임을 판단합니다.



3. 객체 문자 정보
   ▷ 객체를 문자열로 표현한 값. Object의 toString() 메소드는 객체의 문자 정보를 리턴합니다.
   ▷ 기본적으로 Objcet의 toString() 메소드는 '클래스명@16진수해시코드'로 구성된 문자열을 리턴

Object obj = new Objcet();
System.out.println(obj.toString());

// java.lang.Object@de6ced



4. 레코드 선언
   ▷ 데이터 전달을 위한 DTO(Data Transfer Object) 작성시 반복적으로 사용되는 코드를 줄이기 위해 도입

 

 

◎ 객체 동등 비교 예시

1. Member 클래스
public class Member {
	public String id;
	
	public Member(String id) {
		this.id = id;
	}
	
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Member target) {
			if(id.equals(target.id)) {
				return true;
			}
		}
		return false;
	}
}​


▷ obj와 Member가 같은 클래스이면 true를 출력합니다. (instanceof 함수)
   ▶ obj와 Member가 같은 클래스이면 obj를 Member로 강제 형 변환해서 target에 대입합니다.
 
▷ 그리고 id가 target.id랑 같으면 true를 출력합니다.
▷ 함수는 한 번 return을 받으면 그대로 실행이 종료됩니다.



2. EqualsExample 메인 클래스

public class EqualsExample {

	public static void main(String[] args) {
		Member obj1 = new Member("blue");
		Member obj2 = new Member("blue");
		Member obj3 = new Member("red");
		
		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는 동등하지 않습니다.");			
		}
	}
}

//	출력 : 
//	obj1과 obj2는 동등합니다.
//	obj1과 obj3는 동등하지 않습니다.

 

 

◎ 객체 해시코드 예시

1. Student 클래스
public class Student {
	private int no;
	private String name;
	
	public Student(int no, String name) {
		this.no = no;
		this.name = name;
	}
	
	public int getNo() { return no; }
	public String getName() { return name; }
	
	@Override
	public int hashCode() {
		int hashCode = no + name.hashCode();
		return hashCode;
	}
	
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Student) {
			Student target = (Student) obj;
			if(no == target.getNo() && name.equals(target.getName())) {
				return true;
			}
		}
		return false;
	}
}​


▷ equals는 원래 문자열 비교지만 클래스를 비교할 수 있도록 오버라이딩을 시켜줍니다.

2. HashCodeExample 메인 클래스
public class HashCodeExample {
	public static void main(String[] args) {
		Student s1 = new Student(1, "홍길동");
		Student s2 = new Student(1, "홍길동");
		
		System.out.println(s1);
		System.out.println(s2);
		
		System.out.println(s1.hashCode());
		System.out.println(s2.hashCode());
		
		if(s1.hashCode() == s2.hashCode()) {
			if(s1.equals(s2)) {
				System.out.println("동등 객체입니다.");
			} else {
				System.out.println("데이터가 다르므로 동등 객체가 아닙니다.");
			}
		} else {
			System.out.println("해시코드가 다르므로 동등 객체가 아닙니다.");
		}
	}
}

//	출력 :
//	hash.Student@33a43af
//	hash.Student@33a43af
//	54150063
//	54150063
//	동등 객체입니다.


▷ s1와 s2는 해쉬코드가 같은 값이지만 실제 주소는 다릅니다.
   ▶ 그 이유는 new를 통해서 새로운 객체를 생성한 것이기 때문입니다.

 if(s1 == s2) 을 하면 주소 값을 비교할 수 있습니다.

 

◎ HashSet을 이용한 예제

package java0119;

import java.util.HashSet;

public class HashSetExample {
	public static void main(String[] args) {
		HashSet hashSet = new HashSet();
		
		Student s1 = new Student(1, "홍길동");
		hashSet.add(s1);
		System.out.println("저장된 객체 수 : " + hashSet.size());
		
		Student s2 = new Student(1, "홍길동");
		hashSet.add(s2);
		System.out.println("저장된 객체 수 : " + hashSet.size());
		
		Student s3 = new Student(2, "홍길동");
		hashSet.add(s3);
		System.out.println("저장된 객체 수 : " + hashSet.size());
	}
}


//	출력 : 
//	저장된 객체 수 : 1
//	저장된 객체 수 : 1
//	저장된 객체 수 : 2


▷ HashSet 클래스와 add를 통해서 HashSet 클래스에 Student 객체를 저장합니다.
 동등 객체는 중복 저장되지 않기때문에 총 3개를 저장했지만 결과는 2개만 출력됩니다. 

 

◎ 객체 문자 정보

1. SmartPhone 클래스
public class SmartPhone {
	private String company;
	private String os;
	
	public SmartPhone(String company, String os) {
		this.company = company;
		this.os = os;		
	}
	
	@Override
	public String toString() {
		return company + ", " + os;
	}
}​


2. ToStringExample 메인 클래스
public class ToStringExample {
	public static void main(String[] args) {
		SmartPhone myPhone = new SmartPhone("삼성전자", "안드로이드");
		
		String strObj = myPhone.toString();
		System.out.println(strObj);
		
		System.out.println(myPhone);
	}
}

//	출력 : 
//	삼성전자, 안드로이드
//	삼성전자, 안드로이드​

 

◎ 레코드 선언

1. Member 레코드
public record Member(String id, String name, int age) {
}​


2. RecordExample 메인 클래스
public class RecordExample {
	public static void main(String[] args) {
		Member m = new Member("winter", "눈송이", 25);
		System.out.println(m.id());
		System.out.println(m.name());
		System.out.println(m.age());
		System.out.println(m.toString());
		System.out.println();
		
		Member m1 = new Member("winter", "눈송이", 25);
		Member m2 = new Member("winter", "눈송이", 25);
		System.out.println("m1.hashCode() : " + m1.hashCode());
		System.out.println("m2.hashCode() : " + m2.hashCode());
		System.out.println("m1.equls(m2) : " + m1.equals(m2));
	}
}

//	출력 : 
//	winter
//	눈송이
//	25
//	Member[id=winter, name=눈송이, age=25]
//	
//	m1.hashCode() : 306065155
//	m2.hashCode() : 306065155
//	m1.equls(m2) : true​

 

▷ java 14부터 레코드를 사용할 수 있습니다.
▷ record를 사용하면 자동으로 getter, setter를 생성해줍니다.

 

 java.lang의 class들에 대해서 익혀보았습니다.

 

많은 예제들을 보면서 java.lang에 어떤 클래스들이 있는지 어떻게 사용되는지 익히는 것이 중요한 것 같습니다!

 

많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~

 

728x90

'BackEnd > Java' 카테고리의 다른 글

[java] 이것이 자바다 ch12 문자열 클래스  (0) 2023.01.19
[java] 이것이 자바다 ch12 System 클래스  (0) 2023.01.19
[java] ch11 예외 처리 3  (0) 2023.01.19
[java] ch11 예외 처리 2  (0) 2023.01.19
[java] ch11 예외 처리 1  (0) 2023.01.18