programing

정적 메서드 사용 시기

prostudy 2022. 4. 25. 21:39
반응형

정적 메서드 사용 시기

언제 정적 방법을 사용해야 하는지 궁금하다.만약 내가 몇 명의 게이터와 세터가 있는 수업이 있다면, 방법이나 두 개의 방법이 있는데, 나는 그 방법들이 클래스의 인스턴스 객체에서만 호출이 가능하기를 원한다.정적인 방법을 써야 한다는 뜻인가?

예:

Obj x = new Obj();
x.someMethod();

... 또는:

Obj.someMethod(); // Is this the static way?

난 좀 헷갈려!

한 가지 요령: "아직 어떤 물체도 만들어지지 않았는데도 이 방법이라고 부르는 것이 말이 되느냐?"고 스스로에게 묻는다.만약 그렇다면, 그것은 확실히 정적이 되어야 한다.

그래서 수업시간에Car다음 방법이 있을 수 있다.

double convertMpgToKpl(double mpg)

비록 도 ...을...아무도 35mpg가 무엇으로 변환되는지 알고 싶어할 수 있기 때문에, 비록 아무도 그것을 만들지 않았더라도, 정적일 것이다.Car그러나 이 방법(한 가지 특정의 효율을 설정하는 방법)Car):

void setMileage(double mpg)

방법을 부르는 할 수 될 수 ...아무리 먼저 그 방법을 부르는 것은 상상도 할 수 없는 일이니 정적이 될 리가 없다.Car건설되었다.

(그런데, 그 반대가 항상 진실인 것은 아니다: 가끔 두 가지 방법이 있을 수도 있다.Car그리고 여전히 정적인 것을 원한다.예:

Car theMoreEfficientOf(Car c1, Car c2)

비록 이것이 정전기적이지 않은 버전으로 변환될 수 있지만, 몇몇은 "특권적인" 선택권이 없기 때문에 이런 것을 주장할 것이다.Car더 중요한 것은, 발신자에게 선택하라고 강요해서는 안 된다.Car원하는 대로 메소드를 호출하십시오.그러나 이러한 상황은 모든 정적 방법 중 상당히 작은 부분을 차지한다.

다음 시나리오에서만 정적 메서드를 정의하십시오.

  1. 만약 당신이 유틸리티 수업을 작성하고 있다면, 그것들은 변경되어서는 안 된다.
  2. 메서드가 인스턴스 변수를 사용하지 않는 경우.
  3. 인스턴스 생성에 종속되지 않는 작업이 있는 경우.
  4. 모든 인스턴스(instance) 방법으로 쉽게 공유할 수 있는 코드가 있는 경우 해당 코드를 정적 방법으로 추출하십시오.
  5. 메서드의 정의가 변경되거나 재정의되지 않을 것으로 확신하는 경우.정적 방법은 재정의할 수 없기 때문이다.

정적 방법을 사용해야 하는 몇 가지 타당한 이유가 있다.

  • 성능: 코드를 실행하려면 추가 개체를 인스턴스화하지 않으려면 정적 메서드에 삽입하십시오.JVM도 정적 방법을 많이 최적화할 수 있다(James Gosling은 정적 방법이 그만큼 빠를 것이지만 소스를 찾을 수 없기 때문에 JVM에서 사용자 지정 지침은 필요하지 않다고 선언하는 것을 읽은 적이 있는 것 같다).그렇다, 그것은 미시적 최적화일 뿐, 아마도 불필요할 것이다.그리고 우리 프로그래머들은 단지 멋지다고 해서 불필요한 일을 하지 않아, 그렇지?

  • 실용성: 전화 대신new Util().method(arg)부르다Util.method(arg)또는method(arg)고정 수입으로더 쉽고, 더 짧다.

  • 메서드 추가: 스트링 클래스에 다음 클래스가 필요함removeSpecialChars()인스턴스(instance) 방법, 그러나 해당 없음(그리고 그렇지 않아야 함, 프로젝트의 특수 문자가 다른 프로젝트의 문자와 다를 수 있으므로), 추가할 수 없음(Java가 다소 제정신이므로), 유틸리티 클래스를 만들고 호출하십시오.removeSpecialChars(s)대신에s.removeSpecialChars() 달콤하다.

  • 순도: 몇 가지 주의사항을 취하면, 당신의 정적 방법은 순수한 함수일 것이다. 즉, 그것이 의존하는 유일한 것은 매개변수일 뿐이다.데이터 입력, 데이터 출력.이것은 당신이 걱정해야 할 상속 문제가 없기 때문에 읽고 디버깅하는 것이 더 쉽다.인스턴스(instance) 방법으로도 할 수 있지만, 컴파일러는 인스턴스(instance) 속성에 대한 참조를 허용하지 않음, 메소드(reverriding) 등) 정적 방법으로 조금 더 많은 도움을 줄 것이다.

