언어 및 도구들 공부/Java

클래스와 중첩 클래스 02(+toString)

Dr.Mlem 2024. 12. 17. 20:35
Q1.
클래스 안에 있는 클래스를 중복 클래스라고 하는거야?
 
 
 
A1.

ChatGPT의 말:

 

아닙니다! 클래스 안에 선언된 클래스를 **중첩 클래스(Nested Class)**라고 부릅니다. "중복 클래스"라는 용어는 Java에서 공식적으로 사용되지 않습니다.


중첩 클래스(Nested Class)란?

클래스 내부에 다른 클래스를 선언하는 것을 의미하며, Java에서는 중첩 클래스의 종류를 두 가지로 구분합니다.

  1. 정적 중첩 클래스 (Static Nested Class)
  2. 비정적 중첩 클래스 (Inner Class)

중첩 클래스의 종류와 특징

1. 정적 중첩 클래스 (Static Nested Class)

  • 정의: static 키워드로 선언된 클래스입니다.
  • 특징:
    • 외부 클래스의 객체 생성 없이도 접근할 수 있습니다.
    • 외부 클래스의 static 멤버만 접근할 수 있습니다.
    • 정적 중첩 클래스는 독립적이며 외부 클래스의 인스턴스와 무관합니다.
  • 예시 코드:
public class OuterClass {
    static class StaticNestedClass {
        void display() {
            System.out.println("나는 정적 중첩 클래스입니다.");
        }
    }
}

public class Main {
    public static void main(String[] args) {
        OuterClass.StaticNestedClass nested = new OuterClass.StaticNestedClass();
        nested.display();
    }
}

2. 비정적 중첩 클래스 (Inner Class)

  • 정의: static 키워드 없이 선언된 클래스입니다.
  • 특징:
    • 외부 클래스의 객체를 통해서만 생성할 수 있습니다.
    • 외부 클래스의 모든 멤버 (static, non-static)에 접근할 수 있습니다.
  • 예시 코드:
public class OuterClass {
    class InnerClass {
        void display() {
            System.out.println("나는 비정적 중첩 클래스입니다.");
        }
    }
}

public class Main {
    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        OuterClass.InnerClass inner = outer.new InnerClass();
        inner.display();
    }
}

중첩 클래스의 장점

  1. 코드의 논리적 그룹화
    관련된 클래스들을 하나의 파일이나 클래스 내부에 정의해 코드의 논리적 구조를 명확히 합니다.
  2. 캡슐화
    외부 클래스와의 밀접한 관계를 나타내며, 외부에서 직접 접근하기 어렵게 만들 수 있습니다.
  3. 가독성 향상
    클래스의 역할이 명확해지고 클래스 간의 관계를 더 잘 이해할 수 있습니다.

중첩 클래스의 용어 정리

  • 중첩 클래스(Nested Class) = 클래스 안에 선언된 클래스
  • 정적 중첩 클래스 (Static Nested Class) = static 키워드가 붙은 중첩 클래스
  • 비정적 중첩 클래스 (Inner Class) = static 키워드가 붙지 않은 중첩 클래스

따라서 "중복 클래스"라는 용어는 Java에서는 사용하지 않고, 클래스 내부에 선언된 클래스를 **"중첩 클래스"**라고 합니다. 😊

추가적으로 궁금한 부분이나 예제가 필요하시면 언제든지 질문해주세요!

 
 
 
Q2.

나의 말:

품고 있는 중첩클래스의 객체를 멤버변수로 가지고 있는 클래스의 객체에서 toString 메소드를 호출했을때, 중첩클래스에 대한 객체에서도 toString 메소드를 호출하는 것이 Java의 원칙인가?\

 

 

 

A2.

ChatGPT의 말:

 

네, 맞습니다. Java의 toString 메소드 호출 원칙에 따라 객체의 toString 메소드는 자동으로 호출되며 그 과정에서 멤버 변수로 다른 객체를 포함하고 있다면 그 객체의 toString 메소드도 호출됩니다.

이것은 Java의 객체지향 설계 원칙과 관련이 있습니다. 구체적인 동작은 다음과 같습니다.


원칙 설명

  1. toString 메소드의 기본 동작
    • Object 클래스에 정의된 toString 메소드는 객체의 메모리 참조값을 반환합니다.
      만약 toString 메소드를 재정의(Override)하면 객체의 내용을 원하는 형식으로 출력할 수 있습니다.
  2. 멤버 변수에 객체가 있을 때 toString 호출
    • 클래스의 멤버 변수 중 다른 객체가 있을 경우, 해당 객체에 대해 자동으로 toString 메소드를 호출합니다.
    • 이때 멤버 객체에 toString이 재정의되어 있다면, 재정의된 내용이 출력됩니다.
    • 만약 멤버 객체에 toString이 재정의되어 있지 않으면, Object의 toString 메소드가 호출되어 참조값을 출력합니다.

중첩 클래스(Nested Class)와의 관계

중첩 클래스(Inner Class 또는 Static Nested Class)도 하나의 객체이므로, 객체를 멤버 변수로 포함하는 경우 그 객체의 toString 메소드를 호출합니다.

예시 코드

다음과 같은 예제를 보겠습니다:

public class Outer {
    private Inner inner;

    public Outer(String message) {
        this.inner = new Inner(message);
    }

    @Override
    public String toString() {
        return "Outer{" +
                "inner=" + inner + // 중첩 클래스의 toString 호출
                '}';
    }

    class Inner {
        private String message;

        public Inner(String message) {
            this.message = message;
        }

        @Override
        public String toString() {
            return "Inner{" +
                    "message='" + message + '\'' +
                    '}';
        }
    }

    public static void main(String[] args) {
        Outer outer = new Outer("Hello, Java!");
        System.out.println(outer.toString());
    }
}

출력 결과

Outer{inner=Inner{message='Hello, Java!'}}

동작 원리

  1. Outer 클래스의 toString 메소드를 호출합니다.
  2. Outer 클래스 내부의 멤버 변수 inner는 중첩 클래스인 Inner 클래스의 객체입니다.
  3. 이때, inner 객체의 toString 메소드가 자동으로 호출됩니다.
  4. Inner 클래스에서 toString이 재정의되어 있으므로 재정의된 내용이 출력됩니다.

결론

Java에서 toString 메소드를 호출할 때, 클래스가 다른 객체를 멤버 변수로 가지고 있다면 해당 멤버 객체의 toString 메소드가 자동으로 호출되는 것이 원칙입니다.
중첩 클래스(Inner Class, Static Nested Class)도 하나의 객체로 취급되므로 동일한 규칙이 적용됩니다.

이 규칙은 Java의 객체지향 설계 철학에 따라, 객체가 다른 객체를 포함하는 경우 그 내용을 쉽게 표현할 수 있도록 하기 위해 존재합니다. 😊

 

'언어 및 도구들 공부 > Java' 카테고리의 다른 글

JDBC  (0) 2024.12.23
MyBatis config.xml의 위치  (0) 2024.12.18
클래스와 중첩 클래스 01(+Gson +삽질)  (1) 2024.12.17
@SerializedName 어노테이션과 Gson  (0) 2024.12.16
Retrofit 라이브러리 사용 규격?  (0) 2024.12.16