728x90
Static 변수
- 힙 메모리 : 필요할 때마다 allocation 받아서 처리하는 동적 메모리 영역
- 스택 메모리 : 함수가 호출될 때마다 함수 내에서 사용하는 지역 변수 메모리 영역
- 데이터 메모리(constant) : 프로그램이 로드 될 때부터 공유되어 사용되는 메모리 영역
| 📄 Employee.java
public class Employee {
public static int serialNum = 1000;
private int employeeId;
private String employeeName;
private String department;
// 사원이 한명 추가될 때마다 사번 증가
public Employee() {
serialNum++;
employeeId = serialNum;
}
public int getEmployeeId() {
return employeeId;
}
public void setEmployeeId(int employeeId) {
this.employeeId = employeeId;
}
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
}
| 📄 EmployeeTest.java
public class EmployeeTest {
public static void main(String[] args){
Employee employeeLee = new Employee();
employeeLee.setEmployeeName("이순신");
Employee employeeKim = new Employee();
employeeKim.setEmployeeName("김유신");
System.out.println(employeeLee.getEmployeeName() + "의 사번 : "+ employeeLee.getEmployeeId());
System.out.println(employeeKim.getEmployeeName() + "의 사번 : "+ employeeKim.getEmployeeId());
}
}
- static 변수는 클래스 명으로 참조하여 사용한다.
- 따로 객체를 생성하지 않아도 된다.
System.out.println(Employee.serialNum);
// System.out.println(employeeKim.serialNum);
Static 메서드
- Static 메서드에서는 인스턴스 변수를 사용할 수 없다.
public static void setSerialNum(int serialNum) {
int i = 0;
employeeName = "Lee"; //Error
Employee.serialNum = serialNum;
}
변수의 사용
- 멤버변수를 너무 많이 사용하게 되면 인스턴스 생성시 과도하게 메모리가 할당되어 낭비가 발생한다.
- 클래스의 속성이 될 수 있는 변수들의 경우 인스턴스 변수로 사용하는 게 좋다.
지역 변수(로컬 변수)
- 선언 : 함수 내부
- 범위 : 함수 내부
- 메모리 : 스택
- 생성 & 소멸 : 함수가 호출될 때 생성되고 함수가 끝나면 소멸
멤버 변수(인스턴스 변수)
- 선언 : 클래스 멤버 변수
- 범위 : 클래스 내부, private or 참조 변수로 다른 클래스에서 사용
- 메모리 : 힙
- 생성 & 소멸 : 인스턴스 생성시 생성되고 gc에 의해 소멸
static 변수(클래스 변수)
- 선언 : static을 이용하고 클래스 내부
- 범위 : 클래스 내부, private or 참조 변수로 다른 클래스에서 사용
- 메모리 : 데이터 영역
- 생성 & 소멸 : 프로그램과 생명 주기 동일
싱글톤 패턴(Singleton Pattern)
- 프로그램에서 인스턴스가 단 한 개만 생성되어야 하는 경우 사용하는 디자인 패턴
- static 변수, 메서드를 활용하여 구현
| 📄 Company.java
public class Company {
private static Company instance = new Company(); // 유일한 인스턴스
private Company() {
}
public static Company getInstance() {
if(instance == null)
instance = new Company();
return instance;
}
}
| 📄 CompanyTest.java
import java.util.Calendar;
public class CompanyTest {
public static void main(String[] args) {
Company company1 = Company.getInstance();
Company company2 = Company.getInstance();
System.out.println(company1);
System.out.println(company2);
Calendar calendar = Calendar.getInstance();
}
}
- static 메서드의 경우 클래스 이름으로 가져와야한다!
배열
- 물리적 위치와 논리적 위치가 동일
- 인덱싱을 이용하므로 자료의 탐색에서 빠른 속도를 보인다.
- Enhanced For
- 배열의 n개 요소를 0부터 n-1까지 순차적으로 순회
for( 변수 : 배열) {
}
- 배열은 선언시 객체가 들어갈 메모리 공간만 정의가 된다.
얕은 복사(Shallow Copy)
- System.arrayCopy(src, srcPos, dest, destPos, length)
- 배열 복사 메서드
src
배열과dest
배열이 같은 객체를 가리킨다.
| 📄 Book.java
public class Book {
private String title;
private String author;
public Book() {}
public Book(String title, String author) {
this.title = title;
this.author = author;
}
public void showInfo() {
System.out.println(title + "+" + author);
}
}
| 📄 ObjectCopyTest.java
public class ObjectCopyTest {
public static void main(String[] args){
Book[] library = new Book[5];
Book[] copyLibrary = new Book[5];
library[0] = new Book("태백산맥1", "조정래");
library[1] = new Book("태백산맥2", "조정래");
library[2] = new Book("태백산맥3", "조정래");
library[3] = new Book("태백산맥4", "조정래");
library[4] = new Book("태백산맥5", "조정래");
System.arraycopy(library, 0, copyLibrary, 0, 5);
System.out.println("==library==");
for(Book book : library) {
System.out.println(book);
book.showInfo();
}
System.out.println("==copyLibrary==");
for(Book book : copyLibrary) {
System.out.println(book);
book.showInfo();
}
}
}
| Output
==library==
OOP_01.ch21.Book@2f92e0f4
태백산맥1+조정래
OOP_01.ch21.Book@2a84aee7
태백산맥2+조정래
OOP_01.ch21.Book@a09ee92
태백산맥3+조정래
OOP_01.ch21.Book@30f39991
태백산맥4+조정래
OOP_01.ch21.Book@452b3a41
태백산맥5+조정래
==copyLibrary==
OOP_01.ch21.Book@2f92e0f4
태백산맥1+조정래
OOP_01.ch21.Book@2a84aee7
태백산맥2+조정래
OOP_01.ch21.Book@a09ee92
태백산맥3+조정래
OOP_01.ch21.Book@30f39991
태백산맥4+조정래
OOP_01.ch21.Book@452b3a41
태백산맥5+조정래
- 주소가 동일한 걸 알 수 있다! (얕은 복사)
ArrayList
- 기존의 배열 선언과 사용 방식은 배열의 길이를 정하고 요소의 개수가 배열의 길이보다 커지면 배열을 재할당하고 복사해야 했지만
ArrayList를 사용하면 유동적으로 관리가 가능하다.
Ref. 자바 공식 문서 - ArrayList
주요 메서드
boolean add(E e)
int size()
E get(int index)
E remove(int index)
boolean isEmpty()
728x90
'🧑💻 Language > Java' 카테고리의 다른 글
[Java] 자료 구조 (0) | 2022.05.03 |
---|---|
[Java] 객체 지향 프로그래밍(3) (0) | 2022.04.26 |
[Java] 객체 지향 프로그래밍 (1) (0) | 2022.04.07 |
[Java] Basic Java (2) (0) | 2022.04.04 |
[Java] Basic Java (1) (0) | 2022.03.29 |