개체 매개변수 재지정

제 시리즈로 돌아온 것을 환영합니다. 여기서 저는 여행 중에 만났던 자바의 작은 괴벽과 장애를 되돌아봤습니다.이 부분에서 나는 내가 애써 생각한 개념을 토론할 것이다. 그것이 바로 매개 변수 변수를 재분배하는 것이다.나는 특히 대상 파라미터를 재분배하는 것을 가리킨다. 왜냐하면 가변성의 개념은 비원시 데이터 형식에만 적용되기 때문이다.
나는 내가 하려고 했던 일을 묘사하는 것부터 시작할 것이다. 잠시 후에 나는 왜 그것이 작용하지 않는지 설명할 것이다.

문제.💢


한동안 나는 방법에서 대상을 다시 분배하는 것이 좋은 생각이라고 생각했다.나는 똑똑해지려고 했지만 자바는 협조하고 싶지 않았다.이 방법은 대체로 이렇다.

public static void process(Contact[] arr) {

    Contact[] result;
    boolean condition;

    //traverse the array 
    int i = 0;
    for (String element: arr) {

        condition = someCriteria(element);

        if (condition) {

            result[i] = element; 
            i++;

        } // if

    } // loop

    arr = result;

} // remove method

public static void main(String[] args) {


    Contact[] mydata = readInContacts();
    process(mydata);
}

언뜻 보면, 너는 이 코드가 완벽하다고 느낄 수도 있다. 어쨌든 그것은 내가 쓴 것이다😏. 이 프로그램은 CSV 파일에서 텍스트를 읽고 연락처 객체를 만듭니다.그리고 나서 나는 연락처 대상의 목록을 가져와서 그것들로 그룹을 만들었다.나의 목표는 불순한 방법 process() 을 만드는 것이다. 이것은 특정한 표준에 부합되는 그룹의 대상을 필터할 수 있다.그 목적은 서로 다른 크기의 새 그룹을 만들고 이 그룹을 매개 변수에 분배하는 것이다. 이것은 원시 매개 변수에 이러한 변경을 할 것이라고 생각하는 것이다.코드가 실행될 때 매개 변수는 변하지 않습니다.
너는 그것의 잘못을 찾아내려고 시도해 볼 수 있지만, 나는 그것이 정말 자바에 대해 철저하게 이해하지 않으면 의미가 없다고 생각한다.오류는 코드 하단의 세 번째 행arr = result에 나타납니다.매개 변수 변수를 다시 분배할 때 매개 변수 변수를 변경하지 않는다는 것을 설명해 드리겠습니다.자바는 오류를 던지거나 불법이라고 알려주지 않습니다.너는 그곳에서 묵묵히 참고 논리와 너의 인코딩 능력을 의심하기만 하면 된다.
그래서 분명히 말하고 싶은데...

public static void modify(int[] args) {

    data args = new int[]

}

public static void main(String[] args) {

    int[] myarr = new int[] {1,2,3,4,5,6};


    modify(myarr);
    System.out.println(Arrays.toString(myarr)); // [1,2,3,4,5,6,7]

    myarr = new int[] {1,2,3}
    System.out.println(Arrays.toString(myarr)); // [1,2,3]
}

modify 방법은 myarr 수조에 대해 어떠한 변경도 하지 않습니다. 방법 내부에서 파라미터를 재분배할 수 없기 때문입니다.
참고:📋 계속하기 전에 변덕스러운 개념을 익히고 싶을 수도 있다.순수한 방법과 불순한 방법 사이의 차이를 알면 충분하다.

매개변수와 매개변수


나는 비록 그것들은 같은 것이 아니지만, '매개 변수' 와 '매개 변수' 두 단어를 서로 바꾸어 사용할 수 있다는 것을 자주 듣는다.혼동을 피하기 위해서, 나는 매개 변수, 매개 변수를 정의하고, 그것들을 구분하는 데 도움을 줄 것입니다.
매개 변수는 변수 데이터 형식의 값을 저장하고 방법에 전달하는 변수입니다.매개 변수는 매개 변수의 별명이나 복사본입니다. 만약 매개 변수가 인용 데이터 형식이라면, 매개 변수를 전달하는 방법의 범위 내에서 조작할 수 있습니다.

만약 우리가 이greet 방법을 호출하고 매개 변수name를 전달한다면 greet(name)처럼 name는 전달greet 방법의 매개 변수라고 할 수 있다.aName가 바로 우리가 말한 매개 변수다.매개 변수로greet을 호출할 때마다 aName 이 매개 변수의 값을 받아들일 것입니다.매개변수와 매개변수는 독립된 솔리드입니다.매개변수는 매개변수를 사용하는 방법의 범위 내에서만 사용할 수 있는 임시 별칭입니다.
팁:💡 좋은 방법은 매개 변수 이름 앞에 'a' 접두사를 붙여서 매개 변수 변수를 명명하는 것이다.누가 코드를 읽든지 간에, 그것은 어떤 변수가 매개 변수이고, 어떤 변수가 매개 변수이며, 어떤 매개 변수가 어떤 매개 변수에 분배되는지 추적하는 데 도움이 된다.
매개 변수는 변수와 마찬가지로 기원 데이터 형식일 수도 있고 인용 데이터 형식일 수도 있다.Java는 각 상황에서 그것들을 처리하는 방식이 다르다.

