변수와 마찬가지로, 메서드 앞에 static이 붙어 있으면 클래스 메서드이고, 없으면 인스턴스 메서드이다.
(클래스 영역에 선언된 변수를 멤버변수라 하고, 멤버변수 중 static이 붙은 것을 클래스 변수, 붙지 않은 것을 인스턴스 변수라 함. 인스턴스 변수와 static 변수 모두를 통칭하는 말이 멤버 변수!)
그럼 과연 static이 무엇일까? 무엇이길래 유무의 차이로 인해 정의가 바뀌는 것일까?
static은 '클래스의' 또는 '공통적인'의 의미를 가지고 있다.
인스턴스 변수는 하나의 클래스로부터 생성되었더라도 각기 다른 값을 유지하지만, 클래스변수(static멤버변수)는 인스턴스에 관계없이 같은 값을 갖는다. 이와 같은 이유는 하나의 변수를 모든 같은 인스턴스가 공유하기 때문이다.
static이 붙은 멤버변수와 메서드. 그리고 초기화 블럭은 인스턴스가 아닌 클래스에 관계된 것이라 인스턴스를 생성하지 않고도 사용이 가능하다는 점.
인스턴스메서드와 static메서드의 근본적인 차이는 메서드 내에서 인스턴스 멤버의 사용 여부에 있다.클래스 메서드도 클래스 변수와 동일하게 객체를 생성하지 않고도 '클래스이름.메서드이름(매개변수)'와 같은 식으로 호출이 가능하지만, 인스턴스 메서드는 반드시 객체를 생성해야만 호출이 가능하다.
1. 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것은 static을 붙인다.
2. 클래스 변수는 인스턴스를 생성하지 않아도 사용할 수 있다.
3. 클래스 메서드는 인스턴스 변수를 사용할 수 없다.
4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.
1) 인스턴스, 클래스 메서드 확인해보기
class Math {
long a, b;
//인스턴스 변수 a,b를 이용하므로 매개변수가 따로 필요 x
long add() {return a + b;}
//인스턴스 변수와 관계없이 매개변수만으로 작업을 수행
static long add(long a, long b) {
return a + b;
}
}
class Main {
public static void main(String[] args)
{
// 클래스메서드 호출 ==> 인스턴스 생성없이 호출 가능
System.out.println(Math.add(100L,200L));
// 인스턴스 생성
Math mm= new Math();
mm.a=200L;
mm.b=400L;
// 인스턴스 매서드는 객체를 생성 후에만 호출 가능
System.out.println(mm.add());
}
}
(코드를 작성해서 실행해보면 이해하기 더 편함.)
설명을 하고 넘어가자면 우선 메인 클래스와 Math 클래스를 만들어 주었다. 코드를 보면 인스턴스 메서드인 add()는 인스턴스 변수인 a와 b만으로 동작하기에, 매개변수를 필요로 하지 않아 괄호()에 매개변수를 선언하지 않았다.
반면에 add(long a, long b)는 인스턴스 변수없이 매개변수만 가지고 작업을 실행하기에 static을 붙여 클래스 메서드로 선언다. 그래서 클래스 메서드는 객체 생성 없이 바로 호출이 가능하고, 인스턴스 매서드는 인스턴스를 생성한 후에 호출이 가능했다.
제어자 | 대상 | 의미 |
static | 멤버변수 | - 모든 인스턴스에 공통적으로 사용되는 클래스변수가 됨. - 클래스 변수는 인스턴스를 생성하지 않고도 사용이 가능. - 클래스가 메모리에 로드될 때 생성 |
메서드 | - 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 됨. - static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없음. |
static 키워드를 사용한다는 것은 쉽게 말해 어떠한 값이 메모리에 한번 할당되어 프로그램이 끝날 때까지 그 메모리에 값이 유지되는 것인데, 어떠한 값을 공유해야 한다면 static을 사용하는 것이 좋을 수 있다.
이는 일반적으로 우리가 만든 클래스는 static 영역에 생성되고, 연산을 통해 생성된 객체는 Heap 영역에 생성된다. Heap영역의 객체들은 GC(Garbage Collector)에 의해 관리를 받지만 static 영역은 그렇지 않을뿐더러, 모든 객체가 공유하는 메모리이지만 자주 사용하게되면 프로그램 종료전까지 계속 메모리가 할당된 채로 존재해 성능상의 이슈를 가지고 올 수 있다.
인스턴스 메서드는 인스턴스 변수와 관련된 작업을 하는, 즉 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드이다. 그런데 인스턴스 변수는 인스턴스(객체)를 생성해야만 만들어지므로 인스턴스 메서드 역시 인스턴스를 생성해야만 호출할 수 있는 것이다.
'Language > Java' 카테고리의 다른 글
생성자(Constructor) (0) | 2022.01.21 |
---|---|
오버로딩(overloading) (0) | 2022.01.20 |
장독에 지식 채우기 (모를때마다 와서 추가)-(2022.01.17ver) (0) | 2022.01.17 |
Java의 이해(객체와 메모리) (0) | 2022.01.17 |
1) 객체 지향 프로그래밍 및 클래스 제작과 객체 생성 그리고 변수와 메서드) (0) | 2022.01.17 |