본문 바로가기

Programming/Java

[Java] 김영한의 자바 중급 1편 #1 - Object 클래스

반응형

김영한 선생님의 자바 중급을 듣고 정리한 내용입니다.

 

 


 

1. java.lang 패키지

java.lang : 자바가 기본으로 제공하는 라이브러리(클래스 모음)중에 가장 기본이 되는 것으로 자바 언어를 이루는 가장 기본이 되는 클래스들을 보관하는 패키지

 

1.1. 대표 클래스들

  • Object : 모든 자바 객체의 부모 클래스
  • String : 문자열
  • Integer, Long, Double : 래퍼 타입으로 기본형 데이터 타입을 객체 형태로 만든 것
  • Class : 클래스의 메타 정보를 담고 있는 클래스
  • System : 시스템과 관련된 기본 기능들을 제공

 

 


2. Object 클래스

Object class : 자바에서 모든 클래스의 최상위 부모 클래스를 의미함

  • Object 클래스는 모든 클래스의 부모 클래스이다.
  • Parent 클래스는 Object 클래스를 암묵적으로 상속받는다.
  • Child 클래스는 Parent 클래스를 명시적으로 상속받고, Object 클래스는 당연히 암묵적으로 상속받는다.

 

2.1. Object, Parent, Child 클래스 예시

 

 

2.2. 실행 결과 그림

  • child.toString() 함수를 호출한다.
  • 본인 타입인 Child 클래스에서는 toString()이 없음을 확인
    • 부모 타입인 Parent 클래스에서도 toString()이 없음을 확인
    • 부모 타입인 Object 클래스에서 toString()이 있음을 확인

 

 

2.3. Java에서 왜 Object 클래스가 최상위 부모 클래스인가?

공통 기능을 제공하는 목적 객체의 정보를 제공하고 객체가 다른 객체와 같은지 다른지 비교하고 객체가 어떤 클래스로 만들어졌는지 확인하는 기능은 모든 객체에서 필요한 공통 기능이기 때문에 Object라는 최상위 부모 클래스에서 이런 기능들을 미리 제공해주고, 모든 객체들은 공통 기능들을 편리하게 상속받을 수 있다.

  • Object가 제공하는 대표 메서드들
    • toString() : 객체의 정보 제공
    • equals() : 객체의 같음을 비교
    • getClass() : 객체의 클래스 정보를 제공

다형성의 기본 구현

  • 부모는 자식을 담을 수 있다. Object는 모든 클래스의 부모 클래스이다. → 따라서 모든 객체를 참조할 수 있다.
  • 모든 자바 객체는 Object 타입으로 처리될 수 있기 때문에 타입이 다른 각각의 객체들을 어딘가에 보관해야 한다면 Object 클래스에 보관할 수 있게 된다.

 

 


3. Object 다형성

Object는 모든 클래스의 부모 클래스이다.

 

 

 

 

  • 간단한 테스트를 위해 action() 스태틱 메서드를 생성한다.
  • action(Object obj) 메서드는 Object 타입의 매개변수를 사용하는데, Object는 모든 객체의 부모임 → 따라서 어떤 객체든지 인자로 전달할 수 있다.
  • 전달받은 obj 객체의 instance type이 Dog일 경우 Dog.dog.sound()를 호출한다.
    • obj.sound()를 호출하지 못한다. 왜냐면 Object 클래스에는 sound() 메서드가 없기 때문이다.
    • 따라서 다운캐스팅을 해줘야 한다. → if (obj instanceof Dog dog) { dog.sound() }

Object를 활용한 다형성

  • Object는 모든 객체를 대상으로 다형적 참조를 할 수 있다.
  • Object를 통해 전달 받은 객체를 호출하려면 각 객체에 맞은 다운캐스팅 과정이 필요하다.

 

 

 


5. toString()

Object.toString() 메서드 : 객체의 정보를 문자열 형태로 제공한다.

Object가 제공하는 toString() 메서드는 아래의 return 값을 반환한다.

 

 

 

5.1. toString() 메서드 오버라이딩

toString() 메서드의 정보만으로는 객체의 상태를 적절히 나타내지 못한다.

따라서 toString() 메서드를 재정의(오버리이딩)해서 보다 유용한 정보를 제공하는 것이 일반적이다.

 

 

 

 

 


 

6. Obejct, OCP

public class ObjectPrinter {
		public static void print(Object obj) {
			String string = "객체 정보 출력: " + obj.toString();
	    System.out.println(string);
	}
}

위와 같은 ObjectPrinter 클래스의 print() 메서드를 활용한다고 가정해보자.

ObjectPrinter 클래스틑 Car, Dog와 같은 구체적인 클래스를 사용하는 것이 아니라, 추상적인 Object 클래스를 사용한다.

→ ObjectPrinter 클래스가 Object 클래스에 의존한다고 표현함

→ 다형성을 매우 잘 활용하는 예시이며, 다형성을 잘 활용한다는 것은 다형적 참조와 메서드 오버라이딩을 적절하게 사용한다는 뜻이다.

 

6.1. ObjectPrinter의 print() 메서드와 전체 구조 분석

  • 다형적 참조 : print(Object obj) Object 타입을 매개변수로 사용하여 다형적 참조를 활용한다. 세상의 모든 객체 인스턴스를 인수로 받을 수 있다.
  • 메서드 오버라이딩 : Object는 모든 클래스의 부모 클래스이며, Car와 같은 구체적 클래스들은 Object의 toString() 메서드를 오버라이딩할 수 있다. 따라서 print(Object obj) 메서드는 Dog, Car와 같은 구체적인 타입에 의존하지 않고, 추상적인 Object 타입에 의존하면서 각 인스턴스의 toString()을 호출할 수 있게 된다.

 

 


 

7. equals()

Object는 equals() 메서드를 제공하여 동등성을 비교할 수 있도록 해준다.

  • 동일성(Identity) : == 연산자를 사용하여 두 객체의 참조가 동일한 객체인지를 확인 → 메모리 참조값이 같은지 확인
  • 동등성(Equality) : equals() 메서드를 사용하여 두 객체가 논리적으로 동등한지 확인 → 논리적으로 같은지 확인

동등성이란 개념은 클래스마다 다르다. 어떤 클래스는 주민등록번호를 기반으로 할 수도 있고, 어떤 클래스는 계좌번호를 기반으로 할 수도 있다. → 동등성 비교를 하고 싶으면 equals() 메서드를 재정의(오버라이딩)해야 한다.

 

 

 

 

반응형