항상 JAVA 프로그램을 보면서, 또 실행하면서 짜증난 것이 바로 이 Package가 아닐까 싶다.
학부 시절, Web Service Application을 분석하는데 계속 class 파일을 못 찾는다면서 에러가 나는 게 아닌가.
폴더 뒤져보면 분명히 파일이 있는데, 실행하면 없단다.
아 놔 이런 조카 크레파스 십팔색 같으니!!!! 라고 머리를 쥐어뜯었지만 결국 탈모만 가속화 ㅋㅋㅋㅋ
지금 생각하면 정말 어처구니 없는 짓이기도 하고, 역시나 기초라는 것의 중요성을 다시금 깨닫게 한달까?
우선 Namespace는 의미적으로 관련이 있는 클래스를 모아서 그룹화 한 것이다.
'.' 로 구별해서 구조적, 단계적으로 기술하게 되며, Namespace를 사용하기 위해서는 import 라는 예약어가 필요!!
무슨말인고 하니, 다음 그림을 보자.
이 그림을 보면 자바에서 많이 쓰이는 String과 Graphics Class, Bean이라고 해야할까??
여튼 이 녀석이, Java라는 namespace 안에 lang과 awt라는 namesapce가 있고, 그 안에 존재를 하는거다.
그래서 오른쪽과 같이 java.lang.*; 라고 적어주면, java 안의 lang 에 있는 모든 Beans 를 쓰겠습니다!!
라고 선언해주는 것이다.
이 경우, java.lang.String 에 있는 객체를 사용할 수 있게 되었으므로, 새로운 String 객체 s를 만들 수 있다.
또한, awt 의 Graphics 를 사용할 수 있게 되어서, Graphics g 라는 파라메터도 받을 수 있는 것이라는!!
지금까지 습관적으로, 그리고 아무런 생각 없이 import java.util.*; 라던가 적었는데, 반성하자. (퍼벅)
자, 이 namespace를 실제적으로 실현하기 위한 개념이 바로 package 개념이다.
관계된 여러 class와 파일들을 정해진 위치에 지정해서 찾기도 쉽고 참조나 사용할 때도 간단하게 해보자!!
쉽게, 비스므레하고 관련이 있는 녀석들은 하나의 폴더로 몽창 몰아넣어버리자!! 라는 것이다.
이 그림을 보면 App1.java와 App2.java를 mypack이라는 package로 만들어 버렸다.
java 코드의 맨 상단에 속해있는 package의 이름을 적어주면 된다.
그리고 이 패키지 이외의 다른 패키지, 즉 외부에서 접근하기 위해서는 mypack.app1 로 접근하게 된다.
왜 이 짓을 하나??
우선 관리가 편하다는 것.
같은 기능 혹은 관련된 클래스를 하나로 묶어서 관리하는 것이 편하고, 컴파일 할 때도 한 번에 할 수 있다는 장점.
또 한 가지는, 바로 정보은닉을 위해서다.
public, default(protected), private 를 사용해서 패키지 간의 각 클래스나 변수, 메소드의 접근을 제어할 수 있다.
클래스 사이에서는 public 인 경우 프로젝트 내의 모든 패키지의 클래스에서 참조가 가능하다.
기본적으로 아무런 접근예약어를 써 주지 않으면 protected가 되어 같은 패키지 내부에서만 참조가 가능하다.
클래스에서는 private는 통상적으로 잘 사용하지 않는다.
변수와 메소드에 관해서는 public인 경우 프로젝트 내의 모든 패키지와 클래스에서 참조가 가능하다.
아무런 접근예약어를 써 주지 않으면 protected가 되어 같은 패키지 내부에서만 참조가 가능하다.
변수나 메소드를 private로 작성하게 되면, 속해있는 패키지의 해당 클래스에서만 참조가 가능하다.
마지막으로 배포할 때의 편리함이다.
개발된 컴퓨터와 실행이 되는 컴퓨터는 여러가지 환경이 다르지만, 디렉토리 구조 역시 다를 수 밖에 없다.
이 경우에 필요한 것이 바로 배포파일, JAR이라던가 WAR 같은 파일이다.
이 때, 패키지를 사용해서 프로젝트를 구현한 후, JAR 파일로 배포를 하게 되면, 개발된 컴퓨터와 같은 환경의
프로젝트 구조와 패키지 구조를 실행되는 컴퓨터에도 똑같이 적용시킬 수 있게 되는 것이다.
마지막으로 고백하자면, 학부시절의 실수는 바로 package와 이 jar 파일의 관계를 제대로 이해 못 했음에 있다.
웹 프로젝트의 경우, 톰켓같은 웹 컨테이너의 webapps 폴더에 jar 혹은 war 파일로 배포가 되어 구동된다.
즉, 아무리 프로젝트 폴더에서 class 파일을 옮기고 package 이름을 바꾸고 쌩난리를 쳐 봐도..
기존에 제작된 jar 파일을 새로 만들어서 배포해주지 않으면 적용이 되지 않는다는 것이다.
테스트를 한답시고 jar 파일을 분해한 것 까지는 좋았지만, 뭔가 변경을 시켰으면 새로 jar 파일을 작성해준 후,
배포를 하지 않으면 아무 소용이 없다는 것!!!
뭐, 지금이라도 알았다니 다행이라면 다행이랄까..^^ㅋ
댓글
댓글 쓰기