Student.java
public class Student{
public static int studentClass =1; // 1로 공유되는 static 변수
}
StudentTest.java
public class StudentTest {
public static void main(String[] args) {
System.out.println(Student.studentClass); //1
Student.studentClass++;
System.out.println(Student.studentClass); //2
Student lee= new Student();
System.out.println(lee.studentClass); //2
}
}
Student.java
public class Student{
public static int studentClass =1; // 1로 공유되는 static 변수
public String studentName; //멤버 변수 선언
public static int getStudentClass(){
return studentClass;
}
public static void setStudentClass(int studentClass){
// studentName ="lee";//오류: 멤버변수 사용불가
Student.studentClass=studentClass; //this도 사용불가
} //클래스 이름 자체로 접근하고 있다.
}
StudentTest.java
public class StudentTest {
public static void main(String[] args) {
System.out.println(Student.getStudentClass()); //1
Student.setStudentClass(100);
System.out.println(Student.getStudentClass()); //100
}
}
- static 블럭:
static {}
을 이용하면 main 메소드 보다 먼저 실행되는 영역을 만들 수 있다.
- 학생 객체는 많이 필요하지만 학교 객체는 하나만 존재해야 한다.
- 직원 객체는 많이 필요하지만 회사 객체는 하나만 존재해야 한다.
1 . School 클래스의 생성자를 private으로 만들어 접근할 수 없게 한다.
School.java
class School {
private School() {} // private 생성자 생성
}
2 . 하나의 private static 인스턴스를 선언한다.
School.java
class School {
private School() {} // private 생성자 생성
private static School instance;
}
3 . getInstance() 메소드를 만들어 하나의 객체만 존재하게 한다.
School.java
class School {
private School() {} // private 생성자 생성
private static School instance;
public static School getInstance() {
if(instance==null) {
instance = new School();
}
return instance;
}
}
4 . 싱글톤 패턴이 잘 동작하는지 실행해본다.
SchoolTest.java
public class SchoolTest{
public static void main(String[] args) {
School school1 = School.getInstance();
School school2 = School.getInstance();
System.out.println(school1 == school2); // true
}
}
CarFactoryTest.java
public class CarFactoryTest {
public static void main(String[] args) {
CarFactory factory = CarFactory.getInstance();
Car mySonata = factory.createCar();
Car yourSonata = factory.createCar();
System.out.println(mySonata.getCarNum()); //10001 출력
System.out.println(yourSonata.getCarNum()); //10002 출력
}
}
CarFactory.java
public class CarFactory {
private CarFactory() {} // 생성자 private으로 생성
private static CarFactory instance;
// private 인스턴스 선언
public static CarFactory getInstance() {
if (instance==null) {
instance =new CarFactory();
}
return instance;
}
//getInstance 메소드
public Car createCar() {
return new Car();
} // Car 인스턴스 생성 메소드
}
Car.java
public class Car {
private static int firstCarNum=10001; //인스턴트끼리 공유되어질 변수값 할당
private int carNum; //공유되지 않은 변수값을 생성한다.
public Car() {
carNum = firstCarNum;
firstCarNum++;
}
// 생성자가 생성될 때 첫 인스턴스는 10001 값을 가지고, static 변수값을 1 올린다. 그러면 다음 인스턴스는 10002 값을 가지게 됟다.
public int getCarNum() {
return carNum; //차량은 순서대로 고유 번호를 가지게 된다.
}
}
Reference: