Minwoo Dev.

[Java] static 메서드 본문

Java

[Java] static 메서드

itisminu 2024. 5. 10. 16:24
728x90
반응형
SMALL

일반적인 메서드

클래스 내부의 일반적인 메서드는 객체를 생성한 후에 그 객체를 통해 해당 기능을 실행한다.

public class test {
    public static void main(String[] args) {
        A a = new A(9);
        a.ShowVal();
    }

}

class A{
    private int val;
    public A(int val){
        this.val = val;
    }
    public void ShowVal(){
        System.out.println(this.val);
    }
}

 

예를 들어, 위와 같은 코드는 A라는 클래스를 통해 객체 a를 생성한 후, ShowVal() 메서드를 사용하고 있는 모습이다.

결과는 아래와 같다.

 

 

Java 특성상 일반적으로는 메서드가 클래스 내부에 존재하기에 객체를 생성하여 사용해야 한다.

 

  • 하지만 굳이 객체를 생성하여 값을 사용할 필요가 없을 경우에는 객체를 생성하여 메서드를 실행하는 일이 메모리상으로 비효율적인 일이 될 수 있다.
  • 즉, 객체 내부의 멤버변수(필드) 를 사용하여 특정 기능을 수행하는 메서드가 아니라면 그 메서드는 굳이 객체를 생성하여 실행해야할 필요가 없는 것이다.

 

 

이럴 때 사용하는 것이 static 메서드이다.

 

static 메서드

  • static을 사용하면 메모리에 딱 한번 할당된다.
  • 프로그램 종료 시까지 메모리 상에 사라지지 않고 존재한다.
  • 클래스 내부에 작성하지만 사실상 클래스 외부에 전역적으로 존재하는 것이다.

프로그램 시작과 함께 메모리상에 호출되기 때문에, 클래스를 통해 객체를 생성하지 않아도 사용할 수 있다.

 

그럼, 생기는 궁금증이 있을 것이다.

객체를 생성하지 않으면 이전처럼 객체의 이름으로 메서드를 호출할 수 없다. 
그럼 어떻게 static 함수를 호출해야 하는가 ?

그 답은 "클래스 이름"에 있다.

 

  • static 메서드는 클래스 이름으로 호출한다.
package chapter06;

public class test {
    public static void main(String[] args) {
        A a = new A(9);
        a.ShowVal();
        A.Hi(); // 클래스 이름을 통한 호출
        a.Hi(); // 객체를 통해서도 호출 가능!!
    }

}

class A{
    private int val;
    static void Hi(){
        System.out.println("HIIIII!!!");
    }
    public A(int val){
        this.val = val;
    }
    public void ShowVal(){
        System.out.println(this.val);
    }
}

 

위 코드에서는 static 메서드를 통해 HIIIIII!!! 를 출력하는 기능을 구현하였다.

 

static 메서드인 Hi()를 호출하기 위해 클래스 이름인 A를 사용하여 호출한 것을 볼 수 있다.

여기서 주의해야 할 점은 객체를 생성한 경우에는 객체 이름으로도 접근할 수 있다는 점이다!

 

 

 

우리가 많이 사용하는 기능 중에 이러한 static 메서드들이 정말 많다.

그 중 하나를 소개하겠다.

 

 

바로 Math 클래스이다.

우리가 흔히 Java 프로그램에서 절댓값을 사용하려고, 혹은 반올림을 사용하려고 Math.abs() 혹은 Math.round()를 사용했을 것이다.

코드를 통해 보자.

public class test {
    public static void main(String[] args) {
        double val = -5.23;
        val = Math.abs(val);
        System.out.println("Math.abs 실행 후 : "+val);
        val = Math.round(val);
        System.out.println("Math.round 실행 후 : "+val);
    }
}

 

 

위의 코드에서 Math.abs를 실행하기 위해서 Math maht = new Math()와 같은 형식으로 객체를 생성하였는가 ?

아니다.

그 이유는 abs()와 round() 같은 메서드가 모두 static 메서드이기 때문이다.

 

API Document의 Math.abs()

 

API Document의 Math.round()

 

 

모두 static이라고 표시된 것이 보이는가 ?

 

이것이 우리가 왜 Math 클래스의 메서드들을 사용할 때 객체를 생성하지 않고 사용할 수 있었는지이다.

 

실제로, Math 클래스의 거의 모든 함수들은 static으로 작성되어있다.

객체를 생성하여 멤버함수의 값을 사용할 필요없이, 인자로 받은 값만 연산하기 때문이다.

 

 

그럼 여기서 또 의문이 한가지 들 것이다.

 

객체를 생성할 필요가 없는데 왜 클래스로 만드는거지?

 

그 이유는 Java의 특성 때문이다.

Java는 C/C++과는 다르게 모든 함수(메서드)가 클래스 내부에 속해야한다.

그렇기 때문에 단순한 기능을 수행하는 함수여도 무조건적으로 클래스에 속한 상태여야 한다.

 

 

따라서 객체생성을 통해 멤버변수를 사용하기보단, 이러한 여러 기능들을 수행하는 함수들을 한곳에 묶어두기 위해서 클래스로 작성하는 것이다.

 

 

Math 클래스의 API Document의 링크를 남겨둘테니 참고 바란다.

 

Math (Java Platform SE 8 )

Returns the value of the first argument raised to the power of the second argument. Special cases: If the second argument is positive or negative zero, then the result is 1.0. If the second argument is 1.0, then the result is the same as the first argument

docs.oracle.com

 

728x90
반응형
LIST