プログラミング自主学習 DAY61 java API/java.base/Object

2023/07/27に公開

java API document

javaはモジュールを通して、膨大なライブラリを提供する。そのライブラリを活用するために、
OracleのHPからAPI Documentを参考することができる。こちらのHPより、膨大なライブラリにあるClass,Interface,Packageなどを確認することができる。

それなら、なぜ、Library documentと言わず、API documentだと定義しているのか?

ここでは、Libraryの概念とmoduleの違いを考える必要がある。

Library:プログラムを作成するにあたり、package内のすべてを利用できるクラスとインタフェースのあつまり。public
Module:プログラムを作成するにあたり、package内のすべてを利用できるクラスとインタフェースのあつまり。しかし、隠したい情報と機能などは公開しないこともでき、依存関係を設定することもできる。

要するに、我々が活用しているjavaのライブラリも、名前はライブラリだが、実際はmoduleであり、内部のdefault, privateのクラス、インタフェースなどを100%公開していないため、ライブラリだと定義することも曖昧だ。

プログラムを作成するために、javaが提供するpublic, protectedのクラス、インタフェース、メソッド、フィールド、コンストラクタのみ利用できるため、ライブラリの使い方を記述したものをAPI documentと定義する。

java.base

すべてのjavaモジュールは、java.baseを依存しているモジュールで、Objectにextendsをしなくても継承するように、requireを入力しなくても依存する。

java.lang

java.baseに含めているパッケージであり、javaの基本クラスが含めている。
java.langのクラスはimportをせずに、利用できる。

Object

java.langにある最上位クラス。

equals()

オブジェク間のアドレス(オブジェクトの同一性)のみ比較する。
Stringの場合、同じ値を持っているか(等価性)を比較するため、オーバーライドした。


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

}

package ch12.sec03.exam01;

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는 동등합니다.  same field value
obj1과 obj3는 동등하지 않습니다.  diffrent field value

HashCode()

Hashcodeはオブジェクのアドレスを通して、作られた区別コードだ。
そのため、全部違う値をもっている。

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 this.no;};
  public String getName() {return this.name;};
  
  @Override
	public int hashCode() {
	  int hashCode = this.no + this.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;
	}
  
}



public class HashCodeExample {
	public static void main(String[] args) {
		Student s1 = new Student(1,"홍길동");
		Student s2 = new Student(1,"홍길동");

	    if(s1.hashCode()== s2.hashCode()) {
	      if(s1.equals(s2)) {
	    	  System.out.println("동등 객체입니다");
	      }
	      else {
	    	  System.out.println("데이터가 다르므로 동등 객체가 아닙니다.");
	      }
	    }
	    else System.out.println("데이터가 다르므로 동등 객체가 아닙니다.");

	}
}

동등 객체입니다  same hashcode (no+name is same)

HashSet

HashSet は、コレクションの一つで、等価なオブジェクトは保存しない徳直がある。
等価性は、そのオブジェクトのHashCode,equalsメソッドを利用して、判断する。

package ch12.sec03.exam02;

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

万が一、別のオブジェクトとして、保存したい場合はStudentのHashCodeメソッドを再定義する必要がある。

toString()

ObjectのtoString()は、所属Class@16進法Hashcodeをリターンする。
ほかのクラスは、自分の値をリターンするように、toString()をオーバーライドしている。

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;
	}
}


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);
	}

}

삼성전자, 안드로이드
삼성전자, 안드로이드

★ Record(Java 14)★

DTO(Data Transfer Object) :データーを伝えるために生成されるオブジェクト。
パラメータの中に入れた実引数を伝えるオブジェクトだ。
メソッドでフィールドをいちいち送るよりは、一つのオブジェクトの情報を一機に起きれば、効率があがるため、使われる。


https://www.youtube.com/watch?v=GK-oE509wKA&list=PLVsNizTWUw7EmX1Y-7tB2EmsK6nu6Q10q&index=122

public class Person{
  private final String name;
  private final int age;
  
Public Person(String name, int age){
  this.name = name;
  this.age = age;
  
public String name() {return this.name;}
public int age() {return this.age}

@Override
public int hashCode(){....}

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

@Override
public STring toString(){....}
}

Java 14からは、以下のようにDTO(Class)をrecord宣言を通して、自動的に作成してくれる。
あえて短所を言えは、getterメソッド名にgetを付けてくれるのではなく、変数のみ付けてくれることとすべてのフィールドがfinalになることだ。

public record Person(String name, int age){
}

class宣言と似ている形で、パラメータが追加された。

public class MemberExample {

	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(): " + m1.hashCode());
		System.out.println("m1.equals(m2): " + m1.equals(m2));
	}

}
winter
눈송이
25
Member[id=winter, name=눈송이, age=25]

m1.hashCode(): 306065155
m2.hashCode(): 306065155
m1.equals(m2): true```

Lombok

Lombokはjava標準ライブラリ(jdk)ではないが、現場でよく使われるコード生成ライブラリだ。
フィールドが final に全部生成されないこととset,getのメソッド名もしっかり付けてくれろ。

googleでインストールした後、cmdでこのように入力すれば、インストールメニューが表示される。

cd lombok.jarがあるディレクトリ
java -jar lombok.jar

インストールした後、projectフォルダーに新しいフォルダーを追加し、lombok.jarを入れる。
その後、add to build pathをクリックしてライブラリとして追加する。

@dataで一括で必要なメソッドを生成してくれる。

Discussion