싱글톤을 만들려면 정적인 방법도 만들어야겠지만...그러지 마, 다시 생각해봐

자, 더 중요한 것은, 왜 정적인 방법을 만들고 싶지 않으냐는 겁니다.기본적으로 다형성은 창밖으로 나간다.방법을 무시할 수 없을 겁니다 그것을 인터페이스로 선언하지 않다. (Java 8 이전).그것은 당신의 디자인에서 많은 융통성을 빼앗는다.또한 상태가 필요한 경우 주의하지 않으면 많은 동시성 버그 및/또는 병목 현상이 발생할 수 있다.

미스코의 기사를 읽은 후 나는 시험적인 관점에서 정적 방법이 나쁘다고 믿는다.대신 공장이 있어야 한다(아마 구이스와 같은 의존성 주입 도구를 사용했을 것이다).

어떤 것을 하나만 가지고 있는지 어떻게 확신할 수 있는가?

오직 하나만을 가지고 있다. "어떻게 내가 오직 하나만을 가지고 있다는 것을 보장할 수 있는가"라는 문제는 잘 외면되어 있다.메인에서 ApplicationFactory 하나만 인스턴스화하고 결과적으로 모든 단골격의 단일 인스턴스만 인스턴스화하는 겁니다.

정적 방법의 기본적인 문제는 절차 코드라는 것이다.

정적 방법의 기본적인 문제는 절차적 코드라는 것이다.절차 코드를 어떻게 테스트해야 할지 모르겠다.단위 테스트에서는 응용 프로그램의 일부를 분리하여 인스턴스화할 수 있다고 가정한다.인스턴스화 중에 나는 실제 종속성을 대체하는 모의/친교와 의존성을 연결한다.절차 프로그램으로는 객체가 없으므로 "와이어"할 것이 없으며, 코드와 데이터는 분리되어 있다.

A staticmethod는 초기화하는 데 개체가 필요하지 않은 방법의 한 유형이다.눈챘어어 ?static에 사용된다.main자바에서 기능하십니까?프로그램 실행은 물체가 만들어지지 않고 거기서 시작된다.

다음 예를 고려해 보십시오.

 class Languages 
 {
     public static void main(String[] args) 
     {
         display();
     }

     static void display() 
     {
         System.out.println("Java is my favorite programming language.");
     }
  }

Java의 정적 메서드는 클래스에 속한다(그 클래스의 인스턴스가 아님).이들은 인스턴스 변수를 사용하지 않으며 일반적으로 매개변수로부터 입력을 받아 그에 대한 작업을 수행한 후 일부 결과를 반환한다.인스턴스(instance) 방법은 개체와 연관되며, 이름에서 알 수 있듯이 인스턴스(instance) 변수를 사용할 수 있다.

아니, 정적 방법은 인스턴스와 연관되어 있지 않고 클래스에 속해 있어.두 번째 예는 정적 방법이고, 첫 번째 예는 인스턴스 방법이다.

