일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 패캠챌린지
- 패스트캠퍼스
- R
- 알버트
- 직장인인강
- AI
- 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online.
- albert
- 한번에끝내는Java/Spring웹개발마스터초격차패키지
- 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지
- 직장인자기계발
- 패스트캠퍼스후기
- SKT
- 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online
- Today
- Total
제주 탈출 일지
패스트캠퍼스 챌린지 21일차 본문
오늘 설문 내야되는 일요일.. 레스고
CH4. 자바의 유용한 클래스들
01. Object 클래스 - 모든 클래스의 최상위 클래스
java.lang 패키지
import 하지 않아도 자동으로 import 됨.
String, Integer, System....
모든 클래스는 Object 클래스를 상속 받는다.
java.lang.Object 클래스
Object 클래스의 메서드 중 일부는 재정의해서 사용할 수 있음. (재정의 할 수 없는 메소드는 final로 선언되어 있다.)
컴파일러가 자동으로 extends Object를 추가함.
toString 메서드
객체의 정보를 String으로 바꾸어서 사용할 때 쓰임
String이나 Integer 클래스는 이미 재정의 되어 있음
객체의 정보를 표현할 때 보통 toString을 오버라이딩해서 많이 사용하게 됨.
package ch01;
class Book {
private String title;
private String author;
public Book(String title, String author) {
this.author = author;
this.title = title ;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return title + "," + author;
}
}
public class BookTest {
public static void main(String[] args) {
Book book = new Book("데미안" , "헤르만 헤세");
System.out.println(book.toString()); // 재정의 하지 않으면 객체의 주소가 출력
String str = new String("test");
System.out.println(str.toString()); // 문자열이 출력 (이미 재정의 됨)
}
}
02. Object 클래스의 메서드 활용
equals 메서드
두 인스턴스의 주소 값을 비교하여 true/false를 반환.
인스턴스가 같다 = 메모리의 위치가 같다. (==는 주소값만 비교한다.)
물리적 위치가 다르지만 논리적으로는 동일한 경우가 있을 수 있다.
(ex. 학번이 같다. 계좌번호가 같다. 사번이 같다. 같은 아이디의 회원)
이런 경우를 비교하기 위해 equals 메서드를 재정의 할 수 있다.
hashCode() 메서드
hashCode()는 인스턴스의 저장 주소를 반환함.
자바의 주소값을 hashCode라고 함.
자바에서 힙메모리를 관리하는 방식은 해시이다. 해시 함수에 키를 넣으면 그에 대한 인덱스를 반환받는다.(키는 유일하다.
만약 equals를 재정의하여 논리적으로 동일하다면, hashCode도 동일한 객체에 대해 동일한 값을 리턴해줘야 한다.
(사번을 리턴한다든가,, 동일한 아이디를 리턴한다던지,, 동일한 학번을 리턴한다든지..)
- equals와 hashCode 메서드는 짝꿍이다.
String 클래스의 equals는 String 값이 같은 경우 true를 반환하는데 이미 equals가 Overriding 되어있다. 그에 대한 hashCode도 값이 같으면 같은 값을 리턴한다.
clone() 메서드
객체의 원본을 복제하는데 사용하는 메서드
동일한 인스턴스가 생성됨. (객체 보호 관점에서 위배될 수 있다.)
clone 해도 된다는 의미는 "implements Cloneable"
그 후 Clone 메소드를 오버라이딩 한다.
package ch02;
public class Student implements Cloneable {
private int studentNum;
private String studentName;
public Student(int studentNum, String studentName) {
this.studentNum = studentNum;
this.studentName = studentName;
}
public String toString() {
return studentNum + ", " + studentName;
}
public void setStudentName(String name) {
this.studentName = name;
}
@Override
public int hashCode() {
return studentNum;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Student) {
Student std = (Student)obj;
if (this.studentNum == std.studentNum) {
return true;
}
else return false;
}
return false;
}
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
}
package ch02;
public class EqualsTest {
public static void main(String[] args) throws CloneNotSupportedException {
Student std1 = new Student(100, "Lee");
Student std2 = new Student(100, "Lee");
Student std3 = std1;
System.out.println(std1 == std3);
System.out.println(std1.equals(std2));
System.out.println(std1.hashCode());
System.out.println(std2.hashCode());
// system 함수를 통해 실제 hashCode를 출력
System.out.println(System.identityHashCode(std1));
System.out.println(System.identityHashCode(std2));
std1.setStudentName("Kim");
Student copyStudent = (Student) std1.clone();
System.out.println(copyStudent);
// String str1 = new String("abc");
// String str2 = new String("abc");
// System.out.println(str1.equals(str2));
// System.out.println(str1.hashCode());
// System.out.println(str2.hashCode());
//
// Integer i = 100;
// System.out.println(i.hashCode());
}
}
실행결과..
std1과 std3의 == 결과가 같은 이유는 std3이 std1의 주소를 복사했기 때문(== 연산은 주소가 같은지 비교한다.)
equals 메소드는 재정의 되어 std1과 std2의 학번을 비교한다.
hashCode는 학번을 리턴하도록 재정의하여 동일한 학번을 가진 인스턴스는 동일한 hashCode 값을 가지게 된다.
실제 hashCode값을 보고 싶다면 system의 정적 메소드인 identityHashCode 메소드를 사용하면 된다.
clone은 인스턴스를 복제하므로 setStudentName하여 변화된 Kim으로 인스턴스 복제가 일어난다.
따라서 100, kim 출력
나머지 object 클래스의 wait, notify 메소드는 쓰레드 관련 메소드이고 오버라이딩 할 수 없다. 나중에 쓰레드 처리할 떄 다룰 예정.
finalize() 가비지 콜렉터가 메모리 해제할 때 자동으로 불리는 메소드 (곧 deprecated 될 예정)
이번주의 끝... 고생
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
'패스트캠퍼스 챌린지!' 카테고리의 다른 글
패스트캠퍼스 챌린지 23일차 (0) | 2021.09.28 |
---|---|
패스트캠퍼스 챌린지 22일차 (0) | 2021.09.27 |
패스트캠퍼스 챌린지 20일차 (0) | 2021.09.25 |
패스트캠퍼스 챌린지 19일차 (0) | 2021.09.24 |
패스트캠퍼스 챌린지 18일차 (0) | 2021.09.23 |