Java로 현재 작업 디렉토리를 얻는 방법?


1028

java를 사용하여 현재 작업 디렉토리에 액세스하고 싶습니다.

내 코드 :

 String current = new java.io.File( "." ).getCanonicalPath();
        System.out.println("Current dir:"+current);
 String currentDir = System.getProperty("user.dir");
        System.out.println("Current dir using System:" +currentDir);

산출:

Current dir: C:\WINDOWS\system32
Current dir using System: C:\WINDOWS\system32

C 드라이브가 현재 디렉토리가 아니기 때문에 출력이 올바르지 않습니다.

현재 디렉토리를 얻는 방법?


2
cd명령을 실행할 때 명령 프롬프트에서 명령을 실행할 때 표시되는 내용을 여기에 붙여 넣을 수 있습니까?
Nishant

3
작업 디렉토리에 액세스하여 달성하려는 것은 무엇입니까? 대신 클래스 경로를 사용하여 수행 할 수 있습니까? 예를 들어, 파일 시스템에서 텍스트 파일을 읽어야하는 경우 클래스 경로에있을 때 쉽게 찾을 수 있습니다.
earldouglas

1
어떻게? 좀 더 자세히 설명해 주시겠습니까?
C graphics

1
클래스 경로에서 파일에 액세스하는 방법에 대한 자세한 내용은 stackoverflow.com/questions/1464291/…
downeyt

7
디버깅 목적으로, 작업 디렉토리는 프로그램이 존재하는 파일에 액세스 할 수 없는지 아는 데 유용 할 수 있습니다.
nsandersen

답변:


1151
public class JavaApplication {
  public static void main(String[] args) {
       System.out.println("Working Directory = " + System.getProperty("user.dir"));
  }
}

응용 프로그램이 초기화 된 곳에서 완전한 절대 경로를 인쇄합니다 .


로부터 문서 :

java.io패키지는 현재 사용자 디렉토리를 사용하여 상대 경로 이름을 확인합니다. 현재 디렉토리는 시스템 특성, 즉 user.dirJVM이 호출 된 디렉토리로 표시됩니다.


25
@ubuntudroid : 응용 프로그램이 초기화 된 경로를 인쇄한다고 구체적으로 언급 한 이유입니다. 나는 스레드 스타터가 commnad 프롬프트 (기본적으로 C : \ WINDOWS \ system32에 있음)를 시작한 후 jar / 프로그램을 직접 실행한다고 생각합니다. 내 요점을 이해하시기 바랍니다. 당신이 다운 보트를 받았다고 가정 할 때, 적어도 당신은 응답을 남기고 싶어한다는 점에 감사하십시오. :)
Anuj Patel

1
user.dir은 프로세스가 시작된 폴더의 경로를 가져옵니다. 응용 프로그램의 기본 폴더에 대한 실제 경로를 얻으려면 아래 내 답변을 참조하십시오.
Peter De Winter

