Dev/Java

[Java ์‘์šฉ] 3. ์ธ์Šคํ„ด์Šค ๊ธฐ๋ณธ ์กฐ์ž‘

KeyDi 2023. 3. 20. 13:14
728x90

๐Ÿ“˜ ์‘์šฉ 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 )
https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html

@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

728x90
๋ฐ˜์‘ํ˜•