클래스에서 객체는 여러개가 생성된다
클래스 맴버(필드,메소드)들을 객체마다 다 가지고있을 필요가 없다. (객체마다 필드값이 모두 다르다면 모두 포함해야됨)
중복되는 값이 모두 저장되어 있으면 메모리의 낭비가 된다.
이를 방지하기 위해 인스턴스 멤버와 정적 멤버로 구분하여 선언
객체마다 가지고 있어야 되는 데이터 - 인스턴스 멤버
공용 데이터 - 정적 멤버
인스턴스 멤버
객체마다 가지고있는 멤버
객체를 생성한 후 사용할 수 있는 필드와 메소드
- 객체 내부에서 인스턴스 멤버에 접근하기 위해 > this로 접근
public class Car {
int speed;
String model;
public Car(int speed,String model){
this.speed = speed;
this.model = model;
}
public void setModel(String model){
this.model=model;
}
}
- 외부 클래스에서 사용하기 위해 객체 생성 > 참조변수로 접근
public class Main {
public static void main(String[] args) {
Car car1 = new Car(60,"소형차");
car1.setModel("티코");
}
}
정적 멤버
클래스에 위치시키고 객체들이 공유하는 멤버
정적 멤버 선언 시 static 키워드 추가
정적 메소드 선언시 주의점 : 객체 없이 실행이 되기 때문에 정적 메소드 선언시 내부에 인스턴스 멤버 사용 불가
public class Car {
public static int speed;
static String model;
public static void setModel(String model){
System.out.println(model);
}
}
public class Main {
public static void main(String[] args) {
Car.setModel("소형차");
int mySpeed = Car.speed;
}
}
객체를 생성할 필요 없이 클래스 이름 . 으로 접근하여 바로 사용할 수 있다.
static을 사용하면 클래스이름. 으로 바로 접근할 수 있기 때문에 굉장히 편하고 효율적으로 보인다.
하지만 statice의 사용은 권장하지 않는다
statice의 사용을 권장하지 않는 이유
1. 전체 프로그램과 라이프 사이클이 동일하다
ㄴ static멤버는 사용을 하건 안하건 프로그램의 시작과 끝까지 메모리 내에 존재한다. - 메모리의 낭비
2. 전역변수로 만들어 어디서든 다 꺼내서 사용할 수 있다
ㄴ 객체의 데이터는 외부에서 접근이 불가능하게 만들어야하는 자바의 객체지향적 성격(캡슐화)에 어긋남
3. 문제가 발생한 경우 추적이 어렵다
ㄴ 어디서든 사용할 수 있기 때문에 문제가 발생한 지점을 찾기 어려움
static을 적당한 곳에 적당하게 사용하면 괜찮지만 무분별하게 사용할 경우 위의 문제가 발생할 수 있다
(처음에 java 언어를 사용할 때 전부 static을 썼었는데 공부 알려주시던 분이 굉장히 웃었던 경험이 있다..)
싱글톤
전체 프로그램에서 단 하나의 객체만 만들도록 보장
> private 접근 제한자사용
외부에서 호출 - getInstance 선언하여 정식 필드에서 참조하고있는 자신의 객체 리턴
public class Car {
private static Car car = new Car();
private Car(){
}
static Car getInstance(){
return car;
}
}
public class Main {
public static void main(String[] args) {
Car car1 = new Car();//오류
Car car2 = new Car();//오류
Car car3 = Car.getInstance();
Car car4 = Car.getInstance();
}
}
'Java' 카테고리의 다른 글
Java) final 키워드 (0) | 2022.12.17 |
---|---|
Java) 선언 위치에 따른 변수의 종류와 변수 이름 작성 (0) | 2022.12.14 |
Java) 문제 풀이 (0) | 2022.11.18 |
JAVA] 오버 로딩과 오버 라이딩 (0) | 2022.05.11 |
java] 클래스 - 메소드 (0) | 2022.04.18 |