๐ ์์ฉ 3์ฅ ์ธ์คํด์ค์ ๊ธฐ๋ณธ ์กฐ์
Object ํด๋์ค์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ

๐ก
- ๋ชจ๋ ํด๋์ค๋ Object ํด๋์ค์ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค. (๋ชจ๋ ํด๋์ค์ ์ )
- Object ํ์
๋ณ์์๋ ๋ชจ๋ ์ธ์คํด์ค๋ฅผ ๋์
ํ ์ ์๋ค.
Object ํด๋์ค์ ๋ํ ๋ฉ์๋

- toString() : ๋ฌธ์์ด ํํ์ ์ป์
- equals() : ๋น๊ต
- hashCode() : ํด์ ๊ฐ์ ์ป์
toString()
๐ก
๊ฐ์ฒด๋ฅผ ํํํด์ฃผ๋ ๋ฐฉ๋ฒ์ ๋ฆฌํด ํด์ฃผ๋ ๋ฉ์๋
- ์ค๋ฒ๋ผ์ด๋ ํ์ฌ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป๋๋ก ์์ ํ ์ ์๋ค.
public class Main {
public static void main(String[] args) {
Hero hero = new Hero();
Hero hero2 = new Hero();
System.out.println(hero);
System.out.println(hero2);
}
}
- ๊ฐ์ฒด๋ฅผ ์ถ๋ ฅํด๋ณด๋ฉด, HashCode๋ก์ ํํ๋๋ค.
- ํด์์ฝ๋๋ C์ธ์ด์์ ํด์ ์๊ณ ๋ฆฌ์ฆ์ ํตํด ์์ฑ๋์ด ๊ฐ ๊ฐ์ฒด์ ๋ถ์ฌ๋๋ค.
toString() ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ
public class Hero {
// field variable, global variable, member variable, property
String name;
int hp;
@Override
public String toString() {
return "Hero [name=" + name + ", hp=" + hp + "]";
}
}

- toString()์ ์ค๋ฒ๋ผ์ด๋ฉ ํ๋ฉด, ์ง์ ํ๋ ์ํ๋ ๊ฒฐ๊ณผ ๊ฐ์ด ์ถ๋ ฅ๋๋ค.
equals()

- equals(): equals() ๋ฉ์๋ ๋ด์์ ์ ์ํ ๊ท์น์ ์ํ ๋น๊ต
- == : ์ฐธ์กฐ์ ๋น๊ต
๐ก
equals() ๋ฉ์๋๋
์ค๋ฒ๋ผ์ด๋
ํ์ฌ ๋๋ง์ ๊ท์น์ ์ ์ํ ์ ์๋ค.

๐ก
์ฃผ๋ก hashCode()์ equals() ํจ๊ป ์ค๋ฒ๋ผ์ด๋ ํ์ฌ ์ฌ์ฉํ๋ค.
equals()๋ฅผ ์ค๋ฒ๋ผ์ด๋ ํ์ง ์์ ๊ฐ์ฒด์ ์ทจ๊ธ
ํด์ฆ)

public class Hero {
public String name;
}
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Hero> list = new ArrayList<>(); //List๋ ์ธํฐํ์ด์ค, ArrayList๋ ํด๋์ค (๋คํ์ฑ)
Hero hero = new Hero(); //(1)
hero.name = "ํ๊ธธ๋";
list.add(hero);
System.out.println(list.size());
hero = new Hero(); // (2) ์๋ก์ด ์ธ์คํด์ค ์์ฑ
hero.name = "ํ๊ธธ๋"; // ์ ์๋ก์ด ์ธ์คํด์ค์ ์ด๋ฆ ์์ฑ์ ์ ์
list.remove(hero); // ์๋ก์ด ์ธ์คํด์ค๋ ๋ฆฌ์คํธ์ ์กด์ฌํ์ง ์์. ๋ฐ๋ผ์ ์ง์์ง์ง ์๋๋ค.
System.out.println(list.size());
}
}
๐ก
์ถ๋ ฅ ๊ฐ :
1
1
๐ก
- ์ฒ์ hero ๊ฐ์ฒด ํ๊ธธ๋1์ ๋ฆฌ์คํธ์ ๋ฃ๋๋ค.
- ๋๋ฒ์งธ hero ๊ฐ์ฒด ํ๊ธธ๋2๋ ์๋ก์ด ์ธ์คํด์ค์ด๋ฏ๋ก, ํด๋น hero๋ ๋ฆฌ์คํธ์ ์กด์ฌํ์ง ์๋๋ค.
โ ์ฝ๋ ํผ๋์ ์ฌ์ง๊ฐ ์๋ค!
equals() ์ฌ์ ์ ํ ๊ฒฐ๊ณผ
import java.util.Objects;
public class Hero {
// field variable, global variable, member variable, property
String name;
int hp;
@Override
public int hashCode() {
return Objects.hash(hp, name);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Hero other = (Hero) obj;
return hp == other.hp && Objects.equals(name, other.name);
}
@Override
public String toString() {
return "Hero [name=" + name + ", hp=" + hp + "]";
}
}

