왜 개인 정적 메소드가 있습니까?


68

방금 내가 가진 질문을 정리하고 싶었습니다. 개인 가시성이있는 일반적인 방법과 달리 개인 정적 방법을 사용하는 요점은 무엇입니까?

정적 메소드를 사용하면 클래스의 인스턴스없이 호출 할 수 있다는 장점이 있다고 생각했을 것입니다. 그러나 비공개이기 때문에 정적이라는 점이 있습니까?

내가 생각할 수있는 유일한 이유는 객체 수준이 아닌 클래스 수준의 방법을 개념적으로 이해하는 데 도움이되기 때문입니다.


32
예, 이유가 있습니다. 공개 / 기본 정적 메소드는 여전히 비공개 정적을 호출 할 수 있습니다. 정적 메서드를 사용해야하는지 여부와 모든 종류의 전용 메서드를 사용하는 것이 적절한 경우 별도의 질문이므로이 질문과 섞이지 않도록주의하십시오.

2
빠른 예-다른 클래스의 호출을 방지하는 내부 클래스에서 사용되는 팩토리 메소드 (클래스의 인스턴스를 가져 오기 위해 팩토리 메소드를 거쳐야 함).

2
@MattFenwick : 답변으로 게시해야합니다.
Doc Brown

9
메소드를 정적으로 만들면 인스턴스 변수를 읽거나 쓰지 않는다고 말하는 것입니다. 인스턴스 변수와 상호 작용하지 않는 방법은 종종 다른 곳으로 이동하고 리팩토링하기가 더 쉽습니다.
마크 로저스

1
정적 메소드가 개인, 내부 또는 공용인지 여부에 관계없이 특정 코드 동기화 노력 없이도 스레드로부터 안전하지 않다는 것을 잊지 마십시오.
Craig

답변:


70

정적 인 특성은 가시성과 무관합니다.

정적 메소드 (비 정적 멤버에 의존하지 않는 일부 코드)를 사용하려는 이유는 여전히 유용합니다. 그러나 어쩌면 당신은 다른 사람 / 다른 사람이 그것을 사용하기를 원하지 않을 것입니다.


3
나는 당신이 올바른 길을 가고 있다고 생각하지만, 요점을 놓치고 있다고 생각합니다. 대부분의 정적 메소드에는 부작용이 없습니다 (메소드가 아니라 실제로는 기능적임). 따라서 처음에는 정적이됩니다. 그들이 사적인 것이 아니라는 주장은 "부작용이 없다면 왜 코드 재사용을 장려하기 위해 공개하지 않겠습니까?"입니다. 그것이 핵심입니다. 우리가 그것을 비공개로 만들 때, 그것은 보통 그 메소드뿐만 아니라 그 프라이빗 메소드를 사용하는 전체 클래스재사용 하기를 원하기 때문 입니다.
corsiKa

나는 그런 짓을하지 않았거나 그 행동을 본 적이 없다고 말해야합니다. 내가 한 몇 번은 정적 메서드를 공개하는 도우미 메서드였습니다.
미야모토 아키라

1
@ corsiKa : 부작용은 문제가되지 않습니다. 클래스의 정적 멤버를 비공개로 설정하면 클래스의 모든 향후 버전에 동일한 이름의 동일한 방법을 포함하는 동일한 방법이 포함될 것이라고 효과적으로 약속합니다. 요구 사항이 변경되고 이후 버전의 클래스 에서 현재의 방식과 똑같이 작동하는 메소드가 필요하지 않은 경우 개인 메소드는 클래스의 새로운 요구를 더 잘 충족시키는 메소드로 안전하게 대체 될 수 있습니다. 간단한 예를 들어, 가정이 클래스는 문자열을 받아 같은 대체 수행하는 방법을 필요 <&lt;...이 기록 될 때 등,
supercat

1
...하지 알려진 전달되는 문자열이 어떤 앰퍼샌드를 포함하고,이 때문에 변환하지 않습니다 &&amp;[내가 코드를 작성했다, 나는 변환 줄 &&amp;나는 그것이 필요하지만 가정 기대하지 않은 경우에도 그렇지 않습니다]. 그것은 나중에 앰퍼샌드를 처리 할 필요가 있지만,이 방법은 확장 변경, 공개 &하는 &amp;자신의 수행 외부 코드를 깰 수 &Di의 &amp;대체를. 그러나이 메소드가 개인용 인 &경우 외부 코드에 문제를 일으키지 않고 처리하도록 수정 될 수 있습니다 .
supercat

가장 흥미로운 것은 흥미로운 문제이지만 정적이 아닌 것이 정적이 아닌 것보다 큰 문제가되는 것을 보지 못합니다.이 문제의 핵심입니다. 우리가 당신의 논리를 따르면, "omg, 언젠가 버그 나 요구 사항이 변경되면 어떻게 될까?"
corsiKa

26

