CoDream

[JAVA]Object 클래스, 다형성 본문

JAVA/JAVA 이론

[JAVA]Object 클래스, 다형성

코잠 2024. 3. 4. 14:14
728x90
반응형

Object 클래스

자바의 모든 클래스의 최상위 부모 클래스입니다. 즉, 모든 클래스는 암묵적으로 Object 클래스를 상속받습니다. 따라서 Object 클래스의 멤버들은 모든 자바 클래스에서 사용할 수 있습니다.

Object 클래스는 자바의 모든 객체가 가지는 일반적인 메소드를 정의합니다. 몇 가지 주요 메소드는 다음과 같습니다:

  1. toString(): 객체의 문자열 표현을 반환합니다. 대개는 객체의 클래스 이름과 해시 코드를 포함하는 문자열을 반환합니다.
  2. equals(Object obj): 객체의 동등성을 확인하는 메소드입니다. 두 객체가 동일한지를 판단합니다.
  3. hashCode(): 객체의 해시 코드를 반환합니다. 해시 기반 컬렉션에서 객체의 키로 사용될 수 있습니다.
  4. getClass(): 객체의 클래스를 나타내는 Class 객체를 반환합니다.
  5. clone(): 객체의 복제본을 생성하여 반환합니다.
  6. finalize(): 객체가 소멸되기 전에 호출되는 메소드입니다.
  7. notify(), notifyAll(), wait(): 스레드 간의 통신을 위한 메소드들입니다.

Object 클래스의 메소드들은 필요에 따라 하위 클래스에서 오버라이딩할 수 있습니다. 예를 들어, toString() 메소드는 객체의 문자열 표현을 반환하기 위해 자식 클래스에서 재정의될 수 있습니다.

또한, 자바에서 많이 사용되는 데이터 구조인 배열 역시 Object 클래스를 상속받습니다. 그래서 모든 배열은 Object 클래스의 멤버들을 사용할 수 있습니다.

Object obj = new Object();
String str = obj.toString(); // toString() 메소드 사용 가능

이처럼 Object 클래스는 자바의 모든 클래스에서 기본적으로 사용되는 기능을 제공하여 객체 지향 프로그래밍의 기반을 형성합니다.


다형성(polymorphism)

객체 지향 프로그래밍에서 중요한 개념 중 하나입니다.

다형성은 여러 가지 형태를 가질 수 있는 능력을 의미합니다. 이는 자바에서 다음과 같은 세 가지 방식으로 구현됩니다.

 

  1. 메서드 다형성 (Method Polymorphism):
    • 자바에서는 메서드 오버로딩(Method Overloading)과 메서드 오버라이딩(Method Overriding)을 통해 메서드 다형성을 구현합니다.
    • 메서드 오버로딩은 같은 이름의 메서드가 매개변수의 개수 또는 타입에 따라 다르게 동작할 수 있도록 하는 것입니다.
    • 메서드 오버라이딩은 부모 클래스의 메서드를 자식 클래스에서 재정의하여 사용하는 것을 의미합니다.
  2. 업캐스팅 (Upcasting):
    • 업캐스팅은 상속 관계에서 부모 클래스 타입으로 자식 클래스의 객체를 참조할 수 있는 기능입니다.
    • 이를 통해 한 가지 타입으로 여러 가지 구현체를 다룰 수 있습니다.
  3. 인터페이스 다형성 (Interface Polymorphism):
    • 인터페이스는 여러 클래스가 동일한 동작을 제공할 수 있도록 해주는데, 이를 이용하여 인터페이스를 구현한 클래스들을 동일한 인터페이스 타입으로 다룰 수 있습니다.
    • 이를 통해 클라이언트 코드는 구현체의 구체적인 클래스를 알 필요 없이 인터페이스를 통해 다양한 구현을 사용할 수 있습니다.

다형성은 자바의 강력한 특성 중 하나로, 코드의 유연성을 높이고 재사용성을 향상시킵니다. 객체 지향 프로그래밍에서 중요한 개념 중 하나이며, 자바에서 다형성을 활용함으로써 코드를 더 유연하게 작성할 수 있습니다.

 


  1. 메서드 다형성:
class Animal {
    void sound() {
        System.out.println("동물 소리");
    }
}

class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("멍멍");
    }
}

class Cat extends Animal {
    @Override
    void sound() {
        System.out.println("야옹");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog(); // 업캐스팅
        Animal cat = new Cat(); // 업캐스팅

        dog.sound(); // 다형성으로 Dog 클래스의 sound() 메서드 호출
        cat.sound(); // 다형성으로 Cat 클래스의 sound() 메서드 호출
    }
}

  1. 인터페이스 다형성:
interface Animal {
    void sound();
}

class Dog implements Animal {
    @Override
    public void sound() {
        System.out.println("멍멍");
    }
}

class Cat implements Animal {
    @Override
    public void sound() {
        System.out.println("야옹");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog();
        Animal cat = new Cat();

        dog.sound(); // 다형성으로 Dog 클래스의 sound() 메서드 호출
        cat.sound(); // 다형성으로 Cat 클래스의 sound() 메서드 호출
    }
}

메서드 다형성과 인터페이스 다형성을 함께 사용하여 다양한 형태의 동물 객체를 동일한 방식으로 다룰 수 있습니다. 업캐스팅을 통해 각각의 동물 객체를 공통의 상위 클래스나 인터페이스 타입으로 다룰 수 있으며, 이를 통해 클라이언트 코드는 구체적인 구현체에 의존하지 않고도 다형성을 활용할 수 있습니다.

728x90
반응형