Java

클래스 패스

본 수업에서는 IDE(eclipse, intellij)를 사용하지 않고 운영체제의 기본 에디터를 사용 한다.

클래스 패스

빈 디렉터리에 아래와 같이 코드를 작성한다. 필자는 프로젝트 디렉토리에 /srcbin 이라는 디렉토리를 만들고 여기에서 실습을 진행할 것이다. 아래 예제의 파일명은 ClasspathDemo.java 이다. 

class Item{
}

class ClasspathDemo {
}

컴파일을 한다.

javac ClasspathDemo.java

그 결과 두 개의 클래스 파일이 생성된다.

  • ClasspathDemo.class
  • Item.class

즉 클래스 하나는 하나의 클래스 파일이 된다는 것을 알 수 있다.

클래스의 경로

ClasspathDemo2.java을 만들고 내용을 아래와 같이 한다.

class Item2{
    public void print(){
		System.out.println("Hello world");	
	}
}

class ClasspathDemo2 {
	public static void main(String[] args){
		Item2 i1 = new Item2();
		i1.print();
	}
}

컴파일을 한다.

javac ClasspathDemo2.java

그리고 현재 디렉터리 하위에 lib을 만들고 여기에 Item2.class 파일을 이동한다. 현재 디렉터리에는 Item2.class 파일이 없어야 한다. 그리고 ClasspathDemo2를 실행한다.

java ClasspathDemo2

아래와 같은 결과가 출력된다.

F:\dropbox\생활코딩\실습\java_tutorials\srcbin>java ClasspathDemo2
Exception in thread "main" java.lang.NoClassDefFoundError: Item2
        at ClasspathDemo2.main(ClasspathDemo2.java:9)
Caused by: java.lang.ClassNotFoundException: Item2
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 1 more

이것은 item.class 파일이 현재 디렉터리에 존재하지 않기 때문에 찾을 수 없다는 메시지다. 아래와 같이 실행해서 이 문제를 해결할 수 있다.

java -classpath ".;lib" ClasspathDemo2
리눅스, OSX와 같은 유닉스 계열의 시스템이라면 아래와 같이 콜론을 사용해야 한다.
java -classpath ".:lib" ClasspathDemo2

옵션 -classpath는 자바를 실행할 때 사용할 클래스들의 위치를 가상머신에게 알려주는 역할을 한다. -classpath의 값으로 사용된 ".;lib"를 살펴보자.

.

현재 디렉터리에서 클래스를 찾는다는 뜻이다.

;

경로와 경로를 구분해주는 구분자

lib

현재 디렉터리에 없다면 현재 디렉터리의 하위 디렉터리 중 lib에서 클래스를 찾는다는 의미다.

만약 .을 제외한다면 어떻게 될까? 아래와 같은 오류가 발생할 것이다.

F:\tmp\java>java -classpath "lib" ClasspathDemo
오류: 기본 클래스 Classpath을(를) 찾거나 로드할 수 없습니다.

디렉터리 lib 아래에 있는 Item.class 파일을 찾았는데 정작 현재 디렉터리에 있는 ClasspathDemo.class 파일은 찾을 수 없기 때문이다.

이와 같이  클래스 패스라는 것은 자바를 실행할 때 클래스의 위치를 지정하는 역할을 하는 것이다. 클래스 패스는 자바 애플리케이션이 사용하고 있는 클래스가 여러 경로에 분산되어 있을 때 유용하게 사용할 수 있는 방법이다.

지금까지는 자바를 실행할 때 클래스 패스를 지정하는 방법을 알아봤다. 실행 할 때마다 클래스 패스를 지정하는 것이 귀찮다면 클래스 패스를 시스템의 환경변수로 지정하면 된다.

환경변수

환경변수는 운영체제에 지정하는 변수로 자바 가상머신과 같은 애플리케이션들은 환경변수의 값을 참고해서 동작하게 된다. 자바는 클래스 패스로 환경변수 CLASSPATH를 사용하는데 이 값을 지정하면 실행할 때마다 -classpath 옵션을 사용하지 않아도 되기 때문에 편리하다. 하지만 운영체제를 변경하면 클래스 패스가 사라지기 때문에 이식성면에서 불리할 수 있다.

운영체제 별로 환경변수를 설정하는 방법은 자바를 설치하는 방법에서 다루기 때문에 이것을 참고하자.

동시대적 감수성

필자는 상수, 변수, 연산자, 조건문, 반복문을 가장 기본적인 프로그래밍의 수단이라고 생각한다. 다시 말해서 로직 자체라고 생각 할 수 있다. 반면에 메소드, 유효범위, 클래스, 클래스 패스와 같은 것들을 관통하는 공통분모는 로직의 체계적인 관리수단이라고 할 수 있다. 로직 자체는 간단하다. 하지만, 이 로직을 체계적으로 관리하기 위한 수단들은 많다. 복잡하다. 프로그래밍이 이러한 복잡성을 감수하고 있는 것은 로직의 체계적 관리가 그만큼 중요한 문제라는 반증일 수도 있다. 그 중요성을 이해한다면 이러한 수단들이 단지 공부거리가 아니라 개발을 쾌적하게 도와주는 매우 유용한 도구라는 것을 이해할 수 있을 것이다.