어떤 방법으로든 정적 키워드를 적용하면 정적 방법이라고 한다.

  1. 정적 방법은 클래스의 대상이 아니라 클래스에 속한다.
  2. 클래스의 인스턴스를 만들 필요 없이 호출되는 정적 메서드.
  3. 정적 방법은 정적 데이터 멤버에 액세스할 수 있으며 그 값을 변경할 수 있다.
  4. 정적 방법은 클래스 도트 정적 이름만 사용하여 액세스할 수 있다. 예: Student9.change();
  5. 클래스의 비정적 필드를 사용하려면 비정적 방법을 사용해야 한다.

//모든 개체의 공통 속성(정적 필드) 변경 프로그램.

class Student9{  
 int rollno;  
 String name;  
 static String college = "ITS";  

 static void change(){  
 college = "BBDIT";  
 }  

 Student9(int r, String n){  
 rollno = r;  
 name = n;  
 }  

 void display (){System.out.println(rollno+" "+name+" "+college);}  

public static void main(String args[]){  
Student9.change();  

Student9 s1 = new Student9 (111,"Indian");  
Student9 s2 = new Student9 (222,"American");  
Student9 s3 = new Student9 (333,"China");  

s1.display();  
s2.display();  
s3.display();  
}  }

O/P: 111 인도 BBDIT 222 아메리칸 BBDIT 333 중국 BBDIT

정적 메서드는 인스턴스와 연결되지 않으므로 클래스의 비정적 필드에 액세스할 수 없다.

메소드가 클래스의 필드(또는 정적 필드)를 사용하지 않는 경우 정적 메소드를 사용하십시오.

클래스의 정전기 이외의 필드를 사용하는 경우 정전기 방지 방법을 사용해야 한다.

정적 방법은 클래스에서 호출해야 하며 인스턴스(instance) 방법은 클래스의 인스턴스(instance)에서 호출해야 한다.하지만 그것이 현실에서 의미하는 바는 무엇인가?여기 유용한 예가 있다.

자동차 클래스에는 Accelerate()라는 인스턴스(instance) 방법이 있을 수 있다.자동차가 실제로 존재하기 때문에(구성이 완료된) 예시 방법이 될 경우에만 자동차 가속을 할 수 있다.

자동차 클래스에는 GetCarCount()라는 카운트 방식도 있을 수 있다.이렇게 하면 생성된 자동차(또는 건설된 자동차)의 총 수가 반환된다.만약 자동차가 건설되지 않았다면, 이 방법은 0을 반환하지만, 여전히 호출될 수 있어야 하고, 따라서 정적인 방법이 되어야 할 것이다.

클래스의 인스턴스 없이도 메서드에 액세스할 수 있으려면 정적 메서드를 사용하십시오.

사실, 우리는 클래스에 정적 속성과 방법을 사용한다. 우리가 프로그램의 일부를 사용하고 싶을 때는 프로그램이 실행될 때까지 그곳에 존재해야 한다.그리고 우리는 정적 특성을 조작하기 위해서는 정적 방법이 필요하다는 것을 알고 있다. 정적 방법은 인스턴스 변수의 일부가 아니기 때문이다.그리고 정적 방법이 없다면, 정적 속성을 조작하는 것은 시간이 많이 걸린다.

정적:Obj.someMethod

사용하다static메서드에 대한 클래스 수준 액세스 권한을 제공하려는 경우, 즉 메서드가 클래스의 인스턴스 없이 호출 가능해야 하는 경우.

정적 메서드는 개체에서 호출할 필요가 없으며, 이때 사용할 수 있다.예: 주()는 정적이며, 주()를 호출할 개체를 생성하지 않는다.

정적 방법과 변수는 자바에서 '글로벌' 기능과 변수의 제어된 버전이다.다음과 같은 방법으로 액세스할 수 있는 방법classname.methodName()또는classInstanceName.methodName()즉, 클래스의 인스턴스뿐만 아니라 클래스 이름을 사용하여 정적 방법과 변수에 액세스할 수 있다.

