public class CalcSingleTon { /** 은닉된 형태로 자기 자신에 대한 객체를 static 멤버 변수로 선언 */ // --> static은 공유 자원이므로 이 클래스의 객체가 몇 개가 생성되더라도 단 하나만 존재하게 됨 private static CalcSingleTon current; private static int count = 0; /** 불필요한 객체 생성 없이 static 객체를 할당하기 위한 static 메서드 생성 */ public static CalcSingleTon getInstance(){ // 만약 공유자원으로 설정한 객체가 할당되지 않았다면? if(current == null){ current = new CalcSingleTon(); } System.out.printf("현재 CalcSingleTon 클래스의 객체수: %d\n", count); return current; } /** 외부에서 new 키워드를 통한 객체 생성을 금지하기 위해 생성자를 은닉 */ // 같은 클래스 안에서는 호출 가능하므로 이 소스 안에서 new를 사용하는 것은 허용됨 // --> 10 라인부터에 해당 내용 있음 private CalcSingleTon(){ super(); // 여기에 왜 super()를 가져온 것인가? count++; System.out.println("CalcSingleTon에 대한 current 객체가 생성됨"); } /*** 이하 이 클래스의 객체가 포함해야 할 일반 메서드 ***/ public int plus(int x, int y ){ return x+y; } public int minus(int x, int y ){ return x-y; } public int times(int x, int y ){ return x*y; } public int divide(int x, int y ){ return x/y; } }
(singleton.java 파일, Java 21단원 실습문제)
여기에서, super(); 이 부분은 왜 있는거지?
CalcSingleTon 클래스의 생성자에서 super();는 슈퍼클래스의 기본 생성자를 명시적으로 호출하는 것입니다. Java에서 클래스가 다른 클래스를 명시적으로 상속하지 않으면 암시적으로 Object 클래스를 상속합니다. Object는 Java의 모든 클래스의 루트 클래스입니다.
다음은 super();가 포함된 이유와 그 필요성에 대한 설명입니다:
- 암시적 슈퍼클래스 생성자 호출: Java에서는 서브클래스의 생성자에서 슈퍼클래스 생성자를 명시적으로 호출하지 않으면, 컴파일러가 자동으로 기본 생성자 super();를 첫 번째 문장으로 삽입합니다.
- 명시적 vs. 암시적 호출: 이 경우 super();를 명시적으로 포함하더라도 생성자의 동작에는 변화가 없습니다. 컴파일러가 어차피 이를 삽입하기 때문입니다. 이는 가독성을 높이거나 슈퍼클래스의 생성자가 호출됨을 명확히 하기 위해 포함되었을 수 있습니다. 특히 교육 목적으로나 특정 코딩 표준을 따르기 위해서일 수 있습니다.
- 이 상황에서의 필요성: CalcSingleTon 클래스는 다른 클래스를 명시적으로 상속하지 않으므로 암시적으로 Object 클래스를 상속합니다. Object 클래스에는 기본 생성자가 있으므로, super();를 포함하든 않든 결과는 동일합니다. 따라서 이 경우 super();를 명시적으로 호출할 필요는 없습니다.
- 포함된 이유 가능성:
- 코드 명확성: 프로그래머가 슈퍼클래스 생성자가 호출됨을 강조하기 위해 super();를 포함했을 수 있습니다.
- 일관성 유지: 코드가 다른 슈퍼클래스를 상속하는 클래스에서 가져왔다면, super(); 호출이 남아있을 수 있습니다.
- 교육적 목적: Java에서 생성자가 어떻게 작동하는지, 특히 상속과 관련하여 설명하기 위해 포함되었을 수 있습니다.
결론:
생성자에서의 super();는 슈퍼클래스의 생성자를 호출하는 데 사용됩니다. CalcSingleTon 클래스에서는 이를 명시적으로 포함하지 않아도 됩니다. 다른 생성자 호출(this() 또는 super())이 없을 경우 컴파일러가 자동으로 이를 삽입하기 때문입니다. 이 코드는 가독성이나 일관성을 위해 존재하는 것으로 보이며, 싱글톤 클래스의 기능에 영향을 주지 않으므로 안전하게 생략할 수 있습니다.
super(); 없이 재작성된 생성자:
private CalcSingleTon(){
count++;
System.out.println("CalcSingleTon에 대한 current 객체가 생성됨");
}
이 버전은 컴파일러가 자동으로 super(); 호출을 삽입하므로 원본과 동일하게 동작합니다.
'언어 및 도구들 공부 > Java' 카테고리의 다른 글
package, import 순서 (0) | 2024.09.25 |
---|---|
super()있어야 하나? 2 (1) | 2024.09.24 |
toString 에서의 출력값(해시코드) (0) | 2024.09.24 |
멤버변수로 객체를 갖는 클래스 (0) | 2024.09.24 |
Java 에서의 this()호출 (0) | 2024.09.23 |