본문 바로가기
java

독립성과 은닉성(클래스와 모듈)

by jasNote 2024. 11. 3.

 

우리는 과거 객체지향에 대해 공부한적이 있고 독립성과 은닉성을 배웠었다.

클래스에서 독립성과 은닉성은 어떤 것을 의미했을까?

 

java, spring을 예시로 사용하겠다

 

클래스의 독립성과 은닉성

독립성이란 무엇일까?

클래스는 독립적일 수 없다. 서로 상호작용하며 작동한다. 그런 의미에서 클래스의 독립성은 무엇을 의미할까. 독립성을 갖는다는 것은 “타 클래스 사용을 하지 않아도 되는지 고민해보기”, “의존성 관리 하기” 이라고 정의하고 싶다.

 

첫째로 타 클래스 사용을 하지 않아도 되는지 고민해보기이다. 클래스는 타 클래스를 사용 할 수 있다. 하지만 거대한 프로그램 코드를 작성하다 보면 여러 클래스들이 서로를 복잡하게 사용하기 시작한다. 그렇기 때문에 꼭 타 클래스를 사용해야 하는지 고민해보는 것이다. 그것이 시작이다. 이 고민을 하게 되면 관계가 있는 클래스끼리 뭉쳐진다.

 

MyStringUtil 클래스를 생성했다. 다른 모듈을 사용하지 않고 순수한 java로 기능을 구현하고 있다. 이것은 독립성을 최대로 지키고 있는 상태로 볼 수 있다. 하지만 많은 요구사항들을 대응하기 힘들어졌다. 이를 대응하기 위해 MyStringUtil 클래스에서org.springframework.util.StringUtils을 사용하기로 했다. 그럼 MyStringUtil 클래스는 독립적이지 않은 것일까?

 

그렇지않다. 독립성은 상대적인 것이다. 스스로 문제를 해결할 수 있는 클래스는 거의 없지 않을까 싶다. 이때 두번째로 의존성 관리하기 개념을 생각하게 된다. java에서는 타 클래스를 사용하게 되면 상단에 import 예약어가 붙고 사용 클래스가 있는 패키지 + 클래스명이 선언된다. 외부기능을 사용하고 있음을 명시한 것이다.

 

은닉성이란 무엇일까?

사용자는 내부 구현에 관심이 없다. “어떻게 사용하면 될까”에만 관심이 있다. 그러므로 인터페이스를 제공하거나 접근제한자를 활용해서 함수명만 노출 시켜주면 된다. 사용자는 MyStringUtil이 org.springframework.util.StringUtils을 사용하던 다른 라이브러리를 사용하던 관심 없다.

 

 

모듈의 독립성과 은닉성

모듈로 돌아가보자. 모듈은 프로그램 구성요소와 라이브러리 사이의 무언가이다. 클래스보다는 훨씬 큰 개념이다. 하지만 위에서 설명한 내용 중 “클래스”를 ”모듈”로 대체하여 다시 읽어보자.

  • 모듈은 독립성은닉성을 갖는다.
  • 모듈은 타 모듈을 사용하지 않아도 되는지 고민해본다. (관련있는 기능만 모아두기)
  • 모듈이 타 모듈을 사용하게 되면 어떤 모듈을 사용하는지 명시해야 한다. (의존성 관리)
  • 모듈을 사용하는 사용자는 내부구현에 관심이 없다. “어떻게 사용하면 될까”에만 관심이 있다. (인터페이스만 노출)
 

아래는 build.gradle script이다.

  • 독립성
    • domain 모듈은 비즈니스와 관련된 기능을 모아둔 모듈이다. server와 관련된 기술적인 기능을 포함하지 않는다. 타 모듈을 사용하지 않고 필요한 도메인 기능만 모아둘 수 있도록 고민한 것이다.
    • domain 모듈은 util 모듈을 사용하고 있다. 그러므로 implementation project(':util') 사용하고 있음을 명시해 두었다.
  • 은닉성
    • implementation로 모듈을 선언하면 해당 모듈을 사용할 수 있다. 하지만 선언된 모듈의 하위 모듈은 사용할 수 없다. 필요한 기능만 노출 시키는 것이다.
[server 모듈]
dependencies {
    implementation project(':domain')
}
[domain 모듈]
dependencies {
    implementation project(':util')
}
[util 모듈]
dependencies {
    implementation 스프링 유틸
}

 

 

객체지향 프로그래밍에서 독립성과 은닉성은 코드의 유지보수성과 확장성을 높이는 핵심 요소이다. 각 클래스와 모듈이 잘 설계되어 서로의 의존성을 최소화할수록, 프로그램의 안정성과 효율성이 증가한다. 이를 통해 개발자는 변화하는 요구사항에 유연하게 대응할 수 있다.

 

'java' 카테고리의 다른 글

Self Invocation 이슈와 해결 방법  (2) 2024.04.08