[1] Object 클래스
(1) Object 클래스
- java.lang.Object 클래스
- 모든 클래스의 최상위 클래스이다
- 모든 클래스는 Object 클래스로부터 상속받는다
- extends Object라고 되어있지 않더라도 컴파일러를 통해 자동으로 상속받게 적용한다
- Object 클래스는 최상위 클래스이기 때문에 모든 클래스 내에서 Object 메서드 중 일부는 재정의해서 사용할 수 있다 (final 선언된 메서드 제외)
- 컴파일러가 extends Object를 추가함
- class Student 라고 선언된것은 class Student extends Object 이렇게 상속된 것이다
(2) java.lang 패키지 내부에 object 클래스가 있다
- 프로그래밍시 import 하지 않아도 자동으로 imort됨
- import.java.lang.*;
- 많이 사용하는 기본 클래스들이 속한 패키지
- String, Integer, System...
[2] Object 메서드 -11개
(1) clone()
- protected Object clone()
- 인스턴스 객체 자신을 복하는데 사용한다
- 생성과정의 복잡한 과정을 반복하지 않고 복제 할 수 있음
- clone()메서드를 사용하면 객체의 정보(멤버 변수 값등...)가 동일한 또 다른 인스턴스가 생성되는 것이므로, 객체 지향 프로그램에서의 정보 은닉, 객체 보호의 관점에서 위배될 수 있음
- 해당 클래스의 clone() 메서드의 사용을 허용한다는 의미로 cloneable 인터페이스를 명시해 줌
implements Cloneable 명시하고 재정의한다
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;
}
@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 {
return super.clone();
}
}
복제한 객체는 동일한 결과값을 가지고 온다
package ch02;
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
Student studentA = new Student(100,"kim");
Student copyStudent = (Student)studentA.clone();
System.out.println(copyStudent); // 100, kim
}
}
복제한 객체에 다른 결과값을 부여하려고 한다면
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;
}
@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 {
return super.clone();
}
// 클론의 객체값을 변경하기 위해 추가
public void setStudentName(String name) {
this.studentName = name;
}
}
인스턴스에 들어가는 생성자 멤버변수를 구체적으로 정의하여 실행클래스에 값을 입력해준다
package ch02;
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
Student studentA = new Student(100,"kim");
studentA.setStudentName("변경된이름 ");
Student copyStudent = (Student)studentA.clone();
System.out.println(copyStudent);
}
}
(2) finalize()
protected void finalize()
객체가 소멸될때 가비지 컬렉터에 의해 자동적으로 호출된다. 이때 수행되어야하는 코드가 있을때 오버라이딩한다.
(3) getClass()
public class getClass()
객체 자신의 클래스 정보를 담고 있는 Class 인스턴스를 반환한다
(4) equals()
- public boolean equals(Object obj)
- 객체 자신과 객체 obj가 같은 객체라면 true를 반환한다
- 두 인스턴스의 주소 값을 비교하여 참,거짓을 반환한다
- 재정의 하여 두 인스턴스가 논리적으로 동일함의 여부를 구현함
- 반대로 == 비교의 경우 , 물리적으로 주소값이 일치하는지를 판단한다
- 인스턴스가 다르더라도 논리적으로 동일한 경우 true를 반환하도록 재정의 할 수 있음
- (같은 학번, 같은 사번, 같은 아이디의 회원...)
equals 비교하기
package ch02;
public class Student {
private int studentNum;
private String studentName;
public Student (int studentNum , String studentName) {
this.studentNum = studentNum;
this.studentName = studentName;
}
public String toString() {
return studentNum + " , " + studentName;
}
}
euqals와 == 는 주소값을 비교하는 것이기 때문에
주소값 자체를 대입하여 equals와 == 으로 비교했을때 참 이라는 결과물을 얻게된다
package ch02;
public class Test {
public static void main(String[] args) {
Student studentA = new Student(100,"kim");
Student studentB = new Student(100,"kim");
System.out.println(studentA == studentB); // 같지않다
System.out.println(studentA.equals(studentB)); // 같지않다
// 학생 c 의 주소값이 학생 A 주소값과 같다고 대입한다
Student studentC = studentA;
System.out.println(studentA == studentC); // 같다
System.out.println(studentA.equals(studentC)); // 같다
}
}
equals 오버라이딩
강제로 논리적으로 일치시키기
equals 메서드와 hashcode()메서드를 재정의하면
출력 결과물이 달라지고
기존의 hashcode 값은 System.identityHashCode() 하면 찾을수 있다
package ch02;
public class Test {
public static void main(String[] args) {
Student studentA = new Student(100,"kim");
Student studentB = new Student(100,"kim");
// 인스턴스의 주소값은 서로 다르다
System.out.println(studentA == studentB);
// equals를 재정의하니 주소값이 서로 같다로 바뀌었다
System.out.println(studentA.equals(studentB));
// 인스턴스의 해쉬코드 = 주소값은 서로 달랐지만 hashCode()도 재정의하니 같아졌다
System.out.println(studentA.hashCode());
System.out.println(studentB.hashCode());
//hashCode() 재정의 전의 값은 어떻게 찾는가
System.out.println(System.identityHashCode(studentA));
System.out.println(System.identityHashCode(studentB));
}
}
(5) hashCode()
- public int hashCode()
- 인스턴스 객체 자신의 주소값인 해시코드를 반환한다
- 힙메모리에 인스턴스가 저장되는 방식이 hash 방식으로 저장된다
- 해쉬 hash : 정보를 저장, 검색하는 자료구조
- 자료의 특정 값(키 값)에 대한 저장 위치를 반환해주는 해시 함수를 사용
- equals 메서드 값과 hashCode() 메서드 값은 세트로 일치한다
- 논리적으로 동일함을 위해 equals() 메서드를 재정의 하였다면 hashCode()메서드도 재정의 하여 동일한 hashCode 값이 반환되도록 한다
(6) toString()
- public String toString()
- 객체 자신의 정보를 String 문자열로 바꿀때 사용한다
- String이나 Integer 클래스는 이미 재정의 되어 있어 toString()을 하지 않아도된다
- 클래스 속성으로 인스턴스한 객체를 출력하면 주소값이 출력되지만 String 속성 객체는 출력하면 값으로 출력된다
- 객체.toString 하지 않아도 String 속성은 그대로 출력된다
package ch01;
class Book {
private String title;
private String author;
public Book (String title , String author) {
this.title = title;
this.author = author;
}
}
public class Test {
public static void main(String[] args) {
Book book = new Book("책1", "작가1");
System.out.println(book); //ch01.Book@2c8d66b2
String str = new String("test");
System.out.println(str); //test
System.out.println(str.toString()); //test
}
}
클래스 속성의 인스턴스한 객체를 출력했을때 나오는 주소값을 값으로 바꾸고 싶다면
toString()을 재정의하여 객체로 출력하게 만든다
package ch01;
class Book {
private String title;
private String author;
public Book (String title , String author) {
this.title = title;
this.author = author;
}
/* 주소값으로 출력되게 한 값
@Override
public String toString() {
return super.toString();
}*/
@Override
public String toString() {
return title +"과 " +author;
}
}
public class Test {
public static void main(String[] args) {
Book book = new Book("책1", "작가1");
System.out.println(book); // 주소값이 아닌 책1과 작가1 로 출력된다
String str = new String("test");
System.out.println(str);
System.out.println(str.toString());
}
}
(7) notify()
public void notify()
객체 자신을 사용하려고 기다리는 쓰레드를 하나만 깨운다
쓰레드 관련 메서드
(8) notifyAll()
public void notifyAll()
객체 자신을 사용하려고 기다리는 모든 쓰레드를 깨운다
쓰레드 관련 메서드
(9) wait()
public void wait()
쓰레드 관련 메서드
다른 스레드가 notify() 나 notifyAll()을 호출할때까지 현재 스레드를 무한히 또는 지정된 시간동안 기다리게 한다
(10) wati(long timeout)
public void wati(long timeout)
쓰레드 관련 메서드
(11) wati(long timeout, int nanos)
public void wati(long timeout, int nanos)
쓰레드 관련 메서드
'🌈 백엔드 > 객체 지향' 카테고리의 다른 글
JAVA_객체지향_런타임에 메소드 매개변수 알아내기 (0) | 2023.08.12 |
---|---|
자바API_ Reflection API_객체생성 (0) | 2023.08.03 |
JAVA_객체지향_패키지 package & 클래스 패스 (0) | 2023.07.10 |
JAVA_객체지향_컬렉션 프레임워크 (자료구조) (0) | 2023.06.21 |
JAVA_객체지향_제네릭 프로그래밍 (0) | 2023.06.19 |