๐ก
โ equals() ์ฌ์ ์๋ฅผ ํตํด ์ด๋ฆ์ด ๊ฐ์ ๊ฒฝ์ฐ ๊ฐ์ ๊ฒ์ผ๋ก ๋ณด๋๋ก ์ค์ ํ ์ ์๋ค!
(reference ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ ๊ฒ์, equals() ์ฌ์ ์๋ฅผ ํตํด value ๊ธฐ๋ฐ์ผ๋ก ๋น๊ตํ ์ ์๋๋ก ์ ์ํ ์ ์๋ ๊ฒ์ด๋ค!)
HashSet์์ remove()
ํด์ฆ)

๐ก
์ถ๋ ฅ ๊ฐ:
1
1
๐ก
equals()๋ง ์์ ๊ฒฝ์ฐ์๋ ์ง์์ง์ง ์๋๋ค.
โ hashSet()์ hash ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๊ณ , ๋ด๋ถ ๊ฐ์ด ๋ค๋ฅด๋ฏ๋ก ์ง์์ง์ง ์๋๋ค.
๋ฐ๋ผ์ equals()์ hashCode() ๋ฉ์๋๊น์ง ์ฌ์ ์ ํด์ผ ํ๋ค.
HashSet์์ remove()
ํด์ฆ)

HashSet์ ๋์ ์๋ฆฌ
๐ก
hashSet, hashMap์ด ๋น ๋ฅธ ์ด์ : ๋ด๋ถ hash ๊ฐ๋ง ๋น๊ตํ๋ฉด ๋๋ฏ๋ก ์๋๊ฐ ๋น ๋ฅด๋ค
hashCode()์ ์ค๋ฒ๋ผ์ด๋
๐ก
๋ฐ๋ผ์, ์ถํ hashCode(), equals()๋ฅผ ํ๋ฒ ๋ฑ์ key๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๋น๊ตํ๋๋ก ํ์ฉํ ์ ์๋ค.
์ธ์คํด์ค์ ์์ ๊ฒฐ์
์ค๋ฆ์ฐจ์ ์ ๋ ฌ
๐ก
์ปฌ๋ ์
๋ด๋ถ ์ ๋ ฌ : Collections.sort()

๐ก
์ง์ ์ ์ํ ํด๋์ค๋ Collections.sort() ์ ๋ ฌ์ด ์๋๋ค.
์ ์ฝ์ฌํญ ) ์ ๋ ฌ ๋์์ ๋ฐ๋์ Comparable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผ ํ๋ค!

- Collections ๋ด๋ถ ๊ตฌํ ์ฌํญ
๐ก
public static <T extends Comparable<? super T>> void sort(List<T> list)
Comparable ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ํ์
๋ง ์ ๋ ฌํ ์ ์๋ค.
Comparable ์ธํฐํ์ด์ค ๊ตฌํ

Comparable ์ธํฐํ์ด์ค์ ๊ตฌํ์ ๋ด๋ถ compareTo(T o) ๋ฉ์๋๋ฅผ ์ฌ์ ์(์ค๋ฒ๋ผ์ด๋)ํด์ผ ํ๋ค.
Comparable (Java Platform SE 8 )

