AVA 2일차 - 20210112
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] 도 같이 수정되었다.
왜냐하면 인스턴스 주소가 복사되었기 때문이다.
Author And Source
이 문제에 관하여(AVA 2일차 - 20210112), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kkambodev/JAVA-2일차-20210112저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)