Java에서 선언과 정의의 차이점은 무엇입니까?


81

두 용어가 매우 혼란 스럽습니다. stackoverflow를 확인한 결과 C ++에는 비슷한 질문이 있지만 Java에는 해당되지 않습니다.

누군가 자바에 대한 두 용어의 차이점을 설명 할 수 있습니까?


2
선언은 최소 요구 사항이므로 다른 코드에서 호출하거나 참조 할 수 있습니다. 다른 코드를 컴파일 할 때 이것이 필요한 최소값입니다. 정의는 뭔가를하는 것은 한 번만 (안 발신자에 한 번) 컴파일해야하는 필요
피터 Lawrey

1
다음을 통해 기억할 수 있습니다 : 명확한, 지느러미 = 끝, "끝내기 위해"; de-clare, clarus = clear, "명확하게하기 위해". 선언은 존재, 유형 및 이름을 명확하게합니다. 정의는 "실제 작업"코드로 "그에 대해 이야기를 끝낼"수 있습니다. 그들은 언어에 구애받지 않고 사용되므로 Java가 이러한 일반적인 개념을 사용하는 것은 무엇입니까?
n611x007 2014 년

답변:


99

개념적 차이점은 간단합니다.

  • 선언 : 클래스, 함수 또는 변수와 같은 것이 존재한다고 선언 합니다. 그 클래스 나 함수가 어떻게 생겼는지 에 대해 아무 말도하지 않고 단지 존재한다고 말하면됩니다.

  • 정의 : 클래스, 함수 또는 변수와 같은 무언가가 구현되는 방식을 정의 합니다. 즉, 실제로 무엇인지 말합니다 .

Java에서는 둘 사이에 거의 차이가 없으며 공식적으로 선언에는 식별자뿐만 아니라 정의도 포함됩니다. 제가 개인적으로 용어를 자세히 해석하는 방법은 다음과 같습니다.

  • 클래스 : 자바는 C / C ++처럼 (헤더와 cpp 파일에서) 선언과 정의를 분리하지 않습니다. 선언하는 지점에서 정의합니다.

  • 함수 : 인터페이스 (또는 추상 클래스)를 작성할 때 정의하지 않고 함수를 선언한다고 말할 수 있습니다. 그러나 일반 함수는 항상 선언 된 위치에서 바로 정의됩니다. 원하는 경우 함수의 본문을 정의로 참조하십시오.

  • 변수 : 변수 선언 은 다음과 같습니다.

    int x;
    

    (변수 x가 존재하고 유형 이 있음을 선언합니다 int) 지역 변수 또는 멤버 필드 인 경우. 자바에 대해 남아있는 정보가 없다 x하는 정의 그것에 할당에 의해 결정됩니다 그것이 개최한다 어떤 값 수를 제외하고는.

용어를 사용하는 방법에 대한 대략적인 요약은 다음과 같습니다.

abstract class SomeClass {                // class decl.
                                          //                           \
    int x;                                // variable decl.            |
                                          //                           |
    public abstract void someMethod();    // function decl.            |
                                          //                           |
    public int someOtherMethod() {        // function decl.            |
                                          //                           | class
        if (Math.random() > .5)           // \                         | def.
            return x;                     //  |  function definition   |
        else                              //  |                        |
            return -x;                    // /                         |
                                          //                           |
    }                                     //                           |
}                                         //                          /

불행히도 이것은 JLS에서 지원하지 않습니다. JLS에 따르면 클래스 선언에는 클래스 본문이 포함됩니다. 메서드와 생성자에도 동일하게 적용됩니다.
스티븐 C

권리. 공식적인 관점에서 나는 귀하와 완전히 동의합니다 (추상 / 인터페이스 방법의 경우 제외).
aioobe

나는 이것이 자바 스크립트에도 적용된다고 생각합니다. JS 태그를 추가해야 할 수도 있습니다.
Griffin

의 코드에있는 식별자에 따르면 javac클래스 선언은 클래스 정의와 동의어 인 것 같습니다. 예를 들어 고려하십시오 public void visitClassDef(JCClassDecl tree).
aioobe

@Griffin-나쁜 생각. 질문은 특히 Java에 관한 것입니다.
Stephen C

28

Java 언어 사양은 "선언"이라는 용어를 광범위하게 지정하고 사용하지만 일반 영어 단어를 제외하고는 "정의"를 사용하지 않습니다.

내 증거는 "선언"이라는 용어가 JLS 목차와 색인에 여러 번 등장하지만 "정의"라는 단어는 어느 쪽에도 나타나지 않는다는 것입니다.

따라서 누군가가 Java의 맥락에서 "정의"라는 단어를 사용하는 것을 보면 비 기술적 인 의미로 사용하거나 용어를 엉성하게 사용하는 것입니다.

후자의 경우, 그들은 수있는 기술적 인 용어 "선언"과 같은 의미, 또는 다른 것을 의미 할 수 있습니다. 그리고 그들이 다른 것을 의미한다면, 그들이 무엇을 의미하는지 물어봐야합니다. 그들이 정의했다면 ... 충분히 공평하지만 표준 용어는 아닙니다.


"정의"가 변수가 초기화되는 지점을 지칭한다는 답변은 특히 Java의 맥락에서 지원할 수 없습니다. Java에서 변수 초기화는 선언 시점 또는 이후 할당에서 발생합니다. 후자의 경우 할당 및 / 또는 초기화와 별도로 특별한 용어가 사용되지 않거나 필요하지 않습니다. 변수에 대해 스토리지가 할당되는 지정된 지점이 없습니다. 실제로 선언에 도달 하기 전에 변수 자체에 대한 공간이 할당 될 가능성이 있습니다.


