[JAVA] day7_1

99winnmin·2022년 7월 5일
0

java

목록 보기
10/10

JAVA의 다양한 클래스

Object 클래스 - 모든 클래스의 최상위 클래스

java.lang 패키지

  • 프로그래밍시 import 하지 않아도 자동으로 imort됨
  • import.java.lang.*;
  • 많이 사용하는 기본 클래스들이 속한 패키지
  • String, Integer, System...

모든 클래스는 Object 클래스를 상속 받는다

  • java.lang.Object 클래스
  • 모든 클래스는 Object에서 상속받고, Object 클래스의 메서드 중 일부는 재정의해서 사용할 수 있음
  • 컴파일러가 extends Object를 추가함 ex) class Student => class Student extends Object

toString() 메서드

  • 객체의 정보를 String으로 바꾸어서 사용할 때 쓰임
  • String이나 Integer 클래스는 이미 재정의 되어 있음
  • toString()메서드 재정의 예
@Override
    public String toString() {
        return title+","+author;
    }

boolean equals() 메서드

  • 두 인스턴스의 주소 값을 비교하여 true/false를 반환(힙 메모리에 할당되어있는 주소 값이 같아야 true)
  • 재정의 하여 두 인스턴스가 논리적으로 동일함의 여부를 구현함
  • 인스턴스가 다르더라도 논리적으로 동일한 경우 true를 반환하도록 override 할 수 있음

int hashCode() 메서드

  • hashCode()는 인스턴스의 저장 주소를 반환함

  • 힙메모리에 인스턴스가 저장되는 방식이 hash 방식 => JVM에서 힙 메모리를 관리하는 방식이 Hash 방식

  • hash : 정보를 저장, 검색하는 자료구조 -> hash(key) = index

  • 자료의 특정 값(키 값)에 대한 저장 위치를 반환해주는 해시 함수를 사용

  • 두 인스턴스가 같다는 것은?
    -두 인스턴스에 대한 equals()의 반환 값이 true
    -동일한 hashCode() 값을 반환

  • 논리적으로 동일함을 위해 equals() 메서드를 재정의 하였다면 hashCode()메서드도 재정의 하여 동일한 hashCode 값이 반환되도록 한다

  • equals(),hashcode() override 예시

	@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
    public int hashCode() {
        return studentNum;
    }

clone() 메서드

  • 객체의 원본을 복제하는데 사용하는 메서드(생성자는 초기화하면서 생성하는 것으로 개념이 다름)
public class EqualsTest {
    public static void main(String[] args) throws CloneNotSupportedException {
        Student std1 = new Student(100,"Lee");
        Student copyStudent = (Student)std1.clone(); //이렇게 하면 컴파일 에러!!
    }
}
  • Object 클래스의 clone()메서드는 접근 제어자가 protected임
  • Student 클래스는 동일한 패키지(java.lang)나 상속관계가 아니므로 clone()을 호출할 수 없음 그래서 컴파일 에러가 발생한 것
  • 따라서 상속관계가 아닌 다른 클래스에서 .clone()을 호출하기 위해서는 다음과 같이 override해주면 됨
@Override
    public Object clone() throws CloneNotSupportedException {
        Object obj = null;
        try{
            obj = super.clone();
        }catch(CloneNotSupportedException e){
        }
        return obj;
    }
  • 또는 covariant return type을 이용해서 오버라이딩할 때 조상 메소드의 반환타입을
    자손 클래스 타입으로 변경을 허용할 수도 있음 -> 이러면 호출할 때 Student copyStudent = std1.clone(); 으로 호출
@Override
    public Student clone() throws CloneNotSupportedException {
        Object obj = null;
        try{
            obj = super.clone();
        }catch(CloneNotSupportedException e){
        }
        return (Student) obj; //downcasting
    }
  • 생성과정의 복잡한 과정을 반복하지 않고 복제 할 수 있음
  • clone()메서드를 사용하면 객체의 정보(멤버 변수 값등...)가 동일한 또 다른 인스턴스가 생성되는 것이므로, 객체 지향 프로그램에서의 정보 은닉, 객체 보호의 관점에서 위배될 수 있음
  • 해당 클래스의 clone() 메서드의 사용을 허용한다는 의미로 cloneable 인터페이스를 명시해 줌
public class Student implements Cloneable{
}
profile
功在不舍

0개의 댓글