클래스는 정적인 것으로 선언될 수 없다(이해할 수 없기 때문이다. 클래스가 공개로 선언되면 어디서든 접속할 수 있다), 내부 클래스는 정적인 것으로 선언될 수 있다.

다음과 같은 경우 정적 방법을 사용할 수 있다.

  • 인스턴스(유틸리티 방법)에 대해 작업을 수행하지 않으려는 경우

    위의 몇 가지 대답에서 언급했듯이, 수 마일을 킬로미터로 변환하거나 화씨에서 섭씨로 그리고 그 반대로 온도를 계산한다.정적 방법을 사용하는 이러한 예에서는 힙 메모리에서 완전히 새로운 개체를 인스턴스화할 필요가 없다.아래를 고려하십시오.

    1. new ABCClass(double farenheit).convertFarenheitToCelcium() 
    2. ABCClass.convertFarenheitToCelcium(double farenheit)
    

    전자는 성능, 실용성을 호출하는 모든 방법에 대해 새로운 클래스 풋프린트를 생성한다.아래의 Math 및 Apache-Commons 라이브러리 StringUtils 클래스를 예로 들 수 있다.

    Math.random()
    Math.sqrt(double)
    Math.min(int, int)
    StringUtils.isEmpty(String)
    StringUtils.isBlank(String)
    
  • 한 사람은 간단한 기능으로 사용하고 싶어한다.입력을 정밀하게 통과하여 결과 데이터를 반환 값으로 얻는다.상속, 사물을 주입하는 것은 그림으로 나타나지 않는다.간결하고 읽기 쉽다.

참고: 정적 방법의 테스트 가능성에 반대하는 사람은 거의 없지만 정적 방법 또한 테스트할 수 있다!jMockit으로 정적 방법을 조롱할 수 있다.시험성.아래 예:

new MockUp<ClassName>() {
    @Mock
    public int doSomething(Input input1, Input input2){
        return returnValue;
    }
};

정적 메소드는 클래스 객체를 만들지 않고도 호출할 수 있는 자바에서의 메소드다.그것은 학급에 속한다.

우리는 인스턴스를 사용하여 호출될 필요가 없을 때 정적 방법을 사용한다.

나는 언제 정적 방법을 사용해야 하는지에 대한 좋은 설명을 발견했다.

방법을 정적으로 만들 것인가, 그렇지 않을 것인가를 결정하는 어렵고 빠르며 잘 쓰여진 규칙은 없지만, 경험에 근거한 관찰은 거의 없는데, 이는 방법을 정적으로 만드는 데 도움이 될 뿐만 아니라 자바에서 정적인 방법을 언제 사용할 것인가를 가르쳐 주는 데 도움이 된다.Java에서 메서드를 고정적으로 만드는 것을 고려해야 한다.

  1. 메서드가 개체 상태를 수정하지 않거나 인스턴스 변수를 사용하지 않는 경우

  2. 해당 클래스의 인스턴스를 만들지 않고 메서드를 호출하려는 경우.

  3. 방법은 정적일 가능성이 높으며, 예를 들어 공공 요인(인트 번호){}, 이 방법은 인수로 제공된 숫자에서만 작동한다.

  4. 효용 방법은 정적인 방법일 수도 있다.StringUtils.isSempty(String text), 이것은 문자열이 비어 있는지 여부를 확인하는 유틸리티 방법이다.

  5. 만일 방법의 기능이 클래스 계층 구조에서 정적으로 유지된다면, 예를 들어 등가() 방법은 모든 클래스가 평등을 재정의할 수 있기 때문에 정적을 만드는 좋은 후보가 아니다.

출처가 여기에 있음

