클래스의 내부 구성요소(메모리 관점)

주현·2023년 10월 30일

JAVA

목록 보기
3/12

클래스 내부에는 필드, 메서드, 생성자, 이너 클래스 4가지 구성 요소가 포함될 수 있다. 또한 this에 대해서도 정리만 하고 넘어가자


필드

필드와 지역변수

  • 필드 : 클래스의 중괄호 안에 선언된 변수
  • 지역변수 : 메서드의 중괄호 안에 선언된 변수

필드와 지역변수의 차이점는 바로 메모리 위치!

  • 필드는 힙 메모리의 객체 내부
  • 지역변수는 스택메모리에 생성

필드와 지역 변수의 초깃값

필드는 직접 초기화 하기 않아도 강제로 초기화가 됩니다.
반면 지역 변수는 직접 초기화하지 않는다면 에러가 발생함.
사실 필드, 지역변수의 차이가 아니라, 각각이 위치하는 메모리 영역의 특징임.
즉, 힙 메모리에는 빈 공간이 저장될 수 없다 -> 강제로 초기화를 시킨다. 0
스택 메모리는 강제로 초기화되지 않는다. -> 초기화를 안하고 이 값을 출력하려 하면 에러가 뜬다.


생성자

  • 반드시 클래스명과 동일한 이름을 가져야함.
  • 리턴타입이 없음.
  • 생성자를 따로 만들지 않아도 생성자가 만들어진다. 여기서 기본 생성자는 입력매개변수가 없는 생성자다.
  • 만약 따로 내가 입력매개변수가 있는 생성자를 만들면, 따로 A()라는 생성자를 안 만든다.

this 키워드와 this() 메서드

this 키워드

모든 메서드에는 자신이 포함된 클래스의 객체를 가리키는 this라는 참조 변수가 있습니다.
클래스 내부에서 멤버를 활용할 때, 소속을 표기하지 않으면 컴파일러가 자동으로 this를 붙여줍니다.

-> 그렇다면 this를 생략하면 항상 컴파일러가 추가해주는데 신경 쓸 필요 없는데? 라고 생각이 든다.

class A{
	int m;
    int n;
    void init(int m, int n){
    	m = m;
        n= n;
    }
}

메서드 영역에서는 필드 m,n/ 지역변수 m,n 둘 다 사용 가능합니다. 그렇다면 init()메서드에서는 m,n를 사용하면 필드인가 지역변수인가? 정답은 지역변수로 인식한다.

A a =new A();
a.init(3,4)

이렇게 한고 a.m, a.n를 프린트 한다면 둘 다 0이 나오게 됩니다.
이러한 문제는 지역 변수와 필드명이 동일하기 때문에 발생하는 문제입니다.

void init(int m, int n){
	this.m =m;
    this.n =n;

이렇게 필드와 지역변수를 명시적으로 구분하게 되면 문제는 해결되게 됩니다.

this()메서드

this()메서드 : 자신이 속한 클래스 내부의 다른 생성자를 호출하는 명령어이다.
규칙
1. 생성자의 내부에서만 사용할 수 있음.
2. 생성자의 첫 줄에 위치해야 함.

0개의 댓글