클래스 내부에는 필드, 메서드, 생성자, 이너 클래스 4가지 구성 요소가 포함될 수 있다. 또한 this에 대해서도 정리만 하고 넘어가자
필드와 지역변수의 차이점는 바로 메모리 위치!
- 필드는 힙 메모리의 객체 내부
- 지역변수는 스택메모리에 생성
필드는 직접 초기화 하기 않아도 강제로 초기화가 됩니다.
반면 지역 변수는 직접 초기화하지 않는다면 에러가 발생함.
사실 필드, 지역변수의 차이가 아니라, 각각이 위치하는 메모리 영역의 특징임.
즉, 힙 메모리에는 빈 공간이 저장될 수 없다 -> 강제로 초기화를 시킨다. 0
스택 메모리는 강제로 초기화되지 않는다. -> 초기화를 안하고 이 값을 출력하려 하면 에러가 뜬다.
- 반드시 클래스명과 동일한 이름을 가져야함.
- 리턴타입이 없음.
- 생성자를 따로 만들지 않아도 생성자가 만들어진다. 여기서 기본 생성자는 입력매개변수가 없는 생성자다.
- 만약 따로 내가 입력매개변수가 있는 생성자를 만들면, 따로 A()라는 생성자를 안 만든다.
모든 메서드에는 자신이 포함된 클래스의 객체를 가리키는 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()메서드 : 자신이 속한 클래스 내부의 다른 생성자를 호출하는 명령어이다.
규칙
1. 생성자의 내부에서만 사용할 수 있음.
2. 생성자의 첫 줄에 위치해야 함.