본문 바로가기
Programming Languages/Java

Chapter 20. Object 클래스

by 더 이프 2023. 1. 13.
728x90

목차

    1. Objcet 클래스

    ■ Object 클래스란?

    • 자바에서 최상위 클래스
    • 자바에서 클래스를 만들 때 항상 Object 클래스를 상속 받음
    • 자식 클래스가 부모 클래스를 상속받을 경우 Object 클래스를 다중 상속하는게 아니라 부모 클래스가 Object 클래스를 상속 받음
    • 자식 클래스 생성 시 부모클래스, Object 클래스 모두 생성됨
    • 모든 클래스는 Object 내에 있는 메소드들을 오버라이드하여 재정의 가능

    ■ Object 클래스 메소드 종류

    • toString
    • equals
    • hashCode
    • getClass
    • finalize

     

    2. 예시

    ■ ObjectEquals

    package j16_Object;
    
    public class ObjectEquals {
    
    	public static void main(String[] args) {
    
    		String name1 = "김준일";
    		String name2 = "김준일";
    		String name3 = new String("김준일");
    
    		System.out.println(name1);
    		System.out.println(name2);
    		
            // 주소 비교
    		System.out.println(name1 == name2); 
    		System.out.println(name1 == name3);
            
            // equals를 통해 안에 들어있는 실제 값을 비교
    		System.out.println(name1.equals(name3)); 
    
    		// s2가 Object로 업캐스팅되고 주소를 비교
            // s3는 SubStudent로 다른 객체기 때문에 다운캐스팅 불가
    		Student s1 = new Student("박은빈", 24);
    		Student s2 = new Student("박은빈", 24);
    		SubStudent s3 = new SubStudent("박은빈", 24);
           
    		System.out.println(s1.equals(s3));  
    	}
    }

    ■ ObjectFinalize

    package j16_Object;
    
    class Test {
    
    	private int num;
    
    	public Test(int num) {
    		super();
    		this.num = num;
    		System.out.println(num + "생성");
    	}
    
    	// Garbage collector가 실행되어 소멸되었을 때 실행
    	// 소멸자 finalize()
    	@Override
    	protected void finalize() throws Throwable {
    		System.out.println(num + "객체 소멸");
    	}
    }
    
    public class ObjectFinalize {
    
    	public static void main(String[] args) {
    
    		Test test = null;
    
    		for (int i = 0; i < 10; i++) {
    			try {
    				Thread.sleep(500);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    			test = new Test(i);
    
    			test = null;
                
    			// JVM이 여유있을때 실행
                // 어떤걸 소멸시킬지 모르기 때문에 주의해서 사용
    			System.gc();
    		}
    	}
    }

    ■ ObjectGetClass

    package j16_Object;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    public class ObjectGetClass {
    
    	public static void main(String[] args) {
    
    		Student student = new Student("김재영", 29);
            
    		// getClass()를 통해 해당하는 객체의 클래스의 정보를 가져옴
    		System.out.println(student.getClass());
            
    		// .class는 해당 클래스의 정보를 가져옴 
    		System.out.println(Student.class); 
            
    		// getClass()를 통해 명확하게 같은 클래스인지 확인
    		System.out.println(student.getClass().getName());
    
    		Class studentClass = student.getClass();
            
    		// 패키지명도 나옴
    		String className = studentClass.getName(); 
    		System.out.println("클래스 이름 : " + className);
            
    		// 클래스명만 나옴
    		String simpleName = studentClass.getSimpleName();
    		System.out.println("클래스 이름만 : " + simpleName);
    
    		// Declared가 있으면 접근 지정자에 상관없이 다 가져옴
    		Field[] fields = studentClass.getDeclaredFields();
    		for (Field field : fields) {
    			System.out.println(field);
    		}
    
    		System.out.println();
    
    		Method[] methods = studentClass.getDeclaredMethods();
    		for (Method method : methods) {
    			System.out.println(method);
    		}
    	}
    }

    ■ ObjectHashCode

    package j16_Object;
    
    public class ObjectHashCode {
    
    	public static void main(String[] args) {
    		
    		Student s1 = new Student("김수현", 31);
    		Student s2 = new Student("김수현", 31);
    		SubStudent s3 = new SubStudent("김수현", 31);
            
    		// 기본 생성 시 hashCode() 주소값을 나타냄
    		System.out.println(s1.hashCode());
    		System.out.println(s2.hashCode());
            
    		// 객체가 달라도 hashCode값이 같으면 true로 성립
    		System.out.println(s1.hashCode() == s2.hashCode());
    		System.out.println(s1.hashCode() == s3.hashCode());
    	}
    }

    ■ ObjectToString

    package j16_Object;
    
    public class ObjectToString {
    
    	public static void main(String[] args) {
    
    		Object obj = new Object();
    		System.out.println(obj);
            
            // String으로 return해서 String에 대입 가능
    		String str = obj.toString(); 
    		System.out.println(str);
    
    		Student student1 = new Student("조병철", 34);
    		Student student2 = new Student("김동민", 28);
    		Student student3 = new Student("김두영", 28);
    		Student student4 = new Student("강의진", 29);
    
    		System.out.println(student1);
    		System.out.println(student2);
    		System.out.println(student3);
    		System.out.println(student4);
    
    		System.out.println();
    
    		System.out.println(student1.toString());
    		System.out.println(student2.toString());
    		System.out.println(student3.toString());
    		System.out.println(student4.toString());
    	}
    }

    ■ Student

    package j16_Object;
    
    import java.util.Objects;
    
    public class Student {
    
    	private String name;
    	private int age;
    
    	public Student(String name, int age) {
        	// 부모 클래스의 생성자
            // Object클래스에서 상속받음
    		super();
    		this.name = name;
    		this.age = age;
    	}
    
    	// hash는 특별한 알고리즘을 이용하여 데이터의 고유한 주소값 생기며 이를 숫자로 변환한 것을 hashCode라고 함
    	@Override
    	public int hashCode() {
        	// 객체들을 관리하는 소스코드를 가지고 있음
    		return Objects.hash(name, age);
    	}
    	
    	@Override
    	public boolean equals(Object obj) {
    		if (this == obj) {
    			return true;
    		}
    		if (obj == null) {
    			return false;
    		}
            // 객체의 클래스를 가져와 명확하게 Student 클래스일 경우를 비교함
    		if (!(obj.getClass() == Student.class)) {
    			return false;
    		}
    
    		Student s = (Student) obj;
    		boolean result = name.equals(s.name) && age == s.age;
    
    		return result;
    	}
    
    	@Override
    	public String toString() {
    		return "이름 : " + name + "\n나이 :" + age;
    	}
    }

    ■ SubStudent

    package j16_Object;
    
    import java.util.Objects;
    
    public class SubStudent {
    
    	private String name;
    	private int age;
    
    	public SubStudent(String name, int age) {
    		super();
    		this.name = name;
    		this.age = age;
    	}
    
    	@Override
    	public int hashCode() {
    		return Objects.hash(name, age);
    	}
    }