@Override
public int compareTo(Hero o) {
return this.name.compareTo(o.name); // ๋ฏธ๋ฆฌ String์ ๊ตฌํ๋ compareTo()๋ฅผ ์ด์ฉ
}
๐ก
Hero ํด๋์ค์ String์ผ๋ก ์ ์๋ name (์ด๋ฆ์ ์ ๋ ฌ)์ ๊ตฌํ
๋ฏธ๋ฆฌ String ํด๋์ค๋ compareTo() ๋ฉ์๋๊ฐ ์ ์๋์ด ์์ผ๋ฏ๋ก, ์ด๋ฅผ ํ์ฉํ์ฌ ๊ตฌํํ๋ค.
@Override
public int compareTo(Hero o) {
if (this.hp < o.hp) {
return -1;
}
if (this.hp > o.hp) {
return 1;
}
return 0;
}
๐ก
Hero ํด๋์ค์ intํ์ ์์ ๊ฐ์ด ์ ์ํด ์ ๋ ฌ์ ๊ตฌํํ ์ ์๋ค.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Hero> hero = new ArrayList<>();
hero.add(new Hero("๊ฐ", 0));
hero.add(new Hero("๋ฐ", 2));
hero.add(new Hero("์ต", 5));
hero.add(new Hero("์ด", 3));
Collections.sort(hero);
System.out.println(hero);
}
}

๐ก
์ด๋ฆ์์ผ๋ก ์ ๋ ฌ๋์๋ค!
๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
๐ก
compareTo ๋ฉ์๋์ return ๊ฐ์ *1 ํ๋ฉด ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ์ด ๋๋ค.
์ธ์คํด์ค์ ๋ณต์ฌ(Copy)
ํด์ฆ)

๐ก
๊ฐ์ ๋ณต์ฌ๊ฐ ์๋๋ค!
clone() ๋ฉ์๋
ํด์ฆ)


๐ก
cloneable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ , clone() ๋ฉ์๋๋ฅผ ์ํ๋ ๋๋ก ์ ์ํ๋ฉด
๋ณต์ฌ(copy)ํ ์ ์๋ค.
(hashCode(), equals() ์ฌ์ ์ ๋ํ ํด์ผํจ.)
๊น์ ๋ณต์ฌ

๐ก
Sword์ ๊ฐ์ฒด๋ this.sword๋ฅผ ๋ณต์ฌํ๋ฉด ํด๋์ค๋ reference type์ด๋ฏ๋ก,
๊น์ ๋ณต์ฌ๊ฐ ๋์ง ์๋๋ค.
๋ฐ๋ผ์, sword์ ๊ฐ์ ํด๋์ค ๋ํ ๋ค์ clone()์ ํตํด ๋ด๋ถ ์์ฑ๋ค์ ๋ค์ clone() ํจ์ผ๋ก, ์ง์ ํ ๊น์ ๋ณต์ฌ๋ฅผ ์ํํด์ผ ํ๋ค.
์ ๋ฆฌ
๐ก
Java reference ํ์
์ผ๋ก ๋์ํ๋ ๊ฒ์ ์ค์ ์ฌ์ฉํ ๋๋ ๊ฐ์ ๋น๊ตํ๋ฉฐ ์ฌ์ฉํ๊ธฐ ์ํด
toString, equals(), hashCode()๋ฅผ ์ฌ์ฉํ๋ค!
๐ก
๊ธฐ๋ณธ์ ์ผ๋ก Class๋ฅผ ์ ์ํ ๋,
๊ฐ ํ๋ ๋ณ์ ์ ์, ์์ฑ์(), getter(), setter(), toString(), equals(), hashCode()๊น์ง ๋ชจ๋ ์ ์ํ๋ ๊ฒ์ด ๊ธฐ๋ณธ์ ์ด๋ค!!
๐์ฐ์ต ๋ฌธ์
3-1

