본문 바로가기
Dev. Cookbook/Java, JSP

[Java] 상대경로, 절대 경로, 정규 경로(표준 경로), getPath(), getCanonicalPath(), getAbsolutePath() 차이점

by breezyday 2022. 4. 27.

1. 경로란

경로 혹은 패스(path)는 파일 시스템에서 파일이나 디렉터리의 고유한 위치를 의미합니다. 문자열로 표현하며 디렉터리 트리 계층을 따라 위치를 나타내며 구분자로 분리되는 경로 구성 요소를 통해 각각의 경로를 나타내게 됩니다. 

 

구분 문자는 운영체제에 따라서 Unix, Linux에서는 슬래시( / ), Windows에서는 역슬래시( \ )문자를 사용합니다.

 

windows cmd.exe에서 특정 경로의 디렉터리 트리 구조를 확인하고 싶다면 TREE라는 명령어를 사용하면 확인할 수 있습니다.

cmd window, show directory, use TREE

2. 상대경로, 절대 경로, 정규 경로(표준 경로)

2.1 경로를 표시하는 방법

구분자 의미
. 현재 경로
.. 상위 경로
\ or / 경로 구분
 / : Unix or Linux
 \ : Windows

경로를 표시할 때는 위의 구분자를 사용하여 경로를 표시합니다.

동일한 경로라도 운영체제에 따라서는 서로 다른 구분자를 사용합니다.

2.2 상대 경로

현재 위치에서 구분자를 사용한 경로입니다.

 

-- 현재 디렉토리
C:\Program Files\Java\jdk-11.0.11\bin

-- java.exe 조회
-- 상대경로
.\java.exe
.\..\bin\java.exe

2.3 절대 경로

최상위 경로에서부터 상대 경로를 포함한 경로

 

-- 현재 디렉토리
C:\Program Files\Java\jdk-11.0.11\bin

-- java.exe 조회
-- 절대경로
C:\Program Files\Java\jdk-11.0.11\bin\java.exe
C:\Program Files\Java\jdk-11.0.11\bin\.\..\bin\java.exe
C:\Program Files\Java\jdk-11.0.11\bin\.\..\..\jdk-11.0.11\bin\java.exe

2.4 정규 경로(표준 경로)

최상위 경로로부터 최단 경로를 포함한 경로입니다.

정규 경로는 시스템에서 한 개만 존재합니다.

 

-- 현재 디렉토리
C:\Program Files\Java\jdk-11.0.11\bin

-- java.exe 조회
-- 정규경로(표준경로)
C:\Program Files\Java\jdk-11.0.11\bin\java.exe

 

cmd 창에서 여러 개의 절대 경로를 사용하여 java.exe -version를 실행했습니다.

구분자가 여러 개가 있어도 같은 경로를 나타내고 있습니다.

 

windows에서 공백이 있는 경우 " "로 묶어 사용합니다.

3. Java에서 경로 조회 함수

3.1 getPath() : 경로 

File 객체를 만드는 데 사용되는 경로를 나타내는 문자열을 반환합니다.

현재 디렉터리에 상대적일 수 있습니다.

3.2 getAbsolutePath() : 절대 경로

상대 경로인 경우 현재 디렉터리에 대해 해석한 후 절대 경로 문자열을 반환합니다.

동일한 파일을 가리키는 절대 경로는 여러 개가 존재합니다.

3.3 getCanonicalPath() : 정규 경로, 표준 경로

현재 디렉터리에 대한 상대 경로를 확인한 후 상대 경로 요소를 제거하고 경로 문자열을 반환합니다.

하나의 파일을 가리키는 정규 경로는 단 하나만 존재합니다. 

 

각각의 함수의 차이점은 아래 코드를 보는 것이 이해가 빠릅니다. 

4. 이클립스(Eclipse)에서 경로

 

이클립스에서 어떤 Project의 현재 디렉터리는 workspace 디렉터리에서 Project이름이 현재 경로가 됩니다.

이클립스 프로젝트에서 Java 코딩을 하면서 File객체를 사용하여 'program.txt'를 생성하면 아래의 경로에 생성이 됩니다. 

 

제 경우는 workspace 경로가 'workspace-EZEN'이며 project명이 'Chap14_InputOutput'입니다.  이와 같은 workspace와 Project에서 'program.out'을 생성하면 아래의 경로에 생성됩니다.

 

 

import java.io.*;

public class FileEx1 {
	public static void main(String[] args) throws IOException {
		File file = new File("program.out");
        
		String fileName = file.getName();
		System.out.println("파일명:" + fileName);
		
		String path = file.getPath();
		System.out.println("파일경로:" + path);
		
		System.out.println("파일의 절대경로:" + file.getAbsolutePath());
		System.out.println("파일의 정규경로:" + file.getCanonicalPath());
	}
}

 

이클립스에서 위와 같이 별도의 경로 지정 없이 파일명만 사용하게 되면 현재 디렉터리를 앞서 설명한 것과 같은 "D:\workspace-EZEN\Chap14_InputOutput"를 찾게 됩니다. 그래서 실행 결과를 보면 아래와 같습니다.

 

파일명:program.out
파일경로:program.out
파일의 절대경로:D:\workspace-EZEN\Chap14_InputOutput\program.out
파일의 정규경로:D:\workspace-EZEN\Chap14_InputOutput\program.out

 

이렇게 조회하면 절대 경로와 정규 경로가 아무런 차이가 없는 것처럼 보입니다. 

그래서 파일을 조회할 때 상대 경로를 입력하여 조회하면 아래와 같은 결과를 보여줍니다. 

 

import java.io.*;

public class FileEx1 {
	public static void main(String[] args) throws IOException {
		File file = new File("..\\Chap14_InputOutput\\program.out");
		
		String fileName = file.getName();
		System.out.println("파일명:" + fileName);
		
		String path = file.getPath();
		System.out.println("파일경로:" + path);
		
		System.out.println("파일의 절대경로:" + file.getAbsolutePath());
		System.out.println("파일의 정규경로:" + file.getCanonicalPath());
	}
}

 

이제 절대 경로와 정규 경로의 값이 다르게 나타납니다.

 

파일명:program.out
파일경로:..\Chap14_InputOutput\program.out
파일의 절대경로:D:\workspace-EZEN\Chap14_InputOutput\..\Chap14_InputOutput\program.out
파일의 정규경로:D:\workspace-EZEN\Chap14_InputOutput\program.out

이것만 기억하면 될 것 같습니다. 

 

절대 경로( getAbsolutePath )상대 경로를 포함할 수 있어서 여러 경로가 있을 수 있으며, 정규 경로( 표준 경로 : getCanonicalPath )하나만 존재한다

 

 

 

댓글