(Java에서) 상당히 일반적인 이유는 private static생성자 클러 터를 줄이기 위해 간단한 방법을 사용하여 생성자에서 불변 필드 변수를 초기화하기위한 것 입니다.

  • 그것은이다 private: 외부 클래스를 볼 수 있습니다.
  • 이있다 static: 그것은 어떤 동작 독립적 수행 1 호스트 클래스의 상태.

다소 고안된 예는 다음과 같습니다.

예 :

public class MyClass{
    private final String concatenated;

    public MyClass(String a, String b){
        concatenated = concat(a,b);
    }

    public String getConcatenated(){
       return concatenated;
    }

    /**
    *  Concatenates two Strings as `s1---s2`
    **/
    private static final String concat(String s1, String s2){
        return String.format("%s---%s", s1, s2);
    }
}

1 다른 static변수 와 상호 작용이 없다고 가정합니다 .


15
파생 (계산 된) 인수를 수퍼 클래스 생성자에 전달해야 할 때 더욱 유용합니다. super(...)호출은 클래스 '생성자의 첫 번째 줄 수 있어야합니다, 그래서 당신은 당신이 슈퍼 호출에 전달하기 위해 무엇을 작업 할 수 있도록 로컬 변수를 선언 할 수 없습니다. 그러나 (비공개) 정적 메소드를 호출 할 수 있습니다.이 메소드는 수퍼 생성자에 전달할 값을 계산하는 데 필요한만큼 많은 행을 사용합니다.
Andrzej Doyle

정적 초기화 블록의 가능성이 있습니다.
Franz Ebner

13

private static메소드 의 일반적인 유스 케이스 는 다음과 같은 유틸리티 메소드입니다.

  1. 한 클래스에서만 사용
  2. 해당 클래스의 내부 상태와 무관

12

많은 메소드에서 반복되는 몇 줄의 코드가 있음을 알 수 있으므로 중복 코드가 좋지 않기 때문에 단일 메소드로 추출하기로 결정했습니다.

광범위하게 사용하도록 설계되지 않았기 때문에 메소드를 비공개로 설정하고 관련없는 코드를 호출하는 것을 원하지 않습니다. (의견에서이 점을 토론하십시오….)

이 메소드는 인스턴스 필드에 액세스하지 않으므로 정적으로 만들 수 있습니다. 정적으로 만들면 이해하기 쉽고 조금 더 빠를 수 있습니다.

그러면 .... (아마도, 나중에는, 어쩌면 결코)

일단 메소드가 정적으로 만들어지면, 클래스에서 다른 클래스로 이동할 수 있음 이 분명 합니다.

또한 매개 변수 중 하나의 인스턴스 메소드로 쉽게 변환 할 수 있습니다. 종종 코드가 있어야하는 위치입니다.


이 답변이 마음에 들지만 이에 대한 최신 정보가 있습니까? "아마도 더 빠를 수도있다"
Magnilex

@Magnilex, "this"포인터는 정적 클래스 메소드로 전달되지 않으므로 컴파일러가 "this"가 인스턴스 메소드에서 사용되지 않는다는 것을 발견하지 않는 한 정적 인스턴스 메소드보다 빠를 것입니다.
Ian

2

클래스에 정적 개인 메소드가 필요한 이유는 적어도 두 가지입니다.

1 : 인스턴스는 클래스의 모든 인스턴스간에 데이터를 공유하기 때문에 직접 호출하지 않으려는 정적 메소드를 호출 할 이유가 있습니다.

2 : 공개 정적 메소드에는 직접 호출하지 않으려는 서브 루틴이 있습니다. 이 메소드는 인스턴스가 아닌 직접 호출되지 않고 여전히 호출됩니다.

물론 "수업을 이해하는 데 도움이됩니다"는 그 자체만으로도 훌륭한 이유입니다.


1

일반적으로 개인 정적 메소드를 작성하는 것을 발견하면 별도로 모델링 해야하는 것이 있음을 나타냅니다.

그것들은 특정 객체 인스턴스의 상태에 묶여 있지 않기 때문에 public 및 private 정적 메소드 모음은 자체 의미 및 비 정적 메소드로 완전히 별도의 클래스를 형성 할 수 있습니다.

(또 다른 팁은 모든 유형의 공통 매개 변수가있는 정적 메소드 (공개 및 개인)가 많으면 해당 유형의 멤버로 더 나을 수 있다는 것입니다.)

따라서 귀하의 질문에 대답하기 위해 클래스가 해당 클래스의 인스턴스와 독립적 인 관련 메소드 그룹을 제공하면 개인 정적 메소드가 나타납니다. (... 그리고 그들은 독립적이기 때문에 자신의 수업에서 더 나을 수 있습니다.)


-1

내가 생각할 수있는 매우 간단한 예는 주 함수에 전달되는 입력 인수 (또는 조작)에 대한 처리를 수행하려는 경우입니다. 따라서이 경우 처리가 크고 동일한 기능을 다른 곳에서 사용하지 않으면 개인 기능을 갖는 것이 합리적입니다. 메인이 정적이므로 다른 곳에서 사용하거나 호출하지 않기 때문입니다.

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