작성
·
333
·
수정됨
2
11강 코틀린에서 접근 제어를 다루는 방법을 듣던 중 궁금한 점이 생겨 질문 남깁니다 :)
[3.다양한 구성요소의 접근 제어 - 생성자] 부분에서 Java의 유틸성 코드를 만들 때 abstract class + private constructor를 사용해 인스턴스화를 막는다고 되어있습니다!
public abstract class StringUtils {
private StringUtils() {}
public boolean isDirectoryPath(String path) {
return path.endsWith("/");
}
}
추상클래스는 인스턴스화를 할 수 없다고 알고 있는데, 이미 인스턴스화가 막혀있는 상태에서 private constructor 가 필요한가?! 라는 궁금증이 들었습니다.
질문은 정리하자면, abstract class 만으로 인스턴스화를 막을 수 있다고 생각하는데, private constructor까지 같이 사용하는 이유가 궁금합니다 !!
강의 잘 듣고 있습니다. 재밌어요 ㅎㅎ
감사합니다 :)
답변 1
0
안녕하세요, Cooooding님!!! 아이고~~ 정말 좋은 질문 감사드립니다!! 😊
말씀해 주신것처럼, abstract class 의 경우 그 자체로는 인스턴스화 할 수 없습니다!
하지만, 이런 경우가 있을 수 있어요!! 진작 존재하는 abstract class를 누군가가 상속받는 경우죠!!
그렇게 되면 그 abstract class를 상속 받은 하위 클래스르를 인스턴스화 함으로써 abstract class가 인스턴스된 것과 비슷한 효과가 나타나게 됩니다!
public abstract class Base {
public void utilFunction() {
// ...
}
}
public class Derived extends Base {
}
즉, 위와 같은 코드에서
Base b = new Derived();
b.utilFunction()
와 같이 Derived
를 인스턴스화 하고 Derived
의 상위 클래스인 Base
추상 클래스의 메소드를 사용하는 것이죠!
이를 완전히 막기 위해서는 Base
에 private constructor를 추가하면 됩니다!
하위 클래스의 생성자를 호출하게 되면, 상위 클래스의 생성자도 호출해야 하는데, 상위 클래스의 생성자가 private이라 호출 자체가 불가능하게 되는 것이죠!
그래서 Java에서, abstract class의 인스턴스화를 보다 완전하게 막기 위해서는 private constructor를 추가하는 편입니다!
이 답변이 도움이 되었다면 좋겠네요~!!
감사합니다!!! 오늘도 행복한 하루 되세요!! 🙇🙇