매개변수가 기본 매개변수인 경우


파라미터가 원시 데이터 형식일 때 자바는 메모리에 파라미터 값의 단독 복사본만 만들 수 있습니다.

이 예에서 매개변수와 매개변수는 독립된 솔리드입니다.매개변수aName가 어떤 식으로든 변경될 경우 매개변수에는 영향을 주지 않습니다.주소 A의 값이 변경되면 주소 B의 값에는 영향을 주지 않습니다.

매개변수가 기본이 아닌 경우(참조 데이터 유형)


인용 데이터 형식을 처리할 때 변수는 그에게 분배된 대상을 저장하지 않고 포인터를 저장합니다. 이 포인터는 대상이 메모리에 저장된 주소를 가지고 있습니다.
매개변수가 참조 데이터 유형인 경우 Java는 메모리에 객체의 개별 복사본을 만들지는 않지만 포인터 매개변수의 개별 복사본을 만듭니다.

바로 우리가 처리하는 것이 지침이기 때문에 우리는 가변적인 힘을 가지고 있다.두 포인터가 메모리에 있는 동일한 주소(객체)를 가리키고 한 포인터가 변경되면 다른 포인터가 이러한 변경 사항을 반영합니다.이것은 매개 변수가 인용하는 대상의 속성을 바꾸면 매개 변수가 인용하는 대상이 이러한 변경 사항을 반영한다는 것을 의미한다.매개 변수와 매개 변수가 같은 대상 메모리에 있는 같은 대상을 가리키기 때문이다.
다시 말하면 파라미터 변수arr가 주소 A에서 인용한 수조를 변경하면 파라미터myarr도 같은 대상을 인용했기 때문에 이러한 변경이 있을 것이다.
그러나...매개변수를 새 객체에 함께 지정하여 매개변수가 가리키는 주소를 변경하기로 결정한 경우 매개변수와 매개변수는 동일한 객체를 가리키지 않습니다. 즉, 매개변수는 별도의 솔리드가 되므로 변경 내용 중 하나에 영향을 주지 않습니다.객체 매개 변수를 재할당하면 매개 변수가 가리키는 주소가 변경됩니다.

만약 우리가 파라미터 arr 를 주소 B에 저장된 새로운 그룹에 분배한다면, 우리는 파라미터를 변경해서 파라미터를 변이하거나 변경할 수 없습니다.

솔루션💡


나는 이 문제를 해결할 많은 방법이 있는데, 이것은 구체적인 상황에 달려 있다.필터된 그룹을 되돌려주고 filter() 문법으로 결과 파라미터를 저장해서 파라미터에 저장해야 합니다.나는 이것이 가장 우아한 해결 방안이 아니라는 것을 알고 있지만, 나는 시간이 촉박하다.실제로, 나는 링크드 리스트를 사용해야 한다. 왜냐하면 이렇게 하면, 나는 매개 변수에 object = object.method().add() 방법을 사용하여 목록의 대상을 추가하고 삭제할 수 있기 때문이다. 이것은 매개 변수를 바꾸는데, 이것은 매개 변수를 다시 분배할 필요가 없다는 것을 의미한다.또는, 나는 전역 변수를 설명할 수 있다. 나는 어떤 방법에서든 그것을 조작할 수 있다. 그러면 파라미터와 파라미터가 관심 있는 대상을 인용할 필요가 없다.

요약


방법에서 파라미터 변수에 대한 어떠한 변경도 원시 파라미터를 바꿀 수 있으며, 전제는 그들이 데이터 형식을 인용하는 것이다.이것은 매개 변수와 매개 변수가 메모리의 같은 대상을 가리키기 때문이다.매개 변수 변수를 재지정할 때 메모리에서 참조하는 객체를 변경하고 있으므로 매개 변수를 변경하지 않습니다.
변하기 쉬운 개념은 매우 강하다. 그것이 어떻게 작동하는지, 그리고 그것을 언제 사용하는지 알면.변형성은 우리가 더욱 직관적이고 이해하기 쉬운 코드를 만들 수 있게 한다..remove()는 초보자에겐 sort(list)보다 해석이 쉽다.내가 만난 이 문제는 단지 그 중의 한 구석의 사례일 뿐이니, 나는 더욱 잘 해석할 수 있다고 생각한다.이것은 나에게 많은 시간을 절약할 것이다.
예전과 같이 당신의 읽기와 유쾌한 인코딩에 감사 드립니다💻!

좋은 웹페이지 즐겨찾기