Menu
Coddy logo textTech

Object 클래스

Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 87개 중 24번째.

Java에서 여러분이 생성하는 모든 클래스는 Object라고 불리는 특별한 클래스로부터 자동으로 상속받습니다. 어디에도 extends를 작성하지 않더라도, 여러분의 클래스는 여전히 Object의 자식 클래스입니다. 이로 인해 Object는 전체 클래스 계층 구조의 루트가 됩니다.

public class Person {
    // 이것은 암시적으로 Object를 확장합니다
}

// 다음과 동일합니다:
public class Person extends Object {
}

모든 클래스는 Object에서 상속받기 때문에, Java의 모든 객체는 여러 내장 메서드에 접근할 수 있습니다. 가장 일반적으로 사용되는 메서드는 다음과 같습니다:

메서드용도
toString()객체의 문자열 표현을 반환합니다
equals(Object obj)두 객체가 같은지 비교합니다
hashCode()객체의 해시 코드 값을 반환합니다
getClass()객체의 런타임 클래스를 반환합니다

기본적으로, 이러한 메서드들은 일반적인 구현을 가집니다. 예를 들어, toString()은 클래스 이름 뒤에 객체의 메모리 주소를 반환하는데, 이는 그리 유용하지 않습니다:

Person p = new Person();
System.out.println(p.toString());  // 출력: Person@1a2b3c4d

이것이 의미 있는 동작을 제공하기 위해 여러분의 클래스에서 이러한 메서드들을 자주 오버라이드하는 이유입니다. Object가 최상위 부모라는 점을 이해하면, 왜 모든 객체를 Object 변수에 저장할 수 있는지, 그리고 왜 여러분이 만드는 모든 객체에서 특정 메서드들을 사용할 수 있는지 설명하는 데 도움이 됩니다.

challenge icon

챌린지

쉬움

Object 클래스가 어떻게 모든 Java 클래스의 보편적인 부모 역할을 하는지, Object로부터 상속받은 메서드들을 보여주는 간단한 가젯 인벤토리 시스템을 구축하며 살펴봅시다.

코드를 구성하기 위해 세 개의 파일을 생성하게 됩니다:

  • Gadget.java: 전자 가젯을 나타내는 클래스를 생성합니다. 클래스에는 다음이 포함되어야 합니다:
    • name (String)과 year (int)를 위한 private 필드
    • 두 필드를 초기화하는 생성자
    • Getter 메서드인 getName()getYear()
    Object의 어떤 메서드도 오버라이드하지 마세요. 먼저 기본 동작을 확인하고자 합니다.
  • Smartphone.java: Gadget을 상속받고 스마트폰 전용 기능을 추가하는 서브클래스를 생성합니다:
    • brand (String)를 위한 private 필드
    • name, year, brand를 매개변수로 받는 생성자 - 부모 부분을 위해 super(name, year)를 사용하세요
    • 브랜드를 반환하는 getBrand() 메서드
    • toString() 메서드를 오버라이드하여 다음을 반환하도록 합니다: Smartphone: [brand] [name] ([year])
  • Main.java: 기본 Object 메서드와 오버라이드된 메서드 간의 차이점을 보여줍니다. 가젯 이름, 연도, 브랜드라는 세 가지 입력을 받게 됩니다. 동일한 이름과 연도(스마트폰의 경우 브랜드 추가)를 사용하여 GadgetSmartphone을 모두 생성한 후 다음을 수행하세요:
    • getClass().getSimpleName()을 사용하여 가젯의 클래스 이름을 출력합니다.
    • 가젯의 기본 toString()에 "@" 기호가 포함되어 있는지 여부를 출력합니다 (true 또는 false 출력).
    • 오버라이드된 toString()을 사용하여 스마트폰 정보를 출력합니다.

가젯/스마트폰 이름 (String), 연도 (int), 브랜드 (String)의 세 가지 입력을 받게 됩니다.

이 챌린지는 Object 메서드를 오버라이드하는 것이 왜 중요한지 보여줍니다. 기본 toString()Gadget@1a2b3c와 같은 결과를 제공하는 반면, 커스텀 버전은 의미 있는 정보를 제공합니다!

치트 시트

Java에서 모든 클래스는 자동으로 Object 클래스를 상속받으며, 이는 전체 클래스 계층 구조의 루트가 됩니다.

public class Person {
    // 이것은 암시적으로 Object를 확장합니다
}

// 다음과 동일합니다:
public class Person extends Object {
}

Java의 모든 객체는 Object로부터 상속받은 여러 내장 메서드에 접근할 수 있습니다.

메서드용도
toString()객체의 문자열 표현을 반환합니다
equals(Object obj)두 객체가 같은지 비교합니다
hashCode()객체의 해시 코드 값을 반환합니다
getClass()객체의 런타임 클래스를 반환합니다

기본적으로 toString()은 클래스 이름 뒤에 객체의 메모리 주소가 붙은 형태를 반환합니다.

Person p = new Person();
System.out.println(p.toString());  // 출력: Person@1a2b3c4d

의미 있는 동작을 제공하기 위해 자신의 클래스에서 이러한 메서드들을 오버라이드할 수 있습니다. 모든 클래스는 Object를 상속받으므로 모든 객체를 Object 변수에 저장할 수 있습니다.

직접 해보기

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 입력 읽기
        String name = scanner.nextLine();
        int year = scanner.nextInt();
        scanner.nextLine(); // 줄바꿈 문자 소비
        String brand = scanner.nextLine();
        
        // TODO: name과 year를 사용하여 Gadget 객체 생성
        
        // TODO: name, year, brand를 사용하여 Smartphone 객체 생성
        
        // TODO: getClass().getSimpleName()을 사용하여 gadget의 클래스 이름 출력
        
        // TODO: gadget의 toString()에 "@"가 포함되어 있는지 여부 출력 (true 또는 false)
        
        // TODO: smartphone 출력 (오버라이드된 toString() 사용)
        
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