클래스 패스란 말 그대로 클래스가 위치하는 경로를 지정하여 자바가 필요로 하는 클래스를 로드할 수 있는 방법을 지정하는 것을 말한다.
터미널에서(윈도우+R cmd) 자바 소스코드가 담겨있는 디렉토리로 이동하고, 'javac 파일명.java'를 입력하면 코드를 컴파일해서 클래스 파일로 만드는 명령어로서 실행된다.
dir로 실행결과를 살펴보면 파일 안에 있던 클래스들이 '클래스명.class'로 추가 생성된 것을 확인 할 수 있다. 만약 소스코드 안에 클래스가 3개가 있으면 각각 3개의 클래스 파일이 생성될 것이다.
그 후 'java 파일명'을 명령하면 main 메소드가 호출되는 것이 약속되어 있기 때문에 메소드의 실행결과가 System.out.println("hello, world")라면 터미널 창에 hello, world가 출력된다.
hello, world가 출력된 이유는 우리가 소스코드를 실행할 때 메인 메소드가 실행되고 클래스가 인스턴스화 시킨 다음 클래스파일 안에 담겨 있는 내용을 자바가 읽어서 실행한 결과라고 보면 된다.
만약 컴파일 하여 생성된 class 파일을 다른 디렉토리로 이동시킨다면 어떻게 될까?
아마 아래와 같은 에러 메세지를 만나게 될 것이다.

보이는 것과 같이 'ClassNotFoundException: 클래스명' 클래스를 찾을 수 없기 때문에 예외가 발생했다는 내용이다.
이렇듯 내부적으로 사용하고 있는 클래스 파일이 디렉토리에 존재하지 않으면 자바 컴파일러가 직접 찾지 못하기 때문에 개발자가 지정해 줄 필요가 있는데
java -classpath ".;새디렉토리명" 클래스파일명
을 입력하면 다시 hello, world 가 출력되는 것을 확인할 수 있다.
위 명령은 현재 디렉토리에서 클래스파일을 찾아보고 만약 필요한 클래스가 존재하지 않는다면 이 디렉토리 안에서 찾아봐라. 라는 실행 옵션을 지정한 것이다.
만약 .을 제거하고 실행시키면 어떤 일이 생길까?
java -classpath ";새디렉토리명" 클래스파일명
이번에는 class 파일이 담긴 새디렉토리 안에서만 파일을 찾도록 되어 있기 때문에 java파일을 찾을 수 없어 오류가 발생하게 된다.

즉 클래스 패스를 이용하면 클래스를 실행시킬때 디렉토리의 위치와 후보군을 지정하여 자바가 실행하면서 항목들에서 자바와 클래스파일을 순차적으로 찾아내고 만약 찾지못하면 오류를 발생시키게 되는 것을 알 수 있었다. 세미클론은 경로와 경로의 구분자 역할을 한다.
환경 변수는 자바 애플리케이션이 실행 될 때 클래스를 사용하게 되는데 그 클래스가 컴퓨터 상에서 어디에 위치하는가를 지정하는 것이다.
환경 변수가 필요한 이유는 여러 개발자가 하나의 프로그램을 개발할 때 다른 사람이 만든 로직(코드) 클래스를 자신이 쓰고 있는 클래스로 가져오기 위해서 경로를 지정해야 할 필요가 있고, 여러개의 어플리케이션이 공통된 클래스를 사용하고 있는 경우에도 그 클래스를 읽어오기 위한 경로를 지정할 필요가 있기 때문이다.
그런데 컴파일을 할때마다 클래스 패스를 직접 지정하는 과정은 무척 번거로운 일이기 때문에 환경 변수를 통해서 클래스 패스를 지정하여 수고로움을 덜고 있다.
운영체제에 설치되어 있는 글로벌한 운영체제 세팅 변수를 이용하면 자바는 지정된 약속에 따라 클래스 패스 값을 사용하게 되고 따라서 일일히 실행시키지 않더라도 지정한 것과 같은 효과를 누릴 수 있다.
윈도우의 경우 아래를 따라서 전체 경로를 설정하면 된다.
내pc - 시스템 - 고급 시스템 설정 - 환경 변수
경우에 따라서는 명령을 실행할 때 마다 필요한 환경 변수를 지정하는 것이 더 바람직한 경우도 있을 수 있으나 그 과정이 불편하기 때문에 배시나 쉘과 같은 스크립트를 이용하기도 한다.
로직을 체계적으로 관리하는 것은 중요한 이슈지만 작은 애플리케이션만 만들어 본 초심자의 입장에서는 아직까지 크게 체감되지 않는다. 하지만 필요성을 느끼게 되는 순간이 오면 더 깊게 공부하게끔 개념을 알고만 넘어가기로 한다.