プログラミング自主学習 DAY61 java API/java.base/Object
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