지난 글에서 클래스 패스를 다뤘는데 클래스 패스란 컴퓨터의 저장장치 어딘가에 존재하는 클래스 파일을 사용하기 위한 방법이다.
오늘 정리할 패키지(Package)는 하나의 클래스 안에서 같은 이름의 클래스들을 사용하기 위한 방법이라고 할 수 있다.
클래스 패스와 패키지를 통해 클래스들 간의 관계를 설정하는 매니지먼트 도구로서 로직을 관리하는 큰 틀의 체계로 이해하면 좋을 것 같다.
정보 공학에서는 '이름의 충돌'이라는 문제를 해결하기 위해서 다양한 노력을 하고 있다.
전역변수와 지역변수, 객체도 그런 연장선에 있다.
만약 두 개발자가 개발 도중 우연히 같은 이름의 클래스명을 사용하여 코드를 작성하였다면 나중에 프로그램에서 이름의 충돌이 일어날 것이다. 클래스가 많아짐에 따라서 같은 이름을 가진 클래스가 생겨날 가능성이 높아지게 되고 이름의 충돌을 방지하기 위해 고안된 것이 패키지이다.
우리가 자바 코드를 작성할 때 가장 상단에 패키지가 적혀있는데
하단에 우리가 작성된 소스코드의 클래스가 소속되어 있는 패키지를 나타낸다.
package alzpaCare.server.member.controller;
좌측의 사이드바에서 디렉토리처럼 나뉘는 부분이 패키지라고 할 수 있다.

일부 IDE에서는 패키지의 사용을 강제하고 있기 때문에 개발자들은 패키지가 무엇인지 숙지하지 않고 있더라도 자연스럽게 사용해왔을 것이다.
패키지는 일반적으로 코드를 만드는 조직이나 개인이 소속되거나 소유하고 있는 도메인의 이름을 사용하는 경우가 일반적이다. 왜냐하면 도메인이 중복될 가능성이 없기 때문이다. 물론 엉뚱한 누군가가 다른 회사의 도메인을 사용하는 패키지명을 사용하는 것을 막을 순 없지만 일반적으로 그럴 일이 현저히 낮기 때문에 그렇다.
같은 패키지안에 있는 클래스를 사용할 때는 문제가 없지만
다른 패키지에 속해있는 클래스를 사용하려고 하면 로드가 불가능하기 때문에 빨간 밑줄이 생길 것이다. 이럴 때는 임포트(import 가져온다)를 하면 되는데 다른 패키지에 있는 클래스를 가져오겠다는 뜻이다.

import org.springframework.web.bind.annotation.*;
마지막에 *(와일드 카드)을 사용하여 해당 패키지에 있는 모든 클래스를 로드하는 것도 가능하지만 경우에 따라서는 좋지 않은 결과를 불러일으킬 수도 있기 때문에 가능하다면 원하는 패키지를 정확하게 특정하여 사용하는 것이 더 바람직하다.
개발 도구(IDE)없이 코딩하는 경우는 거의 없겠지만 내부에서 어떤 일이 일어나는지 아는 것과 모르는 것에는 차이가 있을 것이다.
프로젝트의 루트(최상위) 디렉토리를 살펴보면 bin(binary의 줄임말, 2진수)과 src(소스코드 줄임말)인 디렉토리가 있다. bin안에는 컴퓨터가 이해할 수 있는 언어인 2진수, 2바이트 코드의 형태로 클래스가 위치하게 되고 사람이 이해할 수 있는 코드는 src에 위치한다.
콘솔을 연다음 루트 디렉토리에서 아래와 같은 명령을 입력하면 그 결과로 Selfcompile.java가 있던 example3폴더에 Selfcompile.class 파일이 생성된다.
javac src/org/tutorials/javatutorials/packages/example3/Selfcompile.java
그런데 현재 바라는 것은 src가 아닌 bin에 위치하게 하고 싶은 상황이기에 '-d 디렉토리명'으로 컴파일 된 결과를 다른 디렉토리에 만드는 명령어를 통해 아래와 같이 입력하고 아무 메세지가 뜨지 않으면 성공한 것이다.
javac src/org/tutorials/javatutorials/packages/example3/Selfcompile.java -d bin
윈도우 탐색기로 돌아가보면 원하는 대로 생성된 것을 확인할 수 있다.
이름의 중복을 해결하기 위해 고안된 패키지지만 그럼에도 불구하고 이름의 중복이 발생하는 경우가 있을 수 있다.
만약 같은 이름의 다른패키지에 존재하는 같은 이름의 클래스를 동시에 import하여 로드되어 있는 상태에서 클래스를 사용하려 한다면 어떤 것을 사용하려고 하는지 모르겠다, 애매함이 발생하고 있다는 에러를 출력할 것이다.
이런 경우에는 명시적으로 클래스앞에 위치를 붙여서 지정하여 해결할 수도 있다.
