From 55de829caa361d2b98ddec1cd8abd7138aa01ca3 Mon Sep 17 00:00:00 2001 From: KJY Date: Tue, 30 Jun 2026 15:43:25 +0900 Subject: [PATCH 1/3] =?UTF-8?q?26=5F06=5F30=20=EC=9D=B8=EC=8A=A4=ED=84=B4?= =?UTF-8?q?=EC=8A=A4=20=EA=B8=B0=EB=B3=B8=EC=A1=B0=EC=9E=91=20=EC=97=B0?= =?UTF-8?q?=EC=8A=B5=EB=AC=B8=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- post-oop/build.gradle | 20 +++++ .../main/java/com/survivalcoding/Book.java | 84 +++++++++++++++++++ .../main/java/com/survivalcoding/Main.java | 17 ++++ .../java/com/survivalcoding/BookTest.java | 79 +++++++++++++++++ settings.gradle | 3 +- 5 files changed, 202 insertions(+), 1 deletion(-) create mode 100644 post-oop/build.gradle create mode 100644 post-oop/src/main/java/com/survivalcoding/Book.java create mode 100644 post-oop/src/main/java/com/survivalcoding/Main.java create mode 100644 post-oop/src/test/java/com/survivalcoding/BookTest.java diff --git a/post-oop/build.gradle b/post-oop/build.gradle new file mode 100644 index 0000000..b9a9d5e --- /dev/null +++ b/post-oop/build.gradle @@ -0,0 +1,20 @@ +plugins { + id 'java' +} + +group = 'com.survivalcoding' +version = '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} + +dependencies { + testImplementation platform('org.junit:junit-bom:6.0.0') + testImplementation 'org.junit.jupiter:junit-jupiter' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' +} + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/post-oop/src/main/java/com/survivalcoding/Book.java b/post-oop/src/main/java/com/survivalcoding/Book.java new file mode 100644 index 0000000..0be847d --- /dev/null +++ b/post-oop/src/main/java/com/survivalcoding/Book.java @@ -0,0 +1,84 @@ +package com.survivalcoding; + +import java.util.Date; +import java.util.Objects; + +public class Book implements Comparable, Cloneable { + private String title; + private Date publishDate; + private String comment; + + public Book() { + } + + 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 String toString() { + return "Book{" + + "title='" + title + '\'' + + ", publishDate=" + publishDate + + ", comment='" + comment + '\'' + + '}'; + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + Book book = (Book) o; + return Objects.equals(title, book.title) && Objects.equals(publishDate, book.publishDate); + } + + @Override + public int hashCode() { + return Objects.hash(title, publishDate); + } + + @Override + public int compareTo(Book other) { + if (this.publishDate == null || other.publishDate == null) { + return 0; + } + return other.publishDate.compareTo(this.publishDate); + } + + + @Override + public Book clone() { + Book result = new Book(); + result.title = this.title; + result.comment = this.comment; + if (this.publishDate != null) { + result.publishDate = (Date) this.publishDate.clone(); + } + return result; + } +} diff --git a/post-oop/src/main/java/com/survivalcoding/Main.java b/post-oop/src/main/java/com/survivalcoding/Main.java new file mode 100644 index 0000000..44c89d7 --- /dev/null +++ b/post-oop/src/main/java/com/survivalcoding/Main.java @@ -0,0 +1,17 @@ +package com.survivalcoding; + +//TIP 코드를 실행하려면 을(를) 누르거나 +// 에디터 여백에 있는 아이콘을 클릭하세요. +public class Main { + public static void main(String[] args) { + //TIP 캐럿을 강조 표시된 텍스트에 놓고 을(를) 누르면 + // IntelliJ IDEA이(가) 수정을 제안하는 것을 확인할 수 있습니다. + System.out.printf("Hello and welcome!"); + + for (int i = 1; i <= 5; i++) { + //TIP 을(를) 눌러 코드 디버그를 시작하세요. 1개의 중단점을 설정해 드렸습니다 + // 언제든 을(를) 눌러 중단점을 더 추가할 수 있습니다. + System.out.println("i = " + i); + } + } +} \ No newline at end of file diff --git a/post-oop/src/test/java/com/survivalcoding/BookTest.java b/post-oop/src/test/java/com/survivalcoding/BookTest.java new file mode 100644 index 0000000..825439f --- /dev/null +++ b/post-oop/src/test/java/com/survivalcoding/BookTest.java @@ -0,0 +1,79 @@ +package com.survivalcoding; + +import org.junit.jupiter.api.Test; + +import java.util.*; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class BookTest { + + @Test + void testEquals() { + Date publishDate = new Date(124, 0, 1); + + Book book1 = new Book(); + book1.setTitle("자바 마스터"); + book1.setPublishDate(publishDate); + book1.setComment("첫 번째 책"); + + Book book2 = new Book(); + book2.setTitle("자바 마스터"); + book2.setPublishDate(publishDate); + book2.setComment("내용만 다른 두 번쨰 책"); + + assertEquals(book1, book2); + assertEquals(book1.hashCode(), book2.hashCode()); + + Set bookSet = new HashSet<>(); + bookSet.add(book1); + bookSet.add(book2); + + assertEquals(1, bookSet.size()); + + } + + @Test + void compareTo() { + Date date2024 = new Date(124, 0, 1); + Date date2026 = new Date(126, 5, 30); + + Book oldBook = new Book(); + oldBook.setTitle("과거에 나온 책"); + oldBook.setPublishDate(date2024); + + Book newBook = new Book(); + newBook.setTitle("따끈따끈한 신상 책"); + newBook.setPublishDate(date2026); + + List bookList = new ArrayList<>(); + bookList.add(oldBook); + bookList.add(newBook); + + Collections.sort(bookList); + + assertEquals(newBook, bookList.get(0)); + assertEquals(oldBook, bookList.get(1)); + } + + @Test + void testClone() { + Date originalDate = new Date(124, 0, 1); + + Book originalBook = new Book(); + originalBook.setTitle("원본 책"); + originalBook.setPublishDate(originalDate); + + Book clonedBook = originalBook.clone(); + + Date newDate = new Date(126, 5, 30); + clonedBook.getPublishDate().setTime(newDate.getTime()); + + assertEquals(originalBook.getTitle(), clonedBook.getTitle()); + + long originalTime = originalBook.getPublishDate().getTime(); + long expectedTime = originalDate.getTime(); + + assertEquals(expectedTime, originalTime); + } +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index ae6efff..ef4d2e3 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,3 +1,4 @@ rootProject.name = 'polytech_java2' include 'day01-basic' -include 'game' \ No newline at end of file +include 'game' +include 'post-oop' \ No newline at end of file From ba47e9e95a4198933b607fe7ab09930a6ee6691e Mon Sep 17 00:00:00 2001 From: KJY Date: Tue, 30 Jun 2026 16:00:54 +0900 Subject: [PATCH 2/3] =?UTF-8?q?26=5F06=5F30=20=EC=9D=B8=EC=8A=A4=ED=84=B4?= =?UTF-8?q?=EC=8A=A4=20=EA=B8=B0=EB=B3=B8=EC=A1=B0=EC=9E=91=20TIL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\353\263\270\354\241\260\354\236\221.md" | 170 ++++++++++++++++++ post-oop/06_30.puml | 34 ++++ 2 files changed, 204 insertions(+) create mode 100644 "TIL/sample/2026-06-30-\354\235\270\354\212\244\355\204\264\354\212\244\352\270\260\353\263\270\354\241\260\354\236\221.md" create mode 100644 post-oop/06_30.puml diff --git "a/TIL/sample/2026-06-30-\354\235\270\354\212\244\355\204\264\354\212\244\352\270\260\353\263\270\354\241\260\354\236\221.md" "b/TIL/sample/2026-06-30-\354\235\270\354\212\244\355\204\264\354\212\244\352\270\260\353\263\270\354\241\260\354\236\221.md" new file mode 100644 index 0000000..655a770 --- /dev/null +++ "b/TIL/sample/2026-06-30-\354\235\270\354\212\244\355\204\264\354\212\244\352\270\260\353\263\270\354\241\260\354\236\221.md" @@ -0,0 +1,170 @@ +# 2026-06-30 인스턴스 기본 조작. + +## 오늘 배운 내용 + +- Object 클래스의 기본기능 +- + 1. 모든 클래스는 Object 클래스의 메서드를 가지고 있다 +- + 2. Object 타입 변수에는 모든 인스턴스를 대입할수있따 +- +- toString() : 문자열 표현을 얻음 +- equals() : 비교 +- hashCode() : 해시값을 얻음 +- toString()는 오버라이드하여 원하는 결과를 얻도록 수정할 수 있따 +- equals()는 메서드를 오버라이드하여 동등성 규칙을 정의하고 List에서 동등성 비교시 사용된다 +- hashCode()를 재정의하면 Set, Map 내부에서의 동등성 규칙으로 사용된다 + +## 기억할 것 + +- Set, Map 계열은 요소를 검색할 때 equals() 보다 비용이 싼 hashCode() 비교를 사용함 +- List 는 순차 검색이라 느림 +- + 1. 모든 객체는 해시값을 가진다 +- + 2. 동일한 객체는 항상 같은 해시값을 가진다. +- + 3. 하지만, 같은 해시값이라고 항상 동일한 객체는 아니다. +- Collections.sort() 메서드는 컬렉션 내부를 정렬해 준다 +- 정렬 대상은 반드시 Comparable 인터페이스를 구현해야 한다 +- Comparable 인터페이스를 구현하지 않은 객체도 즉석에서 정렬 규칙을 정해줄 수 있음 +- 규칙은 동일 compareTo() 의 규칙과 동일 +- a, b 가 매개변수인 경우 +- + 1. a 가 b 보다 작으면 음수 (-1) +- + 2. 같으면 0 +- + 3. a 가 b 보다 크면 양수 (+1) +- 얕은 복사는 객체 자체는 새로 생성되지만, 객체 내의 참조 타입 필드(다른 객체에 대한 참조)는 원본과 동일한 객체를 참조합니다. +- 즉, 중첩된 객체는 복사되지 않고 주소만 복사됩니다. +- 원본 객체의 참조 타입 필드를 변경하면 복사본의 해당 필드도 함께 변경됩니다. + +## 정리 + +### 객체의 내용을 알기 쉽게 보여주기 위해 다음 메서드를 재정의 해 준다 + +- toString() + +### 객체의 동등성 비교 규칙을 위해 다음 메서드를 재정의 해 준다 + +- equals +- hashCode + +### 복사를 지원하기 위해 다음 메서드를 작성한다. + +- Cloneable 인터페이스를 구현하여 얕은 복사를 구현하기로 한다 + +### 얕은 복사 + +- 객체 자체는 새로 생성되지만, 객체 내의 참조 타입 필드(다른 객체에 대한 참조)는 원본과 동일한 객체를 참조합니다. +- 즉, 중첩된 객체는 복사되지 않고 주소만 복사됩니다. +- 원본 객체의 참조 타입 필드를 변경하면 복사본의 해당 필드도 함께 변경됩니다. + +### 깊은 복사 + +- 객체 자체뿐만 아니라, 객체 내의 모든 참조 타입 필드(중첩된 객체들)까지도 재귀적으로 완전히 새로 생성하여 복사합니다. +- 원본 객체와 복사본 객체는 완전히 독립적입니다. 한쪽을 변경해도 다른 쪽에는 영향을 주지 않습니다. + +## 실습 코드 + +```java +package com.survivalcoding; + +import java.util.Date; +import java.util.Objects; + +public class Book implements Comparable, Cloneable { + private String title; + private Date publishDate; + private String comment; + + public Book() { + } + + 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 String toString() { + return "Book{" + + "title='" + title + '\'' + + ", publishDate=" + publishDate + + ", comment='" + comment + '\'' + + '}'; + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + Book book = (Book) o; + return Objects.equals(title, book.title) && Objects.equals(publishDate, book.publishDate); + } + + @Override + public int hashCode() { + return Objects.hash(title, publishDate); + } + + @Override + public int compareTo(Book other) { + if (this.publishDate == null || other.publishDate == null) { + return 0; + } + return other.publishDate.compareTo(this.publishDate); + } + + + @Override + public Book clone() { + Book result = new Book(); + result.title = this.title; + result.comment = this.comment; + if (this.publishDate != null) { + result.publishDate = (Date) this.publishDate.clone(); + } + return result; + } +} + + +``` + +## 어려웠던 점 + +- 수업 내용이랑 연습문제가 어려웠다 + +## 해결 방법 + +- 최대한 찾아가며 연습문제를 풀었다 + +## 내일 더 공부할 것 + +- 복사랑 정렬에 대해 공부해야될거 같다 diff --git a/post-oop/06_30.puml b/post-oop/06_30.puml new file mode 100644 index 0000000..def4fcd --- /dev/null +++ b/post-oop/06_30.puml @@ -0,0 +1,34 @@ +@startuml +skinparam classAttributeIconSize 0 + +interface Comparable { + + compareTo(other: T): int +} + +interface Cloneable { +} + +class Book { + - title: String + - publishDate: Date + - comment: String + + + Book() + + Book(title: String, publishDate: Date, comment: String) + + getTitle(): String + + setTitle(title: String): void + + getPublishDate(): Date + + setPublishDate(publishDate: Date): void + + getComment(): String + + setComment(comment: String): void + + toString(): String + + equals(o: Object): boolean + + hashCode(): int + + compareTo(other: Book): int + + clone(): Book +} + +Comparable <|.. Book : <> +Cloneable <|.. Book : <> + +@enduml \ No newline at end of file From bea3593ea4533743007f3205684dda02cccbb122 Mon Sep 17 00:00:00 2001 From: KJY Date: Tue, 30 Jun 2026 16:50:55 +0900 Subject: [PATCH 3/3] =?UTF-8?q?26=5F06=5F30=20=EC=9D=B8=EC=8A=A4=ED=84=B4?= =?UTF-8?q?=EC=8A=A4=20=EA=B8=B0=EB=B3=B8=EC=A1=B0=EC=9E=91=20equals?= =?UTF-8?q?=EC=88=98=EC=A0=95=EB=B3=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/survivalcoding/Book.java | 15 +++++++++++++++ .../test/java/com/survivalcoding/BookTest.java | 13 ++++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/post-oop/src/main/java/com/survivalcoding/Book.java b/post-oop/src/main/java/com/survivalcoding/Book.java index 0be847d..90fe8dc 100644 --- a/post-oop/src/main/java/com/survivalcoding/Book.java +++ b/post-oop/src/main/java/com/survivalcoding/Book.java @@ -54,11 +54,26 @@ public String toString() { public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; Book book = (Book) o; + if (this.publishDate != null && book.publishDate != null) { + // 년-월-일 형태로 포맷을 지정 + java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd"); + + String d1 = sdf.format(this.publishDate); + String d2 = sdf.format(book.publishDate); + + return Objects.equals(title, book.title) && d1.equals(d2); + } return Objects.equals(title, book.title) && Objects.equals(publishDate, book.publishDate); } @Override public int hashCode() { + if (this.publishDate != null) { + java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd"); + String dateStr = sdf.format(this.publishDate); + return Objects.hash(title, dateStr); + } + return Objects.hash(title, publishDate); } diff --git a/post-oop/src/test/java/com/survivalcoding/BookTest.java b/post-oop/src/test/java/com/survivalcoding/BookTest.java index 825439f..490b8df 100644 --- a/post-oop/src/test/java/com/survivalcoding/BookTest.java +++ b/post-oop/src/test/java/com/survivalcoding/BookTest.java @@ -10,16 +10,23 @@ class BookTest { @Test void testEquals() { - Date publishDate = new Date(124, 0, 1); + java.util.Calendar cal1 = java.util.Calendar.getInstance(); + cal1.set(2024, java.util.Calendar.JANUARY, 1, 9, 0, 0); // 2024-01-01 09:00:00 + Date morningDate = cal1.getTime(); + + java.util.Calendar cal2 = java.util.Calendar.getInstance(); + cal2.set(2024, java.util.Calendar.JANUARY, 1, 23, 59, 59); // 2024-01-01 23:59:59 + Date eveningDate = cal2.getTime(); + Book book1 = new Book(); book1.setTitle("자바 마스터"); - book1.setPublishDate(publishDate); + book1.setPublishDate(morningDate); book1.setComment("첫 번째 책"); Book book2 = new Book(); book2.setTitle("자바 마스터"); - book2.setPublishDate(publishDate); + book2.setPublishDate(eveningDate); book2.setComment("내용만 다른 두 번쨰 책"); assertEquals(book1, book2);