클래스를 이루고 있는 것은 필드, 생성자, 메서드 이다.
이중 필드와 메서드를 멤버 라고 표현한다.
인스턴스 멤버는 객체를 생성해야 사용할 수 있으며, 각각의 인스턴스 필드는 고유한 값을 가진다.
그렇다고 객체가 인스턴스화 할때마다 그 메서드들이 모두 다 그 객체에 포함되는 것은 아니다.
일단 메모리 적으로도 효율이 안좋아 질 뿐더러 한 곳에 메서드 하나만을 올려놓고 인스턴스들이 그 공간에 들러서 공유하여 사용하는 것이라고 이해하면 된다.
클래스 멤버는 static 키워드를 사용하여 만들고, 객체 생성없이 바로 사용이 가능하다.
인스턴스마다 각자 가지고 있을 필요가 없는 공용적인 데이터를 저장하는 필드를 클래스 멤버로 선언한다.
⚠️주의!
클래스 멤버로 선언한 메서드는 인스턴스 멤버를 사용할 수 없고,
인스턴스 멤버로 선언된 메서드는 클래스 멤버를 사용할 수 있다.//Car클래스 String model = "Audi" static String company = "GENESIS"; // 자동차 회사 : GENESIS String getCompany() { return "(주)" + company; } //와 같이 인스턴스 메서드 안에 클래스 멤버 사용이 가능하지만 static String setCompany(String companyName) { // System.out.println(model); }// 클래스 메서드에서는 인스턴스 멤버를 사용할 수 없다.
클래스의 멤버 사용은 위에 말한것과 같이 객체 생성없이 바로 사용이 가능하다는 장점이 있다.
//Main클래스
Car.company = "Audi";
String companyName = Car.setCompany("Benz");
Car car = new Car(); //참조형 변수를 사용한 객체생성
car.company = "Ferrari";
//이와같이 참조형 변수를 사용해서도 접근이 가능하지만 추천하지 않는다.
메서드 내부에서 선언한 변수를 의미하며 전역변수와 반대되는 개념이다.
휘발성이 있는 변수로써 메서드가 실행될 때마다 독립적인 값을 저장하고 관리하며, 메서드가 종료될 때까지만 유지된다.
public int getNumber() {
int number = 1; // 지역 변수
number += 1;
return number; // 메서드 종료되면 지역변수 제거됨
} //이 메서드를 호출하면 계속 2라는 값만 나옴.
final은 최종적이라는 의미로 이전 변수에서 나왔던 상수의 개념을 다시한번 정리해보도록 하겠다.
이에 따른 상수를 선언할 때 static final을 함께 추가하면 모든 인스턴스가 공유할 수 있는 값이 하나이며 불변인 상수를 선언할 수 있다.
또한 상수는 대문자로 작성하는 것이 관례이다.