[Java] 객체지향 프로그래밍 2

iiueon·2023년 7월 5일

JVM의 메모리 구조

1. 메서드 영역(method area)

프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스파일(*.class)을 읽어서 클래스 데이터를 이곳에 저장한다. 이 때, 그 클래스의 클래스변수도 이 영역에 함께 생성된다.

2. 힙(heap)

프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성된다. 즉, 인스턴스변수들이 생성되는 공간이다.

3. 호출스택(call stack, execution stack)

메서드가 호출되면, 호출스택에 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 메서드가 작업을 수행하는 동안 지역변수들과 연산의 중간결과 등을 저장하는데 사용된다. 그리고 메서드가 작업을 마치면 할당되었던 메모리공간은 반환되어 비워진다.



오버로딩(overloading)

한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것

오버로딩의 조건

  1. 메서드 이름이 같아야 한다.
  2. 매개변수의 개수 또는 타입이 달라야 한다.



생성자(Constructor)

인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'

생성자의 조건

  1. 생성자의 이름은 클래스의 이름과 같아야 한다.
  2. 생성자는 리턴 값이 없다.

생성자에서 다른 생성자 호출하기

  • 생성자의 이름으로 클래스이름 대신 this를 사용
  • 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능
this : 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다.
	   모든 인스턴스메서드에 지역변수로 숨겨진 채로 존재한다.
this(), this(매개변수) : 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.


변수의 초기화

멤버변수(클래스변수와 인스턴스변수)와 배열의 초기화는 선택적이지만,
지역변수의 초기화는 필수적

멤버변수의 초기화 방법

1. 명시적 초기화(explicit initialization)

변수 선언과 동시에 초기화하는 것

2. 생성자(constructor)

3. 초기화 블럭(initialization block)

  • 클래스 초기화 블럭 : 클래스변수의 복잡한 초기화에 사용
  • 인스턴스 초기화 블럭 : 인스턴스변수의 복잡한 초기화에 사용
class InitBlock{
	static { /* 클래스 초기화블럭 */ }    

	{ /* 인스턴스 초기화블럭 */ }
}

❗️ 생성자보다 인스턴스 초기화 블럭이 먼저 수행

인스턴스 변수의 초기화는 주로 생성자를 사용하고,
인스턴스 초기화 블럭은 모든 생성자에서 공통으로 수행돼야 하는 코드를 넣는데 사용

멤버변수의 초기화 시기와 순서

클래스변수의 초기화시점 : 클래스가 처음 로딩될 때 단 한번 초기화
인스턴스변수의 초기화시점 : 인스턴스가 생성될 때마다 각 인스턴스별로 초기화

클래스변수의 초기화순서 : 기본값 -> 명시적초기화 -> 클래스 초기화 블럭
인스턴스변수의 초기화순서 : 기본값 -> 명시적초기화 -> 인스턴스 초기화 블럭 -> 생성자



참고 자료

  • 자바의 정석 3판
profile
지연_로딩

0개의 댓글