1. this 에약어
1-1. 자신의 메모리를 가리키는 this
- 생성된 인스턴스 스스로를 가리키는 예약어
- ex) this.year = year; 문장 - 동적 메모리에 생성된 인스턴스의 year 변수 위치를 가르키고, 그 위치에 매개변수 값을 넣어주는 것임
1-2. 생성자에서 다른 생성자를 호출하는 this
- 클래스에 생성자가 여러 개 있을 때 어떤 생성자에서 다른 생성자를 호출하는 경우
- this로 다른 생성를 호출하는 경우 호출 코드 이전에 다른 코드를 넣을 수 없음
- 생성자는 클래스가 생성될 때 호출되므로 클래스 생성이 완료되지 않은 시점에 다른 코드가 있다면 오류가 발생할 수 있음
- 디폴트 생성자에서 생성이 완료되는 것이 아니라 this를 통해 호출하기 때문
1-3. 자신의 주소를 반환하는 this
- 생성된 클래스 자신의 주소 값 반환
- 인스턴스 주소 값 반환시에는 this 사용
- 반환형은 클래스 자료형 사용
2. 객체 간 협력
- 객체 사이에는 서로 어떤 값을 주고받고 메서드를 호출하는 일 발생
- 하나의 경우에 대해 두 개의 객체에서 서로 다른 일이 발생하는 것이므로 각각의 클래스에 메서드로 구현해야 함
3. static 변수
3-1. 변수를 여러 클래스에서 공통으로 사용하려면?
- 공통으로 사용하는 변수를 static 변수로 선언함
3-2. static 변수의 정의와 사용 방법
- static 변수 = 정적 변수 = 클래스 변수(class variable)
- static 자료형 변수이름;
- 클래스 내부에 선언하지만 인스턴스 생성시마다 생성되는 변수가 아님
- 프로그램이 실행되어 메모리에 올라갔을 때 딱 한 번 메모리 공간이 할당됨
- static 값은 모든 인스턴스가 공유함
3-3. 클래스 변수
- static 변수는 인스턴스보다 먼저 생성되므로 클래스 이름으로도 참조하여 사용 가능
3-4. 클래스 메서드
- static 변수를 위한 메서드
- static 메서드 = 클래스 메서드(class method)
- static 메서드 또한 static 변수처럼 인스턴스 참조 변수가 아닌 클래스 이름으로 직접 호출 가능
3-5. 클래스 메서드와 인스턴스 변수
- 클래스 메서드 내부에서 사용 가능한 변수
- 지역 변수(local variable): 메서드 내부에서 선언한 변수
- 클래스 변수
- 클래스 메서드 내부에서 사용 불가능한 변수
- 인스턴스 변수: 인스턴스가 생성되어야 메모리가 할당되기 때문에 클래스 메서드에서 사용할 수 없음
4. 변수 유효 범위
4-1. 범소 유효 범위란?
- 변수의 선언 위치에 따라 유효 범위(scope)가 달라짐
- 지역 변수(로컬 변수, local variable)
- 함수나 메서드 안에서만 사용 가능
- 스택(stack)에 메모리 생성
- 함수가 호출 될 때 생성되었다가 함수가 반환되면 할당되었던 메모리 공간이 해제되면서 함께 사라짐
- 멤버 변수(인스턴스 변수, instance variable)
- 클래스 안 어느 메소드에서나 사용 가능
- 힙(heap)에 메모리 생성
- 힙에 생성된 인스턴스가 가비지 컬렉터(garbage collector)에 의해 수거되면 메모리에서 사라짐
- 클래스 내부의 여러 메서드에서 사용할 변수는 멤버 변수로 선언하는 것이 좋음
- static 변수(클래스 변수, class variable)
- 인스턴스에서 공통으로 사용 가능
- 처음부터 데이터 영역 메모리에 생성
- private가 아니라면 객체 생성과 무관하게 클래스 외부에서도 사용 가능
- 프로그램 실행이 종료되어 메모리에서 내려가면 static 변수도 함께 소멸
4-2. 변수 유형에 따른 용도
변수 유형 | 선언 위치 | 사용 범위 | 메모리 | 생성과 소멸 |
지역 변수(로컬 변수) | 함수 내부 | 함수 내부 | 스택 | - 함수가 호출될 때 생성 - 함수 종료시 소멸 |
멤버 변수(인스턴스 변수) | 클래스 멤버 변수로 | - 클래스 내부 - private가 아니면 다른 클래스에서도 사용 가능 |
힙 | - 인스턴스 생성시 때 생성 - 가비지 컬렉터가 메모리 수거할 때 소멸 |
static 변수(클래스 변수) | 클래스 내부 | - 클래스 내부 - private이 아니면 클래스 이름으로 다른 클래스에서도 사용 가능 |
데이터 영역 | - 프로그램 시작 시 생성 - 프로그램 종료 후 메모리를 해제할 때 소멸 |
5. static 응용 ─ 싱글톤 패턴
5-1. 싱글톤 패턴(singleton pattern)
- 객체 지향 프로그램에서 인스턴스를 단 하나만 생성하는 디자인 패턴
5-2. 싱글톤 패턴으로 회사 클래스 구현하기
- 단계 1: 생성자를 private로 만들기
- public일 경우 여러 개의 인스턴스를 생성할 수 있기 때문에 명시적으로 만들어 private로 지정해야 함
- 단계 2: 클래스 내부에 static으로 유일한 인스턴스 생성하기
- 프로그램에 존재하는 하나의 인스턴스
public class Company {
// 유일한 인스턴스 변수(2단계)
private static Company instance = new Company();
// private 생성자(1단계)
private Company() { }
}
- 단계 3: 외부에서 참조할 수 있는 public 메서드 생성하기
- 인스턴스를 외부에서 사용할 수 있도록 public 메서드를 생성
- 인스턴스 생성과 상관없이 호출할 수 있도록 static으로 생성
public class Company {
...
// pulbic 메서드 (3단계)
public static Company getInstance() {
if(instance == null) {
instance = new Company();
}
return instance;
}
}
- 단계 4: 실제로 사용하는 코드 만들기
- 변수의 주소 값 비교하기
public class CompanyTest {
public static void main(String[] args) {
Company myCompany1 = Company.getInstance();
Company myCompany2 = Company.getInstance();
System.out.println(myCompany1 = myCompany2); // 결과값 True
}
}
- 싱글톤 패턴을 사용하는 이유
- 메모리 낭비 방지
- 인스턴스 간의 메모리 공유 용이
- 공통된 객체를 많이 생성해야 하는 경우에 사용
'JAVA > Do it! 자바 프로그래밍 입문' 카테고리의 다른 글
[Do it 자바 프로그래밍 입문] 07 배열과 ArrayList (0) | 2023.04.03 |
---|---|
[Do it 자바 프로그래밍 입문] 06 클래스와 객체 2 연습문제 (0) | 2023.03.25 |
[Do it 자바 프로그래밍 입문] 05 클래스와 객체 1 연습문제 (0) | 2023.03.24 |
[Do it 자바 프로그래밍 입문] 05 클래스와 객체 1 (0) | 2023.03.24 |
[Do it 자바 프로그래밍 입문] 04 제어 흐름 이해하기 연습문제 (0) | 2023.03.23 |