Frudy
7k
2019-05-22 10:18:37 작성 2019-05-22 11:26:42 수정됨
3
168

Java Modifier Access에 대해 고민이 있습니다.


저는, 물건을 종류별로 분류해두는걸 좋아합니다.

프로그래밍도 마찬가지입니다.


비슷한 용도의 클래스를 하나의 패키지로 묶기를 원하죠.

그런데 Java에서 디테일하게 Modifier Access를 컨트롤할수없는 듯한 느낌이 듭니다.


패키지 구성은 다음과 같습니다.


제 의도

1. FdbmsTestUtil클래스를, testcode 패키지 하위에서만 사용했으면 좋겠습니다.

(1) testcode패키지 안에있는 클래스들,

(2) fdbms.testcode패키지 안에있는 패키지인 example패키지,

(3) (이하동일) exception패키지,

(4) performance패키지

딱 여기서만 사용하고싶습니다.


방법1. FdbmsTestUtil를 public으로 사용 (현 방법)

장점 : testcode 하위 모든 패키지들(example~ performance)에서 사용가능

단점 : 저 fdbms프로젝트를 jar로 만들어서 이용하는 사용자클래스에서 접근가능. (public이니까요)


방법2.

example패키지, performance패키지, exception패키지를 없애고 

그 안에 있는 모든 클래스를 모두 testcode패키지에 넣은 다음,

FdbmsTestUtil클래스를 default로 선언합니다.


장점 : 제 의도를 완벽하게 구현할 수 있습니다. 사용자클래스에서 FdbmsTestUtil를 접근할수없습니다.

단점 : 하나의 패키지안에 굉장히많은 클래스들이 들어갑니다.


간략한 설명)

fdbms = jdbc드라이버 (제가만듬)

fdbms.testcode = 테스트코드 모여있는 패키지

fdbms.testcode.example = jdbc드라이버 사용법

fdbms.testcode.exception = 특정 상황에서 예외를 제대로 발생하는지 테스트하는 코드

fdbms.testcode.performance = 제가만든 jdbc드라이버의 성능을 테스트하는 코드


이렇게 다 용도가 다른대,

하나의 testcode패키지 아래에 다 떄려박으면 좀 그렇지...않나요?

심지어.. fdbms.testcode.example 아래에 또 다른 패키지들이 또 있단말이에요...

이걸 다때려박으면...음...,,,


좋은방법이 없을까요?


default modifier access가...

딱 해당 패키지에 있는 클래스에서만 접근가능한 속성인게 불편해요.

해당패키지와 해당패키지의 하위패키지 에서도 접근이 가능했으면 얼마나좋을까요...

0
  • 답변 3

  • satis
    2019-05-22 11:14:32

    자바는 언어적 관점에서 서브팩키지의 개념이 없습니다. 파일 관점에서는 하위 디렉토리에 존재하여 서브팩키지 처럼 보이나, 자바 언어에서는 다른 디렉토리에 존재하는 코드는 완전 별개의 팩키지 입니다.

  • satis
    2019-05-22 11:15:52

    구글 검색어

    java no concept of a subpackage


  • satis
    2019-05-22 11:49:11

    타 언어보다 자바가 캡슐화 지원이 부족하여 java9에서 모듈이라는 기능을 추가했습니다

    https://greatkim91.tistory.com/m/197

    java 9 모듈 프로그래밍 검색해보세요.


    딱히 정답이다라고는 설명 못드리겠고, 캡슐화 고민은 오픈소스를 참고 많이 합니다.


    저같은 경우는 그냥 패키지를 여러개 나누고 class modifire는 public으로 둡니다.

    field protected modifire로 상속받은 클래스만 사용하도록 제한하거나 생성자를 없애고 해당 클래스의 인스턴스는 내부 팩키지의 factory클래서만 생성하게 제한하여 의도하지 않은 방법으로 사용하는 것을 방지합니다.

    인터페이스화 시키고 디자인패턴으로 처리해요.

    생성시 옵셔널하게 값을 받아야 하는 클래스는 Builder 패턴 chain methodcall 방식으로 parameter를 받아 인스턴스를 리턴하기도 합니다. 또는 final 필드로 무조건 생성할때 필수로 하죠. 생성자에서 Objects.requireNonNull()을 활용하여 널체크를 합니다.



  • 로그인을 하시면 답변을 등록할 수 있습니다.