만약 여러분이 프로그래밍의 초창기부터 개발을 했다면 이러한 도구들의 등장이 마치 게임의 아이템을 획득한 것처럼 즐거운 일이었을 것이다. 그 느낌을 그대로 느끼는 것은 어렵겠지만, 이러한 기능이 등장하게 된 시대에 있다고 상상해본다면 공부가 좀 더 흥미롭게 느껴지지 않을까?

다음 챕터에서는 클래스 패스와 함께 거론될 수 밖에 없는 개념인 패키지라는 것을 알아본다.

댓글

댓글 본문
  1. irish1998
    2024.07.15 Done
  2. 24.01.20 완료
  3. 서달
    20230325
  4. coster97
    .
  5. wwwqiqi
    완료
  6. Alan Turing
    09/13
  7. PassionOfStudy
    복습 3일차!
  8. 치키티타
    220613
  9. 김은희
    20220610 완료
  10. PassionOfStudy
    클래스 패스!
  11. 20220427
  12. 모찌말랑카우
    22.02.17 완료
  13. 민둥빈둥
    22.02.07
  14. 행달
    22.02.05 완료!!
  15. 드림보이
    2021.12.09. 클래스패스 파트 수강완료
  16. syh712
    2021-12-08<클래스패스>

    클래스 패스라는 것은 자바를 실행할 때 클래스의 위치를 지정하는 역할을 하는 것이다. 클래스 패스는 자바 애플리케이션이 사용하고 있는 클래스가 여러 경로에 분산되어 있을 때 유용하게 사용할 수 있는 방법

    java -classpath ".:lib" ClasspathDemo2

    옵션 -classpath는 자바를 실행할 때 사용할 클래스들의 위치를 가상머신에게 알려주는 역할을 한다. -classpath의 값으로 사용된 ".;lib"를 살펴보자.

    .

    현재 디렉터리에서 클래스를 찾는다는 뜻이다.

    ;

    경로와 경로를 구분해주는 구분자

    lib


    현재 디렉터리에 없다면 현재 디렉터리의 하위 디렉터리 중 lib에서 클래스를 찾는다는 의미다.







    환경변수는 운영체제에 지정하는 변수로 자바 가상머신과 같은 애플리케이션들은 환경변수의 값을 참고해서 동작하게 된다. 자바는 클래스 패스로 환경변수 CLASSPATH를 사용하는데 이 값을 지정하면 실행할 때마다 -classpath 옵션을 사용하지 않아도 되기 때문에 편리하다. 하지만 운영체제를 변경하면 클래스 패스가 사라지기 때문에 이식성면에서 불리할 수 있다.

    상수, 변수, 연산자, 조건문, 반복문을 가장 기본적인 프로그래밍의 수단. 다시 말해서 로직 자체라고 생각 할 수 있다. 반면에 메소드, 유효범위, 클래스, 클래스 패스와 같은 것들을 관통하는 공통분모는 로직의 체계적인 관리수단이라고 할 수 있다.
  17. 네제가해냈습니다
    211117
  18. IaaS
    2021.11.2 수강완료
  19. 성치
    2021-11-01일 완료
  20. H4PPY
    1019
  21. 미NI언
    10.12 수강완료
  22. super1Nova
    210823
  23. 하연주
    210208 완료
  24. 이정왓
    다시보기 패키지로 넘어가고 이해가 안되는 부분이 있다면 다시 돌아오기
  25. 김태현
    공부완료
  26. EunSeok Kang
    잘배우고 갑니다. 2020.08.11
    근데 윈도우 시리얼 이렇게 노출되도 되나요?ㅋㅋ
  27. Angel Priya
    Best of collection Telugu quotes: https://statussove.com......es/
  28. 김시은
    클래스는 실행 시 각각 하나의 클래스 파일을 갖는다. 파일 실행 시에 실행하려는 클래스의 파일과 내부적으로 필요로 하는 클래스의 파일이 서로 다른 디렉토리에 위치한다면 에러가 발생한다. 이런 경우 다른 디렉토리에 있는 클래스가 "어떤" 다른 클래스에 있는지 알려줘야하는데, 이 때 classpath를 사용한다.
    즉, classpath는 실행하려는 파일이 필요로 하는 클래스들의 후보들을 어디에서 찾아야 할지 지정해주는 옵션이다.
    따로 classpath옵션을 지정하지 않는다면 java는 당연히 기본적으로 현재 디렉토리 안에서 클래스를 찾는다.
    즉 classpath를 지정하지 않는 것은 java classpath "."으로 지정하는 것과 완전히 같은 의미이다.

    다른 사람이 만든 로직을 가져와서 쓰고싶다거나, 여러 어플리케이션이 공통된 로직을 공유하는 경우 클래스패스가 사용될 것이다.

    그러나 컴파일 할 때마다 매번 classpath를 지정해주기는 어렵기때문에 운영체제 자체의 classpath를 지정할 수가 있는데, 이것이 바로 환경변수 설정이다 ~.~
  29. 송승현
    cmd에서 명령어 : java ClasspathDemo2 실행시
    오류: 기본 클래스 ClasspathDemo2을(를) 찾거나 로드할 수 없습니다. 라는 오류가 발생한다면

    -원인-
    (정확히 이해는 되지 않으나) 패키지가 많아 경로를 찾지 못해서 발생한다고 합니다.

    -해결방법-
    cd 명령어를 통해 src 폴더로 이동하신후 ClasspathDemo2.class가 있는 경로까지 직접 적어주시면 됩니다.
    예) java org.open.javatutorials.classpath.ClasspathDemo2

    이외 자세한 내용은 다른 지혜로우신 분께서 살을 붙여주실거라 믿고 이만 생략하겠습니다.
  30. 김승민
    2020-04-17
    감사합니다~
  31. 흐무
    2020.03.11
    클래스패스는 자바를 실행할때 JVM에게 클래스의 위치를 알려주는 억할을 한다.
    환경변수를 설정한 이유는 시스템내에서 클래스패스를 불러오기위해서이다,
  32. 요로요로요로롱
    다시
  33. Jaden
    이 동영상 만으로는 이 동영상을 다 이해하시기는 힘들 수 도있습니다.
    다양한 방법으로 java를 비롯한 프로그래밍 공부를 해보세요!
    저도 이 동영상을 처음봤을때와, 두번째 봤을때 그리고 혼자 다양하게 공부하고난 후 보는 지금, 느끼는 점과 이해하는 폭이 매우 다른것 같아요!! 열공하세요 화이팅
    대화보기
    • 허공
      감사합니다!
    • PassionOfStudy
      191004(금) - (1)
      수강완료~
    • 홍주호
      20190912 완료
    • 다나가
      190903 - 수강완료!!!!
    • doevery
      수강완료
    • 지미츄
      감사합니다
    • proud00
      잘 봤어요 고맙습니다.
    • 왕만두
      정말 머리 좋은 사람을 제외하면 처음에 프로그래밍 언어 배우는건 원래 정말 어려워요

      저도 처음 프로그래밍 언어 배울 때 영어를 못해서 함수 이름의 발음을 적고 단어들을 외우는 정도였습니다

      학교에서 하는 프로그래밍 첫 강의 (이론은 인강) 듣는데 너무 어려워서 20몇분짜리를 900분 정도 학습할 정도로 들었어요.. 두번째 강의도 15분짜리인데 400분 정도 듣고...

      정도는 다르겠지만 어려운건 지극히 정상입니다 저처럼 컴퓨터 기본 작동원리랑 변수 상수 배우는데 20시간 정도 걸리는 사람도 있어요ㅠㅠ

      화이팅!
      대화보기
      • jiahnkimm@gmail.com
        선생님.. 저 정말 열심히 하고 싶어요 . 잘하고 싶은데 제 머리한테 너무 화가 나네요...ㅜ.. 반복해서 듣다보면 이해 하게 될까요 ? 제네릭 보고.. 학원에서도 배우고 있는데 정말 이해가 잘 안되네요 ... 메소드부터 다시 쭉 보는데 ... 이해가 100% 되지가 않으네요. 그래도 선생님 영상 보면 힘이 다시 솟아 나는거 같아요. 감사합니다..ㅠ
      • 이현정
        완료
      • 6/17시작
        7월 1일 완료

        어렵네요 ㅎㅎㅎ 노력해야겠습니다
      • 김혜련
        선생님 항상 고맙습니다. 자바 입문자로서 열심히 따라가며 독학중입니다~!
        그런데... 너무 창피하게도 여쭤 볼 곳이 없어 댓글로 여쭤보게 되었습니다...
        여기저기 검색을 하며 알아보고 있는데..ㅜㅜ 풀리지 않는 것 같습니다.

        제가 환경변수 path 추가를 진행하던 중... 기존에 있던 윈도우 10 시스템 변수 path를 지워버리고 말았습니다.
        복구를 위해 찾아봤지만 복구를 할 수도 없는 상황으로 보입니다 ㅜ 기존 path가 사라지면 혹 운영체제에 문제가 생길까요? 현재 path는 수업시간에 안내되었던 자바폴더 path로만 되어있습니다.....ㅜㅜ

        제가 맞게 질문한 것인지는 모르겠습니다만, 실례를 범한 것이라면 ㅜㅜ 죄송합니다~!
      • 라또마니
        고맙습니다. 클래스패스, 환경변수 잘 이해했어요!~~
      • j-graphy
        2019. 2. 19. 학습완료
      • j-graphy
        Item2.class, ClasspathDemo2.class 모두 lib 디렉토리 안에 있는 것 아닌가요?
        아니면 환경 변수 자체가 현재 디렉토리로 설정되어 있는 것 아닌가요?
        대화보기
        • 호두
          고맙습니다.
        • 김경모
          경로 설정을 할 때 한글 디렉토리가 있어도 괜찮은 건가요???
        버전 관리
        egoing
        현재 버전
        선택 버전
        graphittie 자세히 보기