JAVA/Do it! 자바 프로그래밍 입문

[Do it 자바 프로그래밍 입문] 06 클래스와 객체 2

yun.data 2023. 3. 25. 08:21

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
	}
}

 

 

 

  • 싱글톤 패턴을 사용하는 이유
    • 메모리 낭비 방지
    • 인스턴스 간의 메모리 공유 용이
    • 공통된 객체를 많이 생성해야 하는 경우에 사용