[Java_tips] 일반 클래스/static클래스/non-static클래스(inner class), 오버라이딩 할 때 접근성 고려
1. 일반 클래스 / static클래스 / non-static클래스(inner class) 차이점
자바에서 static class와 일반 class의 차이점을 이해하는 것은 클래스의 사용법과 접근성에 중요한 영향을 줍니다. 자바에서의 static 클래스는 주로 중첩 클래스(다른 클래스 내부에 위치한 클래스)에 사용되는 개념입니다. 자바에서 최상위 레벨의 클래스는 static으로 선언될 수 없으며, static 키워드는 중첩 클래스에만 적용됩니다.
일반 클래스 (Non-static class)
- 일반 클래스는 자바의 가장 기본적인 구성 요소로, 이를 통해 객체를 생성할 수 있습니다.
- 이러한 클래스의 인스턴스를 생성하기 위해서는 new 키워드를 사용해야 합니다.
- 인스턴스 멤버(필드, 메소드 등)는 객체가 생성될 때마다 각 인스턴스마다 별도로 존재합니다.
Static Nested Class
- static 중첩 클래스는 다른 클래스 내부에 선언되며, static 키워드를 사용하여 정의됩니다.
- 이 클래스는 외부 클래스의 인스턴스 없이도 생성할 수 있습니다. 즉, 외부 클래스의 인스턴스에 독립적입니다.
- static 중첩 클래스는 외부 클래스의 static 멤버에만 접근할 수 있으며, 외부 클래스의 인스턴스 멤버에는 직접 접근할 수 없습니다.
Non-static Nested Class (Inner Class)
- 비정적 중첩 클래스, 또는 내부 클래스라고도 하는 이 클래스는 다른 클래스 내부에 위치하지만 static으로 선언되지 않습니다.
- 내부 클래스의 인스턴스는 항상 외부 클래스의 인스턴스에 암묵적으로 연결되어 있습니다. 이로 인해 내부 클래스는 외부 클래스의 모든 멤버(심지어 private 멤버까지도)에 접근할 수 있습니다.
- 내부 클래스의 인스턴스는 외부 클래스의 인스턴스를 통해서만 생성될 수 있으며, 외부 클래스의 인스턴스와 밀접한 관계를 가집니다.
요약
- 일반 클래스: 독립적으로 인스턴스화 할 수 있는 클래스.
- Static Nested Class: 다른 클래스 내부에 선언되지만, 외부 클래스의 인스턴스와 독립적으로 존재할 수 있는 클래스. 외부 클래스의 static 멤버에만 접근 가능.
- Non-static Nested Class (Inner Class): 외부 클래스의 인스턴스에 종속적인 중첩 클래스. 외부 클래스의 모든 멤버에 접근할 수 있음.
이러한 차이점은 자바에서 클래스의 사용법과 객체 지향 설계를 이해하는 데 중요한 역할을 합니다.
>>클래스를 배우면 배울수록 심오한 부분에 대해서 알게 되는 것 같다.
2. String toString() 메서드를 클래스 내부에 선언했더니 오류가 나왔던 건에 대해서
java에서 toString() 메서드는 Object 클래스의 한 메서드입니다. Java의 모든 클래스는 Object 클래스로부터 상속받기 때문에, Object 클래스에 정의된 메서드는 모든 Java 객체에서 사용할 수 있습니다. toString() 메서드는 객체의 문자열 표현을 반환하는 데 사용됩니다. 기본적으로, 이 메서드는 객체의 클래스 이름과 해시코드의 조합을 문자열 형태로 반환하지만, 대부분의 경우 이 기본 구현은 유용하지 않습니다.
따라서, 클래스의 인스턴스에 대한 유용한 문자열 표현을 제공하고자 할 때는 toString() 메서드를 오버라이드(재정의)해야 합니다. 이때, 오버라이드하는 메서드는 원래 Object 클래스에서 선언된 메서드와 같은 시그니처를 가져야 하며, 이는 메서드의 반환 타입, 이름, 매개변수 리스트가 정확히 일치해야 함을 의미합니다. Object 클래스에서 toString() 메서드는 다음과 같이 선언되어 있습니다:
이 메서드를 오버라이드할 때는 다음과 같은 이유로 public 키워드를 사용해야 합니다:
- 접근성: Object 클래스에서 toString() 메서드는 public으로 선언되어 있으므로, 이 메서드를 오버라이드할 때도 최소한 같은 수준의 접근성을 유지해야 합니다. Java에서 오버라이드하는 메서드는 원본 메서드보다 더 제한적인 접근 지정자를 가질 수 없습니다. public은 가장 넓은 접근 수준을 제공하므로, 이를 유지하는 것이 필수적입니다.
- 일관성과 사용 용이성: toString() 메서드는 Java에서 객체를 문자열로 표현하고자 할 때 자주 사용됩니다. 이 메서드를 public으로 유지함으로써, 어떤 객체든지 그것의 문자열 표현을 쉽게 얻을 수 있습니다. 예를 들어, System.out.println() 메서드에 객체를 전달하면 자동으로 해당 객체의 toString() 메서드가 호출되어 문자열 표현이 출력됩니다.
요약
자바의 모든 클래스는 Object 클래스로부터 상속받기 때문에 Object클래스 내부의 메서드와 같은 이름의 메서드를 선언하려면 오버라이딩을 해야된다. 오버라이딩을 하려면 최소한 같은 수준의 접근성을 유지해야되므로 public으로 선언해준다. 그리고 윗줄에 @Override 어노테이션을 작성해서 컴파일러가 헷갈리지 않도록 해준다.