Java API에 있는 File 클래스의 메소드를 보다가 getAbsolutePathgetCanonicalPath를 보고는 이상하다 생각했다. 결과가 항상 같은 절대경로로 나왔던 것이다.
하지만 CanonicalAbsolute 는 분명한 차이점이 있다.

문자열을 통해서 어떤 객체를 표현 한다고 해보자.
5라는 정수는 “5”, “000005”, “+5”, “5.0”, “0.5e+01” 등으로 표현할 수 있다.
이 중 Canonical한 표현은 딱 하나다. 여기서는 “5” 이다.

/home/originfile 이런 파일이 있다고 생각해보자. 현재 디렉토리가 /home 이라고 할 때 이 파일의 상대경로는 무수히 많다.

  • ./originfile
  • ../home/originfile
  • ././././originfile 등등

절대경로는 /home/originfile이 될 것이다.
그런데 절대경로가 /home/originfile 1개만 존재할까? 그렇지만도 않다.
/home/../home/originfile
/home/./././originfile
등도 모두 적법한 절대 경로이다.

이 뿐만 아니다.
/home/originfile을 가리키는 /home/symlink 라는 파일을 하나 생성했다고 하자.
/home/symlink도 역시 이 파일 객체에 대한 절대 경로가 된다.
따라서 절대 경로 역시 상대 경로와 마찬가지로 무수히 많은 경우의 수를 가질 수 있다.

이들과는 다르게 Canonical Path는 어떤 파일의 경로를 나타내기 위한 유일한 심볼이다.
절대 경로가 어떻든지 상관없이 이 파일에 대한 Canonical path는 항상 /home/originfile 이며 이것은 유일하다.

아래에 이해를 돕는 간단한 코드가 있다.

System.setProperty("user.dir", "/home");
File f = new File("/home/originfile");
System.out.println("Abs path : " + f.getAbsolutePath());
System.out.println("Can path : " + f.getCanonicalPath());
f = new File("/home/symlink");
System.out.println("Abs path : " + f.getAbsolutePath());
System.out.println("Can path : " + f.getCanonicalPath());
f = new File("./././originfile");
System.out.println("Abs path : " + f.getAbsolutePath());
System.out.println("Can path : " + f.getCanonicalPath());
Abs path : /home/originfile
Can path : /home/originfile
Abs path : /home/symlink
Can path : /home/originfile
Abs path : /home/./././originfile
Can path : /home/originfile

이제 Canonical Path와 Absolute Path가 어떤 차이가 있는지 이해할 수 있을 것이다.
이것은 Java에서 프로그래밍 할 때만 나오는 것이 아니라 일반적인 개념이기 때문에 알아두면 유용하다.

윈도우 비스타 부터는 mklink라는 명령이 추가되었는데 심볼릭 링크와 하드링크를 만들 수 있다.
심볼릭 링크를 만들어서 테스트해보면 윈도우즈에서도 아마도 위와 같은 결과가 나올 것이다.

윈도우즈 프로그래밍을 하다보면 MSDN을 읽게 될 때 fully-qualified path라는 용어를 자주 볼 수 있다. 어떤 함수는 인자로서 꼭 fully-qualified path를 요구한다.
fully-qualified path는 그냥 절대 경로를 뜻하는 것이 아니라 canonical path와 비슷하다.

MSDN에는 fully-qualified path2개의 역슬래시로 시작하거나, 드라이브 레터와 역슬래시로 시작해야 한다고 말하고 있다. 예를 들면 다음과 같다.

\\server\share\directory\file.txt
C:\directory\file.txt

그렇지만 다음은 fully-qualified path가 아니다.

C:\directory\..\directory\file.txt