김영한의 자바 강의를 통해 학습한 내용을 정리하였다.

▶︎ Moon.java
Class Moon {
public String name;
public static int count =0;
public Moon(String name) {
this.name = name;
count++;
}
}
▶︎ MoonMain.java
public class MoonMain {
public static void main(Stirng[] args){
Moon moon = new Moon(A); // moon 이라는 인스턴스를 생성하며 name을 A로 초기화.
System.out.println(A.count); // 1로 출력
}
}
Moon 이라는 클래스는 사용자가 인스턴스를 생성할 때 count 가 증가되는 생성자를 가지고 있는 코드이다. count 자체가 static 으로 선언 되었기 때문에 인스턴스 변수와 달리 메서드 영역의 클래스 안에서 값이 바뀌므로 이 후에 새로운 인스턴스를 생성해서 static 변수의 값에 변화를 주어도 전에 추가됐던 값에서 변경될 수 있다.
인스턴스 변수를 통해 값을 저장하거나 변경하려면 매번 인스턴스를 생성해야하고, 각 인스턴스마다 값이 개별적이다.
이러한 불편함을 static 을 통해 해결한다.
static 이 선언된 멤버 변수는 힙 영역 이 아닌 메서드 영역 에서 관리된다 (공용적인 부분? 으로 이해함). 따라서 static 변수는 클래스명.변수명 으로 접근이 가능하다.
우선 Static 메서드 는 Class명.Static 메서드명 으로 호출한다.
코드 초입에 import static Class명.Static 메서드명 을 선언하면 그냥 Static 메서드명 으로만 호출할 수도 있다.
인스턴스 메서드와 비교하기 위해 인스턴스 메서드를 먼저 살펴본다.
▶︎ ExInstance.java (인스턴스 메서드)
public class ExInstance {
public String exinstance(String str){
return result = "***" + str "***";
}
}
ExInstance 클래스 안에 exinstance 메서드가 실행되면 매개변수로 들어온 str 의 앞 뒤에 *** 이 붙어서 저장된다. 우리는 main 함수에서 exinstance 메서드를 사용하려면 ExInstance 인스턴스를 꼭 생성해야만한다. 아래와 ExMain.java 처럼 말이다.▶︎ ExMain.java
public class ExMain{
public static void main(String[] args) {
String a = "good morning";
Exinstance exinstance = new Exinstance();
String result = exinstance(a);
System.out.println(result);
}
}
객체 생성의 필요 없이 단순히 기능적인 부분(메서드)만 사용하기 위해 생성자를 생성하는 건 번거로운 작업이다. 그래서 Static 메서드 를 활용하면 훨씬 편리하다.
Static 을 활용한 메서드는 아래와 같다.
▶︎ ExStatic.java (스태틱 메서드)
public class ExStatic{
public static String exStaticMethod(String str){
return result = "***" + str "***";
}
}
▶︎ ExMain2.java
public class ExMain2{
public static void main(String[] args) {
String a = "good morning";
String result = ExStatic.exStaticMethod(a); // static 메서드는 "클래스명 + . + 메서드명"으로 호출함
System.out.println(result);
}
}
인스턴스 메서드 = Static 이 붙지 않은 멤버 메서드
클래스 메서드 = Static 이 붙은 멤버 메서드 (정적 메서드, static 메서드)
Static 메서드 안에서 Static 만 사용가능하다. 사실 당연한 게 인스턴스 변수와 인스턴스 메서드는 인스턴스를 생성한 후 해당 참조 값을 받아서 써야 하기에 메서드 영역 안에서는 사용할 수 없다.