1
" 현재 디렉토리를 찾기 위해 의존하는 모든 코드 가 실패합니다." 모든 코드가 일반적인 것은 아닙니다. (저는 원래 주석을 편집하는 데 시간이 오래
걸렸습니다

13
@SubOptimal 사용자가 -Duser.dir, propable을 설정 한 경우 사용자 정의 작업 디렉토리에서이를 실행하려고합니다.
barwnikk

5
@indyaah 사실이 대답은 틀리다. 사용자 작업 디렉토리와 시스템 프로세스의 현재 작업 디렉토리 (cwd) 사이에는 미묘한 차이가있다. 대부분의 "user.dir"은 (java) 프로세스의 cwd를 가리 킵니다. 그러나 "user.dir"은 다른 의미를 가지며 Java 프로세스의 cwd를 얻는 데 사용되지 않습니다. btw : java 프로세스 docs.oracle.com/javase/tutorial/essential/environment/…에 더 많은 속성이 있습니다. 참조 용
comeGetSome

381

참조 : http://docs.oracle.com/javase/tutorial/essential/io/pathOps.html

java.nio.file.Pathand를 사용하여 java.nio.file.PathsJava가 현재 경로라고 생각하는 것을 보여주기 위해 다음을 수행 할 수 있습니다. 이것은 7 이상이며 NIO를 사용합니다.

Path currentRelativePath = Paths.get("");
String s = currentRelativePath.toAbsolutePath().toString();
System.out.println("Current relative path is: " + s);

이것은 Current relative path is: /Users/george/NetBeansProjects/Tutorials내 경우에는 내가 수업을 시작한 곳임을 출력 합니다. 절대 경로를 구성하고 있음을 나타 내기 위해 선행 구분 기호를 사용하지 않고 상대적인 방식으로 경로를 구성하면이 상대 경로가 시작점으로 사용됩니다.


2
첫 번째는 확인하지 않았지만 두 번째 것은 실제로 홈 폴더를 가져옵니다. 응용 프로그램이 실행중인 현재 작업 디렉토리가 아닙니다.
Peter De Winter

12
사용자의 홈 디렉토리 (귀하의 경우 "user.home", / Users / george)와 현재 작업 디렉토리 ( "user.dir")를 혼동하지 마십시오. 응용 프로그램에 대해 JVM을 시작한 디렉토리가됩니다. 예를 들어 / Users / george / workspace / FooBarProject와 같은 것일 수 있습니다.
David

1
나는이 방법을 선호합니다. 내가 작업 디렉토리의 부모를 필요로 할 때, 이것은 수행 하지 작업 : Paths.get("").getParent()그것은 준다 null. 대신 이것은 작동합니다 : Paths.get("").toAbsolutePath().getParent().
Ole VV

235

다음은 Java 7 이상에서 작동합니다 ( 설명서 는 여기 참조 ).

import java.nio.file.Paths;

Paths.get(".").toAbsolutePath().normalize().toString();

11
휴대 성이 더 좋은 것보다 더 나은 방법은 import java.io.File; File(".").getAbsolutePath()무엇입니까?
Evgeni Sergeev 2016 년

8
이식성이 있다고 말하면 Java 6 및 이전 버전에서 작동한다는 의미입니까? Paths.get()더 강력한 Path인터페이스에 직접 액세스 할 수 있다는 점에서 더 나은 것으로 간주 될 수 있습니다 .
Ole VV

8
.normalize()이 맥락에서 사용할 때의 장점은 무엇입니까 ?
Ole VV

7
@ OleV.V. Javadoc에서 : ( normalize method )Returns a path that is this path with redundant name elements eliminated.
Stephan

이 경우 이미 표준화되었습니다.
JM Becker

73

현재 작업 디렉토리의 경로가 표시됩니다.

Path path = FileSystems.getDefault().getPath(".");

그리고 이것은 작업 디렉토리에 "Foo.txt"라는 파일의 경로를 제공합니다 :

Path path = FileSystems.getDefault().getPath("Foo.txt");

편집 : 현재 디렉토리의 절대 경로를 얻으려면

Path path = FileSystems.getDefault().getPath(".").toAbsolutePath();

* 업데이트 * 현재 작업 디렉토리를 얻으려면 :

Path path = FileSystems.getDefault().getPath("").toAbsolutePath();

11
이것은 단지 '.'를 반환합니다. 나를 위해.
john ktejik

3
예, 많은 시스템에서 작업 디렉토리에 대한 참조가 될 것입니다. 절대 경로를 얻기 위해 메소드 호출을 하나 더 추가 할 수 있습니다Path path = FileSystems.getDefault().getPath(".").toAbsolutePath();
Mark

2
foo.txt가 필요하지 않습니다. 디렉토리를 얻기 위해 빈 문자열을 넣으십시오.
john ktejik

1
Windows (10) 에서는 현재 작업중 인 디렉토리 안에 Path있는 파일을 가리키는 객체를 제공합니다 .. "."나를 위해 일하기 보다는 빈 문자열을 사용 하십시오.
Kröw

36

이것은 나를위한 해결책입니다

File currentDir = new File("");

1
이러한 File 객체를 다른 File의 부모로 사용하면 부작용이 있습니다. new File (new File ( ""), "subdir")은 예상대로 작동하지 않습니다.
MRalwasser

13
이 문제를 해결하려면 new File("").getAbsoluteFile()대신 사용하십시오.
MRalwasser

4
그 가치에 대해서는 File ( ".")을 사용하는 것이 더 좋았습니다.
keshlam

Java에서 상대 경로를 정의하는 방법 이 페이지가 도움이되었습니다. 또한 /상대 경로를 만들 때 사용해야한다고 가정했습니다 . 나는 틀렸다 /.로 시작하지 마라 . ../디렉토리 트리에서 위로 올라가도 작동합니다.
Irrationalkilla

@keshlam이 디렉토리는 현재 디렉토리에 파일을 제공했습니다 ..
Kröw

32

나는이 솔루션을 다른 사람들보다 낫고 더 휴대하기 쉬운 주석에서 찾았습니다.

String cwd = new File("").getAbsolutePath();

또는

String cwd = Paths.get("").toAbsolutePath();

이것은 comeGetSome의 답변과 정확히 동일하며 실제로 Java <7 way
GoGoris

30

c : \ windows \ system32 가 현재 디렉토리가 아니라고 생각하는 이유는 무엇입니까 ? 이 user.dir특성은 명시 적으로 "사용자의 현재 작업 디렉토리"입니다.

다시 말하면, 명령 행에서 Java를 시작하지 않으면 c : \ windows \ system32는 아마도 CWD 일 것입니다. 즉, 프로그램을 시작하기 위해 두 번 클릭하는 경우 CWD는 두 번 클릭하는 디렉토리가 아닐 수 있습니다.

편집 : 이것은 오래된 창 및 / 또는 Java 버전에만 해당되는 것으로 보입니다.


2
적어도 Java 7을 사용하는 Windows 7 컴퓨터에서는 그렇지 않은 것 같습니다. user.dir일관되게 jar 파일을 두 번 클릭 한 폴더입니다.
Jolta

26

사용하십시오 CodeSource#getLocation().

이것은 JAR 파일에서도 잘 작동합니다. 당신은 얻을 수 CodeSourceProtectionDomain#getCodeSource()하고, ProtectionDomain차례로 얻을 수 있습니다 Class#getProtectionDomain().

public class Test {
    public static void main(String... args) throws Exception {
        URL location = Test.class.getProtectionDomain().getCodeSource().getLocation();
        System.out.println(location.getFile());
    }
}

2
JAR 파일의 위치를 ​​돌려줍니다. 요청한 내용이 아닙니다.
user207421 2013 년

22
this.getClass().getClassLoader().getResource("").getPath()

12
JAR 파일에서 응용 프로그램을 두 번 클릭하여 시작하면 NPE가 발생합니다.
매튜 와이즈

2
""애플리케이션이 JAR 파일 또는 CLASSPATH 요소에서 실행중인 경우 리턴 합니다. 요청한 내용이 아닙니다.
user207421 2013 년

@ Zizouz212 getClass()는 객체 메소드이므로 정적 컨텍스트에서 제거하면 this작동하지 않습니다. 을 (를) 수행하여 소속 클래스를 명시 적으로 참조해야합니다 MyClass.class.getClassLoader()......
Kröw

그럼에도 불구하고 작업 디렉토리를 반환하지 않습니다 ...
Angel O'Sphere

18

일반적으로 File 객체로 :

File getCwd() {
  return new File("").getAbsoluteFile();
}

"D : / a / b / c"와 같은 정규화 된 문자열을 원할 수 있습니다.

getCwd().getAbsolutePath()

1
Android에는 java.nio.file.Files가 포함되어 있지 않으므로 Android 테스트에서 잘 작동합니다.
iamreptar

정적 컨텍스트에서 나를 위해 작동하지 않는 것 같습니다 (new File ( "") throws NullPointerException) ..?
nsandersen

2
@nsandersen 아마도 잘못된 File 객체를 사용했을 것입니다 : System.out.println (new java.io.File ( ""). getAbsolutePath ());
comeGetSome


5

리눅스 당신이 실행할 때 항아리 에서 파일 단자 , 이들 모두 동일한 반환합니다 String: "/ 홈 / CurrentUser" , 개봉 된 jar 파일에 상관없이,이다. jar 파일을 시작할 때 터미널과 함께 사용하는 현재 디렉토리에 따라 다릅니다.

Paths.get("").toAbsolutePath().toString();

System.getProperty("user.dir");

귀하의 경우 Classmain호출 할 것 MainClass, 다음 시도 :

MainClass.class.getProtectionDomain().getCodeSource().getLocation().getFile();

jar 파일 의 절대 경로String 와 함께 를 반환 합니다.


3
요청한 것이 아닙니다.
user207421 2013 년

5

Windows user.dir을 사용하면 예상대로 디렉토리가 반환되지만 관리자 권한으로 응용 프로그램을 시작할 때 (admin으로 실행) 그렇지 않은 경우 C : \ WINDOWS \ system32가 표시됩니다.


3

패키지를 포함하여 현재 디렉토리에 액세스하고 싶습니다. 예를 들어 Java 프로그램이 c:\myApp\com\foo\src\service\MyTest.java있고 c:\myApp\com\foo\src\service다음 까지 인쇄 하려면 다음 코드를 시도하십시오.

String myCurrentDir = System.getProperty("user.dir")
            + File.separator
            + System.getProperty("sun.java.command")
                    .substring(0, System.getProperty("sun.java.command").lastIndexOf("."))
                    .replace(".", File.separator);
    System.out.println(myCurrentDir);

참고 : 이 코드는 Oracle JRE가 설치된 Windows에서만 테스트됩니다.


6
이 답변을 무시하지 않는 것은 무질서합니다. 게시하기 전에 더 신중하게 생각하십시오. 다음 사항이 모두 충족되지 않으면 코드가 손상됩니다. 1. JRE가 Oracle이고 그렇지 않은 경우 "sun.java.command"시스템 등록 정보가 없습니다 → NPE; 2. OS는 Windows입니다 ( File.separator대신 또는 다중 인수 File생성자를 사용하십시오). 3. 클래스 경로는 명령 행에 지정 되며 '패키지를 포함한 현재 디렉토리'(??)는 다음과 같습니다. 먼저 지정, b. 절대적으로 지정, c. CWD와 정확히 일치하며 (Windows의 대소 문자 구분 없이도) d. 는 CWD의 자손입니다
Michael Scheper

그것은 1과 2를 다룹니다. 그러나 내가 빠진 것이 아니라면 명령 줄에 지정된 클래스 경로 (예 : 환경 변수가 아님)와 '패키지를 포함한 현재 디렉토리'에 의존하고 있습니다 (I 나는 그것이 당신이 의미하는 바를 이해하지 못한다는 것을 인정한다. 그리고 대소 문자 일치 문제가 남아 있습니다. 내 의견이 도움이되지 않으면 죄송합니다. 주석 글자 수 한도 내로 유지하기 위해 명확성을 희생했습니다.
Michael Scheper 2016

@Inversus는 일부 환경에서만 "완벽하게 작동"합니다. 당신은 그중 하나에서 그것을 테스트 할만 큼 운이 좋았습니다. 적절한 런타임 환경에서 실패한 소프트웨어를 작성하는 것은 테스트 환경 세트가 포함되지 않을 정도로 광범위하지 않더라도 좋은 습관이 아닙니다.
Charles Duffy

@CharlesDuffy 당신이 맞아요, 그건 좋은 습관이 아닙니다. 다행스럽게도이 솔루션은 "내 특정 문제 해결"로 인해 "적절한 런타임 환경에서 실패"하지 않았습니다. 실제로, 그것은 내가 가지고있는 매우 구체적인 문제 (이 질문 / 답변과 다소 관련이 있음)를 해결하는 것 외에도 그러한 실패를 해결하고보다 강력한 코드를 작성하는 데 도움이되었습니다. 나는 그것을 발견하는 것이 운이 좋았다고 생각한다.
Inversus

3

그것이 체크인 Windows되었지만 다른 운영 체제에서 완벽하게 작동한다고 생각합니다 Linux,MacOs,Solaris.


같은 디렉토리에 2 개의 .jar 파일 이있었습니다 . 한 .jar파일에서 다른 파일을 시작하고 싶었습니다..jar 에서 같은 디렉토리에있는 파일 .

문제는 cmd현재 디렉토리 에서 시작할 때 입니다 system32.


경고!

  • 아래는 내가 심지어 폴더의 이름으로 수행 한 모든 테스트에서 꽤 잘 작동하는 것 같다 ;][[;'57f2g34g87-8+9-09!2#@!$%^^&()또는 ()%&$%^@# 그것을 잘 작동합니다.
  • ProcessBuilder다음과 같이 아래를 사용하고 있습니다.

🍂 ..

//The class from which i called this was the class `Main`
String path = getBasePathForClass(Main.class);
String applicationPath=  new File(path + "application.jar").getAbsolutePath();


System.out.println("Directory Path is : "+applicationPath);

//Your know try catch here
//Mention that sometimes it doesn't work for example with folder `;][[;'57f2g34g87-8+9-09!2#@!$%^^&()` 
ProcessBuilder builder = new ProcessBuilder("java", "-jar", applicationPath);
builder.redirectErrorStream(true);
Process process = builder.start();

//...code

🍂 getBasePathForClass(Class<?> classs):

    /**
     * Returns the absolute path of the current directory in which the given
     * class
     * file is.
     * 
     * @param classs
     * @return The absolute path of the current directory in which the class
     *         file is.
     * @author GOXR3PLUS[StackOverFlow user] + bachden [StackOverFlow user]
     */
    public static final String getBasePathForClass(Class<?> classs) {

        // Local variables
        File file;
        String basePath = "";
        boolean failed = false;

        // Let's give a first try
        try {
            file = new File(classs.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());

            if (file.isFile() || file.getPath().endsWith(".jar") || file.getPath().endsWith(".zip")) {
                basePath = file.getParent();
            } else {
                basePath = file.getPath();
            }
        } catch (URISyntaxException ex) {
            failed = true;
            Logger.getLogger(classs.getName()).log(Level.WARNING,
                    "Cannot firgue out base path for class with way (1): ", ex);
        }

        // The above failed?
        if (failed) {
            try {
                file = new File(classs.getClassLoader().getResource("").toURI().getPath());
                basePath = file.getAbsolutePath();

                // the below is for testing purposes...
                // starts with File.separator?
                // String l = local.replaceFirst("[" + File.separator +
                // "/\\\\]", "")
            } catch (URISyntaxException ex) {
                Logger.getLogger(classs.getName()).log(Level.WARNING,
                        "Cannot firgue out base path for class with way (2): ", ex);
            }
        }

        // fix to run inside eclipse
        if (basePath.endsWith(File.separator + "lib") || basePath.endsWith(File.separator + "bin")
                || basePath.endsWith("bin" + File.separator) || basePath.endsWith("lib" + File.separator)) {
            basePath = basePath.substring(0, basePath.length() - 4);
        }
        // fix to run inside netbeans
        if (basePath.endsWith(File.separator + "build" + File.separator + "classes")) {
            basePath = basePath.substring(0, basePath.length() - 14);
        }
        // end fix
        if (!basePath.endsWith(File.separator)) {
            basePath = basePath + File.separator;
        }
        return basePath;
    }

JAR 파일의 위치를 ​​돌려줍니다. 요청한 내용이 아닙니다.
user207421 2013 년

@EJP .jar 파일의 위치가 java 프로그램의 현재 작업 디렉토리가 아닙니까?
GOXR3PLUS

2

현재 작업 디렉토리는 Java 구현마다 다르게 정의됩니다. Java 7 이전의 특정 버전에서는 작업 디렉토리를 얻는 일관된 방법이 없었습니다. Java 파일을 시작 -D하고 정보를 보유 할 변수를 정의 하여이 문제를 해결할 수 있습니다.

같은 것

java -D com.mycompany.workingDir="%0"

맞지 않지만 아이디어를 얻습니다. 그럼 System.getProperty("com.mycompany.workingDir")...


6
질문과 관련이 없습니다.
Peter De Winter

1
Java에 의미가 있습니다. 상대 경로 이름으로 연 파일이 상대적인 디스크상의 위치입니다.
Rob I

2
예, 의미가 있습니다. 내 말은 다소 잘못 선택되었습니다. 자바 7 이전에 현재 작업 디렉토리를 알 수있는 방법이 없었습니다, 다른 구현은 ... 다른 ... 그들을 설정 -하지만 당신은 점을 놓칠
MJB

1

이클립스에서 프로젝트를 실행하거나 netbean을 실행하거나 명령 줄에서 독립한다고 가정하십시오. 문제를 해결하는 방법을 작성했습니다

public static final String getBasePathForClass(Class<?> clazz) {
    File file;
    try {
        String basePath = null;
        file = new File(clazz.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
        if (file.isFile() || file.getPath().endsWith(".jar") || file.getPath().endsWith(".zip")) {
            basePath = file.getParent();
        } else {
            basePath = file.getPath();
        }
        // fix to run inside eclipse
        if (basePath.endsWith(File.separator + "lib") || basePath.endsWith(File.separator + "bin")
                || basePath.endsWith("bin" + File.separator) || basePath.endsWith("lib" + File.separator)) {
            basePath = basePath.substring(0, basePath.length() - 4);
        }
        // fix to run inside netbean
        if (basePath.endsWith(File.separator + "build" + File.separator + "classes")) {
            basePath = basePath.substring(0, basePath.length() - 14);
        }
        // end fix
        if (!basePath.endsWith(File.separator)) {
            basePath = basePath + File.separator;
        }
        return basePath;
    } catch (URISyntaxException e) {
        throw new RuntimeException("Cannot firgue out base path for class: " + clazz.getName());
    }
}

사용하려면 파일을 읽을 기본 경로를 얻으려는 모든 곳에서 앵커 클래스를 위의 메소드에 전달하면 결과가 필요할 수 있습니다.

베스트,


2
JAR 파일의 위치를 ​​돌려줍니다. 요청한 내용이 아닙니다.
user207421 2013 년

@ user207421 예 나는이 답변이 질문에 대한 진정한 대답이 아니라는 것을 알고 있지만 대부분의 사람들은 "명령 줄 작업 디렉토리"대신 "jars가있는 디렉토리"를 원합니다.
bachden

0

여기에 게시 된 답변 중 어느 것도 나를 위해 일하지 않았습니다. 다음은 효과가있었습니다.

java.nio.file.Paths.get(
  getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
);

편집 : 내 코드의 최종 버전 :

URL myURL = getClass().getProtectionDomain().getCodeSource().getLocation();
java.net.URI myURI = null;
try {
    myURI = myURL.toURI();
} catch (URISyntaxException e1) 
{}
return java.nio.file.Paths.get(myURI).toFile().toString()

JAR 파일의 위치를 ​​돌려줍니다. 요청한 내용이 아닙니다.
user207421 2013 년

0

혼란의 순간이 떠 올랐을 때 이것은 내 총알입니다. (메인에서 가장 먼저 부르십시오). 예를 들어 JVM은 IDE에 의해 다른 버전이 될 수 있습니다. 이 정적 함수는 현재 프로세스 PID를 검색하고 해당 pid에서 VisualVM을 엽니 다. 당신이 모든 것을 원하고 당신이 그것을 얻기 때문에 혼란이 바로 거기에서 멈 춥니 다 ...

  public static void callJVisualVM() {
    System.out.println("USER:DIR!:" + System.getProperty("user.dir"));
    //next search current jdk/jre
    String jre_root = null;
    String start = "vir";
    try {
        java.lang.management.RuntimeMXBean runtime =
                java.lang.management.ManagementFactory.getRuntimeMXBean();
        String jvmName = runtime.getName();
        System.out.println("JVM Name = " + jvmName);
        long pid = Long.valueOf(jvmName.split("@")[0]);
        System.out.println("JVM PID  = " + pid);
        Runtime thisRun = Runtime.getRuntime();
        jre_root = System.getProperty("java.home");
        System.out.println("jre_root:" + jre_root);
        start = jre_root.concat("\\..\\bin\\jvisualvm.exe " + "--openpid " + pid);
        thisRun.exec(start);
    } catch (Exception e) {
        System.getProperties().list(System.out);
        e.printStackTrace();
    }
}


-7

이것은 현재 디렉토리 이름입니다

String path="/home/prasad/Desktop/folderName";
File folder = new File(path);
String folderName=folder.getAbsoluteFile().getName();

이것은 현재 디렉토리 경로입니다

String path=folder.getPath();

1
OP는 애플리케이션이 실행 된 현재 작업 디렉토리를 원했습니다.
Leif Gruenwoldt

이것은 아마도 당신의 것을 제외하고는 누군가의 현재 작업 디렉토리가 아닌 디렉토리입니다. 요청한 내용이 아닙니다.
user207421 2013 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.