필드는 클래스에 포함된 변수로 객체의 속성값을 지정할 수 있다. 클래스의 중괄호 안에 선언된 변수이다.
지역변수는 메서드에 포함된 변수를 말한다. 메서드의 중괄호 안에 선언된 변수이다.
필드는 힙 메모리의 객체 내부, 지역 변수는 스택 메모리에 생성된다. 스택 메모리에 저장되는 변수는 때가 되면 JVM이 자동으로 삭제하지만, 힙 메모리의 객체 안에 저장되는 필드는 객체가 사라지지 않는 한 절대로 삭제되지 않는다.
객체가 더 이상 사용되지 않을 떄, 즉 어떤 참조 변수도 해당 객체를 가리키지 않을 때 가비지 컬렉터가 객체 자체를 제거한다.
필드는 직접 초기화하지 않아도 강제로 초기화된다. 반면, 지역 변수는 직접 초기화하지 않으면 저장 공간이 빈 공간 그대로 있어 값을 출력하고자 할 때 오류가 발생한다. 힙 메모리에는 빈 공간이 저장될 수 없기 때문에 힙 메모리에 위치하는 필드는 강제로 초기화되는 것이고, 스택 메모리는 강제로 초기화되지 않으므로 여기에 저장되는 지역 변수 또한 그 특징을 지니고 있는 것이다.
메서드는 클래스의 기능에 해당하는 요소이다.
자바 제어자 리턴(반환) 타입 메서드명(입력매개변수) { public static int sum(int a, int b){
메서드 내용 //메서드 내용
} }
클래스 외부에서 메서드를 사용하려면 먼저 객체를 생성해야 한다. 이어서 객체의 위치를 저장하고 있는 참조 변수를 이용해 메서드를 호출한다.
클래스 내부에 있는 메서드끼리는 객체를 생성하지 않고 서로를 호출할 수 있다. 같은 멤버이기 때문에 필드 또한 멤버 이므로 클래스 내부의 모든 메서드 안에서 객체를 생성하지 않고 자신이 속한 클래스의 필드를 사용할 수 있다.
참조 자료형이 입력매개변수로 넘겨질 때 실제 객체가 전달되는 것이 아니라 객체의 위칫값이 전달된다.
기본 자료형을 입력매개변수로 전달하면 전달받은 메서드는 값을 복사해 사용한다.
참조자료형은 스택 메모리에 객체의 참좃값을 저장하고 있으므로 실제 객체가 아닌 객체의 참조값이 전달돼 복사된다.
그러다 보니 호출한 메서드와 호출된 메서드에서 모두 동일한 객체를 쳐다보고 있는 상황이 연출되어 호출된 메서드
에서 객체의 값을 변경한 후 호출한 메서드로 돌아오면 값이 바뀌게 된다.
메서드 시그너처 : 메서드명과 입력매개변수의 자료형
메서드 오버로딩 : 입력매개변수의 개수나 자료형이 다른 여러 개의 동일한 이름을 지닌 메서드를 같은 공간에 정의
▼만일 전달되는 입력매개변수의 개수 범위가 광범위하게 큰 경우 어떻게 해결할까??
<가변 길이 입력 매개변수 메서드>
개수가 정해지지 않은 가변 길이의 입력을 받는 입력매개변수로 입력된 값들은 배열로 저장된다.
그리고 이 배열의 크기는 함수가 호출될 때 전달된 입력값의 개수로 정해진다.
리턴 타입 메서드명 (자료형... 참조 변수명) { public static void method1(int... values){
.... .......
} }
생성자는 객체를 생성하는 역활을 지닌 클래스의 내부 구성요소로 객체 내에 포함되는 필드의 초기화 또한 주로 생성자 내에서 수행한다. 반드시 클래스명과 동일한 이름으로 지어야 한다. 메서드와 비슷한 구조를 지니지만 리턴타입이 없다.
지금까지 생성자를 만들지 않아도 정상적으로 객체가 생성됐던 이유는 생성자를 포함하지 않는 클래스에게 컴파일러가 기본 생성자를 추가해 줬기 떄문이다. 기본 생성자는 입력매개변수가 없는 생성자를 말한다. 컴파일러는 생성자가 없는 클래스를 만들면 적어도 1개의 생성자가 필요하므로 입력 매개변수가 없는 기본 생성자를 추가해 주는 것이다.
생성자가 호출되는 것만으로 객체가 내부적으로 생성된다. 생성자의 실행문, 즉 생성자의 중괄호 안은 객체가 생성된 이후 할 일이 작성되는 부분이다. 일반적으로 여기에서 필드를 초기화한다. 따라서 컴파일러가 추가해 주는 기본 생성자는 텅 비어 있다. 메서드처럼 생성자의 입력매개변수 자료형이나 개수에 따라 여러개의 생성자를 정의할 수 있다. 즉 생성자도 오버로딩이 가능하다.
모든 사용할 수 있는 상태의 멤버는 항상 객체 속에만 존재한다. 그렇다면 어떻게 클래스 내부에서는 객체를 생성하지 않고 바로 필드와 메서드를 사용할 수 있을까??
우리는 클래스 내부에서도 객체 안의 멤버를 사용해 왔다. '참조 변수명.멤버명'의 형태를 사용해 왔다. 다만 객체를 직접 만들지 않은 것뿐이다. 모든 메서드에서는 자신이 포함된 클래스의 객체를 가리키는 this라는 참조 변수가 있다.
우리가 int m = 3이라는 필드를 클래스 내부에서 출력하고 할 때도 System.out.print(this.m)과 같이 작성해야 한다.
다만 this.를 생략하면 컴파일러가 자동으로 this.를 추가해 주기 때문에 지금까지 클래스 내부에서 필드와 메서드를 그대로 사용할 수 있었던 것이다. 지역 변수는 멤버가 아니므로 this.가 자동으로 붙지 않는다.
this() 메서드는 자신이 속한 클래스 내부의 다른 생성자를 호출하는 명령이다.
생성자의 내부에서만 사용할 수 있으며(생성자의 내부에서만 또 다른 생성자를 호출할 수 있다) 생성자의 첫 줄에 위치해야 한다.
class A{
A(){
}
A(int a){
this(); -- A()를 호출
}
}
'JAVA > Do it 자바 완전정복' 카테고리의 다른 글
8장 클래스 외부 구성 요소 (0) | 2022.03.29 |
---|---|
6장 클래스와 객체의 개념 (0) | 2022.03.22 |
5-2장 참조 자료형 - main() 메서드 / String (0) | 2022.03.21 |
5-1장 참조 자료형-배열 (0) | 2022.02.24 |
2장 자료형 (0) | 2022.02.24 |
댓글