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