package Exam;
import java.util.Date;
import java.util.Objects;
public class Book implements Cloneable, Comparable<Book> {
private String title;
private Date publishDate;
private String comment;
public Book(String title, Date publishDate, String comment) {
this.title = title;
this.publishDate = publishDate;
this.comment = comment;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Date getPublishDate() {
return publishDate;
}
public void setPublishDate(Date publishDate) {
this.publishDate = publishDate;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
// ์ ๋ชฉ๊ณผ ์ถ๊ฐ์ผ์ด ๊ฐ์ผ๋ฉด ๊ฐ์ ์ฑ
์ผ๋ก ํ๋จ
@Override
public int hashCode() {
return Objects.hash(publishDate, title);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Book other = (Book) obj;
return Objects.equals(publishDate, other.publishDate) && Objects.equals(title, other.title);
}
// ์ถ๊ฐ์ผ์ด ์ค๋๋ ์์๋๋ก ์ ๋ ฌ
@Override
public int compareTo(Book o) {
// TODO Auto-generated method stub
if (this.publishDate.getTime() < o.publishDate.getTime()) {
return -1;
} else if (this.publishDate.getTime() > o.publishDate.getTime()) {
return 1;
} else {
return 0;
}
}
@Override
protected Book clone() {
Book result = new Book(this.title, this.publishDate, this.comment);
return result;
}
@Override
public String toString() {
return "Book [title=" + title + ", publishDate=" + publishDate + ", comment=" + comment
+ "]";
}
}
package Exam;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Date date1 = new Date(1111111111111L);
Date date2 = new Date(1222222222222L);
Date date3 = new Date(1223333333333L);
Date date4 = new Date(1224444444444L);
Date date5 = new Date(1225555555555L);
Book javaBook1 = new Book("์๋ฐ ์ฑ
", date1, "์ข์ ์ฑ
"); // ์ฑ
์ด๋ฆ๊ณผ ์ถํ์ผ์ด ๊ฐ์
Book javaBook2 = new Book("์๋ฐ ์ฑ
", date1, "์กฐ์์ฉ"); // ์ฑ
์ด๋ฆ๊ณผ ์ถ๋ฐ์ผ์ด ๊ฐ์
Book javaBook3 = new Book("์๋ฐ ์ฑ
", date2, "์ข์ ์ฑ
"); // ์ถํ์ผ์ด ๋ค๋ฆ
Book dbBook = new Book("DB ์ฑ
", date4, "๋ณดํต ์ฑ
");
Book pythonBook = new Book("ํ์ด์ฌ ์ฑ
", date3, "์ข์์");
Book kotlinBook = new Book("์ฝํ๋ฆฐ ์ฑ
", date2, "๋ง์ด ์ฌ์ธ์");
Book cppBook = new Book("C++ ์ฑ
", date5, "์ด๋ ค์์");
// 1. ์ ๋ชฉ๊ณผ ์ถ๊ฐ์ผ ๊ฐ์ผ๋ฉด ๊ฐ์ ์ฑ
์ผ๋ก ํ๋จ ํ์ธ
Set<Book> bookSet = new HashSet<Book>();
bookSet.add(javaBook1);
bookSet.add(javaBook2);
System.out.println(bookSet.size());
bookSet.add(javaBook3);
System.out.println(bookSet.size()); // ์ถํ์ผ์ด ๋ค๋ฅผ ๊ฒฝ์ฐ์๋ ๋ค๋ฅธ ์ฑ
์ผ๋ก ์ธ์
// 2. Book ์ธ์คํด์ค ๋ด์ ์ปฌ๋ ์
์ ๋ํด Collections.sort() - ์ถ๊ฐ์ผ์ด ์ค๋๋ ์์๋๋ก ์ ๋ ฌ
List<Book> bookList = new ArrayList<Book>();
bookList.add(javaBook1);
bookList.add(dbBook);
bookList.add(pythonBook);
bookList.add(kotlinBook);
bookList.add(cppBook);
System.out.println("์ ๋ ฌ ์ " + bookList);
Collections.sort(bookList);
System.out.println("์ ๋ ฌ ํ" + bookList); // ์ถ๊ฐ์ผ์ด ์ค๋๋ ์์๋๋ก ์ ๋ ฌ๋์๋ค.
Book cppBook2 = cppBook.clone();
cppBook2.setTitle("์์ cpp2");
System.out.println(cppBook);
System.out.println(cppBook2); // ๊น์ ๋ณต์ฌ๊ฐ ๋์๋ค.
}
}

Uploaded by N2T