AVA 2일차 - 20210112

21784 단어 JavaJava

static 변수

  • 클래스 내부에 선언
  • static 변수는 프로그램이 실행되어 메모리에 올라갔을때 딱 한 번 메모리 공간 할당
  • 모든 인스턴스가 공유 한다.
  • 클래스 변수(class variable)라고도 한다.

예제

  • 학생 클랙스
  • 학생마다 고유한 학번을 가짐
    • 학생이 입학하면 학번이 자동 생성
    • 생성된 인스턴스는 학번을 순서대로 가져가야함
public class Student1 {
    public static int serialNum = 1000;
    public int studentId;
    public String studentName;
    public int grade;
    public String address;

    public Student1( ) {
        serialNum++;
        studentId = serialNum;
    }

    public void setStudentName(String name) {
        this.studentName = name;
    }
}
public class StudentTest2 {
    public static void main(String[] args) {

        Student1 studentlee = new Student1();
        studentlee.setStudentName("이지원");
        System.out.println("Student1.serialNum = " + Student1.serialNum);
        System.out.println(studentlee.studentName + " 학번 : " + studentlee.studentId);

        Student1 studentSon = new Student1();
        studentSon.setStudentName("손수경");
        System.out.println("studentSon.serialNum = " + Student1.serialNum);
        System.out.println(studentSon.studentName + " 학번 : " + studentSon.studentId);
    }
}

static 변수는 클래스 이름으로 직접 참조합니다.
static 변수와 static 메소드는 이탤릭체로 표현합니다.

클래스 메서드 내부에서는 인스턴스 변수를 사용할 수 없습니다.
반대로 클래스 메서드와 클래스 변수는 인스턴스가 생성되지 않아도 사용이 가능하다.
당연한거라 코드는 안적었다.

static 응용 - singleton pattern

인스턴스를 단 하나만 생성하는 디자인 패턴

싱글톤 패턴으로 회사 클래스 구현하기

단계 1 : 생성자를 private로 만들기
  • 생성자가 public이면 외부 클래스에서 여러개의 인스턴스 생성 가능
  • 따라서 singleton pattern은 생성자를 반드시 명시적으로 작성
  • 접근 제어자를 private로 지정
public class Company {
    
    private Company( ) { }
}
단계 2: 클래스 내부에 static으로 유일한 인스턴스 생성
  • 우리가 프로그램에서 사용할 인스턴스 생성
  • private로 선언하여 외부에서 이 인스턴스에 접근하지 못하게 해야 한다.
public class Company {
    
    private static Company instance = new Company();//유일하게 생성된 인스턴스

    private Company( ) { }
}
단계 5: 외부에서 참조할 수 있는 public 메서드 만들기
  • private로 선언한 인스턴스를 외부에서 사용할 수 있도록 설정
  • 반드시 static으로 선언
public class Company {

    private static Company instance = new Company();

    private Company( ) { }

    public static Company getInstance() {
        if(instance == null){
            instance = new Company( );
        }

        return instance;
    }
}

테스트

public class CompanyTest {
    public static void main(String[] args) {
        Company myCompany1 = Company.getInstance();
        Company myCompany2 = Company.getInstance();

        System.out.println(myCompany2 == myCompany1);

    }
}

배열

  • 객체 배열 생성 가능
  • System.arraycopy( ) 으로 복사하면 인스턴스 주소가 복사된다.

public class BookArray2 {
    public static void main(String[] args) {
        Book[ ] library = new Book[5];
        Book[ ] library2 = new Book[5];

        library[0] = new Book("태백산맥", "조정래");
        library[1] = new Book("데미안", "헤르만 헤세");
        library[2] = new Book("어떻게 살 것인가", "유시민");
        library[3] = new Book("토지", "박경리");
        library[4] = new Book("어린왕자", "생텍쥐페리");


        System.out.println("====== library ===========");
        for(Book book : library){
            System.out.println("book.showBookInfo() = " + book.showBookInfo());
        }

        //배열 복사
        System.arraycopy(library, 0, library2, 0,5);

        System.out.println("====== library[0] 수정 ===========");

        library[0].setBookName("나목");
        library[0].setAuthor("박완서");

        System.out.println("====== library2 ===========");

        for(Book book : library2){
            System.out.println("book.showBookInfo() = " + book.showBookInfo());
        }


        for(int i  = 0 ; i < library.length ; i++){
            System.out.println("library = " + library[i]);
        }
    }

}

libary[0]을 수정하였지만 library2[0] 도 같이 수정되었다.
왜냐하면 인스턴스 주소가 복사되었기 때문이다.

좋은 웹페이지 즐겨찾기