ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java ์‘์šฉ] 3. ์ธ์Šคํ„ด์Šค ๊ธฐ๋ณธ ์กฐ์ž‘
    Dev/Java 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
    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€

Keydi's Tistory