JLS 스펙에서 Java에서 "정의"용어가 사용되지 않는 이유는 필요하지 않기 때문입니다.

  • Java에서는 멤버를 순서에 관계없이 선언 할 수 있으므로 "앞으로 선언"할 필요가 없습니다. 그것이 두 개념을 구별 할 필요가있는 상황입니다.
  • Java에서 변수에 필요한 스택 공간은 컴파일 시간 상수이므로 스택 오프셋 계산은 컴파일 시간에 발생합니다. (Java에서 배열은 힙 객체에 대한 참조이며 참조 만 스택 프레임에 유지됩니다.)
  • Java가 필드 또는 변수의 "초기화없이 정의"를 처리하는 방식에는 단일 "선언"지점이 필요하지 않습니다. 변수 초기화가 필요한 경우 소스 코드의 여러 지점에서 발생할 수 있습니다.

(Java에서 선언 대 정의를 사용한 유일한 위치는 추상 메서드에 있습니다. 만약 그렇게했다면, 일관성을 위해 정규 메서드 선언을 정의로 참조해야했습니다 ... 혼란 스러울 것입니다. 그래서 그들은 "abstract"subcase를 추상 메소드의 선언이라고 부릅니다.)

C와 C ++는 이러한 것들을 다르게 처리하므로 기술적 설명에 뚜렷한 "선언"및 "정의"용어 필요합니다. "Sun Glossary"정의에 대한 필자는 C / C ++ 중심적이라는 것입니다.


7

로부터 일의 용어의 정의 :

선언 (declaration) : 저장소 (데이터 용)를 반드시 예약하거나 구현 (메소드 용)을 제공하지 않고 식별자를 설정하고 속성을 연관시키는 명령문.

정의 : 스토리지 (데이터 용)를 예약하거나 구현 (메소드 용)을 제공하는 선언.

내가 Sun 용어집을 읽는 방법은 다음과 같습니다.

List i;              // declaration - variable on the stack  
i = new ArrayList(); // definition - gives variable a reference

4
1) JLS는 두 번째 문장을 설명하기 위해 "정의"라는 용어를 사용하지 않습니다. 구문 적으로는 할당입니다. 의미 상 변수를 "초기화"하는 것으로 설명됩니다. 2) 두 번째 문은 선언이 아니므로 정의가 될 수 없습니다 ... "definition : A declaration that ..." . 3) 링크가 깨 ...
스티븐 C

링크 수정을 제안했습니다. 질문과 답변은 JLS에 대해 아무 말도하지 않습니다.
Matthew Read

4

1. 선언 수단 생성primitive or Object reference variable있지만 , 각각의 값 또는 객체의 할당 없음으로 ..

예 :

          int x;   // declaration of x of type int

          Cat myCat;  //  declaration of myCat an Object of type Cat

2. 정의는 값이나 객체를 할당하는 것입니다.

         int x = 5;

         Cat myCat = new Cat();

3. Method의 경우 다음과 같습니다.

public abstract void go();       // Method Declaration (Abstract method)

   public void go(){               // Method Defination

            // Your code      

    }

1
이 용어는 JLS에서 지원되지 않습니다.
스티븐 C

1
@Kumar Vivek Mitra-정의가 "int x = 5"이면 정의와 초기화의 차이점은 무엇입니까?
khan

@SSK 초기화 그래서 다음에 "제발"추가합니까 ... 귀하의 질문은 오히려 의심을 지우기보다는 도전의 많은 것 같다 ..... 반대 해상력과 반대입니다
쿠마 비벡 미트라

아, 그래 ... 캐시 시에라와 버트 베이츠에 의해 헤드 퍼스트 자바 시리즈 참조
쿠마 비벡 미트라

2

이 질문을 다음과 같이 더 잘 설명 할 수 있다고 생각합니다.

다음 시나리오를 생각해보십시오.

회사에 소프트웨어 엔지니어의 새로운 공석이 있습니다. 즉,이 직위를 채우기 위해 선택한 사람이 소프트웨어 엔지니어가 될 것입니다 (이 게시물에 대한 마케팅 담당자를 선택할 수 없음). 따라서이 게시물을 만드는 것은 선언과 유사합니다.

이제이 게시물을 가진 사람이 할 수있는 / 할 수없는 일, 그가 가진 권한, 제한 사항을 정의 할 때이를 정의라고합니다.

그래서 말

SoftwareEngineer se;

선언을 의미합니다.

class SoftwareEngineer {

// define role and responsibilities
}

정의를 의미합니다. 도움이 되었기를 바랍니다.


2

Java 언어는 정의를 사용하지 않고 용어 선언 만 정의합니다.

선언:

class A{}// class declaration

String str;// variable declaration

0

선언 (declaration) : 식별자를 설정하고 그 저장소 (데이터 용)를 예약하거나 구현 (메소드 용)을 제공하지 않고 속성을 연관시키는 문.

         or

         1. Declaration means creating a primitive or Object reference variable, 
         but with no assignment of value or object respectively..

정의 : 스토리지 (데이터 용)를 예약하거나 구현 (메소드 용)을 제공하는 선언입니다.

        or

         Defination is when we assign values or Object to them.

**Ex:** 
List i;              // declaration - variable on the stack  
i = new ArrayList(); // definition - gives variable a reference

-1
  1. 개체 또는 기본 요소

선언 : 객체 또는 기본 유형 지정

정의 : 객체 또는 기본 요소 의 지정

  1. 방법

선언 : 메서드 의 서명 지정

정의 : 방법 구현 지정

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.