정적 방법은 크게 두 가지 목적을 가진다.

  1. 개체 상태가 필요하지 않은 유틸리티 또는 도우미 메서드.인스턴스(instance) 변수에 액세스할 필요가 없으므로 정적 방법을 사용하면 호출자가 메소드를 호출하기 위해 개체를 인스턴스화할 필요가 없어진다.
  2. 카운터와 같이 클래스의 모든 인스턴스가 공유하는 상태.모든 인스턴스는 동일한 상태를 공유해야 한다.단지 그 상태를 사용하는 방법 또한 정적이 되어야 한다.

일식에서는 잠재적인 정적 방법을 탐지하는 데 도움이 되는 경고를 활성화할 수 있다. ( 강조 표시된 선 위는 내가 강조 표시하지 않은 또 다른 선)

일식 설정

언제 정적 방법을 사용해야 하는지 궁금하다.

  1. 의 일반적인 용법.static방법은 접근하는 것이다.static들판
  2. 하지만 당신은 가질 수 있다.static는방법이다.static변수들참조 없는 도우미 메서드static변수는 java.properties와 같은 일부 자바 클래스에서 찾을 수 있다.수학

    public static int min(int a, int b) {
        return (a <= b) ? a : b;
    }
    
  3. 다른 사용 사례에서는 이 방법들이synchronized방법은 다중 스레드 환경에서 클래스 레벨 잠금을 구현하는 것이다.

만약 내가 몇 명의 게이터와 세터가 있는 수업이 있다면, 방법이나 두 개의 방법이 있는데, 나는 그 방법들이 클래스의 인스턴스 객체에서만 호출이 가능하기를 원한다.정적인 방법을 써야 한다는 뜻인가?

클래스의 인스턴스 개체에서 메서드에 액세스해야 하는 경우 메서드는 정적이 아니어야 한다.

Oracle 설명서 페이지에는 자세한 정보가 제공됨

인스턴스(instance)와 클래스 변수 및 방법의 모든 조합이 허용되는 것은 아니다.

  1. 인스턴스(instance) 방법은 인스턴스(instance) 변수와 인스턴스(instance) 방법에 직접
  2. 인스턴스(instance) 메서드는 클래스 변수와 클래스 메서드에 직접 액세스할 수 있다.
  3. 클래스 메소드는 클래스 변수와 클래스 메소드에 직접 액세스할 수 있다.
  4. 클래스 메서드는 인스턴스(instance) 변수나 인스턴스(instance) 메서드에 직접 액세스할 수 없으므로 객체 참조를 사용해야 한다.또한 클래스 메소드는 이 키워드를 참조할 수 있는 인스턴스가 없기 때문에 이 키워드를 사용할 수 없다.

코드에서 메서드를 호출하는 개체를 만들지 않으려면 해당 메서드를 정적 메서드로 선언하십시오.정적 방법은 호출할 인스턴스를 필요로 하지 않지만 여기서의 캐치가 모두 JVM에 의해 자동으로 호출되는 것은 아니기 때문이다.이 특권은 주() "공용 정적 보이드 주[스트링...]만 누린다.Runtime에서 JVM이 코드 실행을 시작하기 위한 진입점으로 추구하는 Signature public "static" void main[] 방법이기 때문에 args]" 방법.

예:

public class Demo
{
   public static void main(String... args) 
   {
      Demo d = new Demo();

      System.out.println("This static method is executed by JVM");

     //Now to call the static method Displ() you can use the below methods:
           Displ(); //By method name itself    
      Demo.Displ(); //By using class name//Recommended
         d.Displ(); //By using instance //Not recommended
   }

   public static void Displ()
   {
      System.out.println("This static method needs to be called explicitly");
   }
} 

출력:- 이 정적 방법은 JVM에 의해 실행됨 이 정적 방법을 명시적으로 호출할 필요가 있음 이 정적 방법을 명시적으로 호출할 필요가 있음 이 정적 방법을 명시적으로 호출할 필요가 있음

참조URL: https://stackoverflow.com/questions/2671496/when-to-use-static-methods

반응형