Programming/Java

[Java] 정적(Static) 변수와 메서드란? (개념 / 사용 장 단점 / 사용 시기 / 예제)

JeongKyun 2022. 1. 20.
반응형

서론

객체언어에서 사용되는 static과 인스턴스의 변수 및 메서드의 내용을 정리해보려한다. 해당 내용은 기초적인 내용이지만 자세히 인지하지 못하고 넘어갈 수 있는 부분이기에 초기에 잘 잡고 가는 것이 좋을 것같다.

 


 

https://stackoverflow.com/questions/62617296/alternatives-to-invoking-instance-method-on-static-variable-method

 

** Static 메서드와 Instance 메서드 개념 **


Static 메서드란? (클래스 메서드)

  • 객체 생성 없이 "클래스.메서드()" 형태로 호출 하는 방식.
  • 인스턴스 멤버와 관련 없는 작업을 하는 메서드이다.
  • 메서드 내에서 인스턴스 변수를 사용할 수 없다.

 

Static 사용의 장점

  1. 메모리를 효율적으로 사용이 가능하다.

 > 생성할 때 마다 인스턴스가 힙에 올라가는 것이 아닌 고정 메모리 이므로 보다 효율적이다.

  2. 속도가 빠르다.

 > 객체를 생성하지 않고 사용하기 때문에 속도가 빠르다는 이점이 있다.

 

Static 사용의 단점

  1. 무분별한 static의 사용은 메모리 유수(Leak)의 원인이 된다.

 > 프로그램 종료 시점에 메모리를 반환하는 속성이 있어

    GC(Garbage collection) 대상이 아니기 때문이다.

  2. 재 사용성이 떨어진다.

 > 정적인 값이기때문에 interface를 구현하는데 사용될 수 없다.

 


 

인스턴스(Instance) 메서드란


  • 인스턴스 객체를 생성 후 "인스턴스변수.메서드()" 형태로 호출하는 방식.
  • 인스턴스 멤버와 관련된 작업을 하는 메서드이다.
  • 메서드 내에서 인스턴스 변수를 사용할 수 있다.

 

Instance 사용의 장점

  1. 재 사용성이 좋다.

 > 언제든지 변할 수 있는 동적인 값이기에 재사용하기 좋다.

  2. 필요에 따라 여러 인스턴스 객체를 생성하여 분리해서 사용할 수 있다.

 > 인스턴스 객체를 갯수 제한없이 사용 가능 하기에 분리성이 좋다.

 

Instance 사용의 단점

  1. 리소스를 많이 잡아먹는다.

 > 사용하기 위해선 인스턴스 객체를 new로 생성해줘야하는데 생성할 때 마다

    해당 크기만큼 리소스를 잡아먹기 때문이다.

 


 

사용 예제


class Math1 {

    //인스턴스 변수
    int a,b;
    
    // 인스턴스 메서드
    int add(){
    	return a + b;
    }
    
    //static 메서드
    static int add(int a, int b){
    	return a + b;
    }
}


class Main {

	public static void main(String args[]) {
    	
        //static 메서드(클래스 메서드) 호출 => 객체 생성 없이 호출 가능
    	System.out.println(Math1.add(200,100);
                        
        
        //인스턴스 생성
        Math1 mt1 = new Math1(); 
        mt1.a = 200;
        mt1.b = 100;
        
        //인스턴스 메서드 호출
        System.out.println(mt1.add());
    }
}

 


 

그렇다면 언제 Static을 붙여서 사용하면 될까? (static 사용 시기)

우리가 흔히 쓰는 Card라는 클래스를 만들어 예제로 확인해보자.

 

변수 예제)

class Card{

    /* 인스턴스 변수 (개별 속성) */
    String kind; //카드 종류    
    int number; //카드 번호
    
    
    /* 클래스변수 (공통 속성) */
    static int width = 150; //폭
    static int height = 300; //높이
    
}

 

개별 속성을 부여해야 하는 카드 종류와 번호의 변수는 인스턴스 변수로 생성을 하고

클래스 내부에서 공통으로 정해져있는 정적인 값을 사용하는 변수는 static으로 사용했다.

 

이와 같이 정적으로 사용하는 변수는 static을 사용하면 된다.

 

마지막으로 메서드를 사용할 때는 어떤지 한번 예제로 확인해보자.

 

메서드 예제)

class StaticStudyClass{

    void instaceMethod() {} //인스턴스 메서드 생성
    static void staticMethod() {} //static 메서드 생성
    
    //인스턴스 메서드
    void instanceMethodCall(){
    	instanceMethod(); //호출 O
        staticMethod(); //호출 O
    }
    
    //Static 메서드
    static void staticMethodCall() {
    	instanceMethod(); //호출 X (에러 발생 => static메서드는 객체를 생성하지 않기때문에 인스턴스 메서드를 사용할 수 없다.)        
        staticMethod(); //호출 O
    }
    
}

 

위의 예제에서 두개의 포인트만 잡으면 될 것 같다.

 

1. 인스턴스 메서드는 왜 모두 호출이 될까?

=> 인스턴스 메서드를 호출할려면 이미 어딘가에선 해당 클래스를 인스턴스 객체를 생성해 놓았으니 해당 클래스의 모든 부분을 참조 및 호출 할 수 있는것이다.

 

2. static 메서드는 왜 인스턴스 변수를 호출하지 못할까?

static의 개념을 생각해보면 객체를 생성하지 않는다. 이다. 이 개념을 잘 생각해보면 다른 클래스의 인스턴스 객체를 생성하지 않은 상태에서 인스턴스 메서드를 호출하면 에러가 나는 것이 당연하다. 여기서 가장 중요한 것은 인스턴스 객체의 생성 여부이다.

 


 

내용 정리 QnA ( 이것만 풀 수 있다면 내용 이해 끝 ! )

Q. static 메서드에서 static 메소드 호출이 가능할까?

A. Yes

Reason : static끼리는 객체없이 서로 호출이 가능하기 때문이다.

 

Q. static 메서드에서 인스턴스 변수 사용이 가능할까?

A. No

Reason : Static메서드는 객체를 생성하지않고 사용하고 인스턴스는 객체를 생성해야 사용할 수 있는데, static 메서드에서 인스턴스 변수를 사용할 경우 객체가 생성되어있지 않을 수 있기 때문이다.

 

Q. static 메서드에서 인스턴스 메서드 호출이 가능할까?

A. No

Reason : Static메서드는 객체를 생성하지않고 사용하고 인스턴스는 객체를 생성해야 사용할 수 있는데, static 메서드에서 인스턴스 메서드를 사용할 경우 객체가 생성되어있지 않을 수 있기 때문이다. (위와 동일 개념)

댓글

💲 많이 본 글