참조 : Do it Java 완전정복
http://www.yes24.com/Product/Goods/103389317
필드
필드와 지역변수 구분
- 필드 :클래스에 포함된 변수로, 객체의 속성값을 지정할 수 있다.
- 지역변수(variable) : 메서드에 포함된 변수
- 클래스 중괄호 안에 선언된 변수 - 필드 , 메서드 중괄호 안에 선언된 변수 - 지역변수
- 필드 - 힙 메모리의 객체 내부, 지역변수 - 스택메모리에 생성
- 스택 메모리에 저장되는 변수는 자신이 선언된 메서드의 중괄호가 닫혀 메서드가 종료되면, 그 메서드 안에 선언된 모든 지역 변수가 메모리에서 통째로 삭제됨
- 프레임 - 1개의 메서드 안에 선언된 모든 지역 변수들의 집합
- 힙메모리의 객체 안에 저장되는 필드는 객체가 사라지지 않는 한 절대로 삭제되지 않음
- 스택 메모리는 나중에 들어간 것이 먼저 나오는 LIFO(Last In First Out)구조를 띈다.
- 스택영역에 저장되는 지역 변수는 강제로 초기화 되지 않음
- 힙 영역에 저장되는 필드는 초깃값이 없을 때 강제로 초기화됨.
메서드
메서드 정의
메서드 호출
- 클래스 외부에서 메서드를 사용하려면 먼저 객체를 생성해야 한다.
- 객체의 위치를 저장하고 있는 참조 변수를 이용해 매서드를 호출해야한다.
- 리턴 값이 있는 메서드는 일반적으로 리턴되는 값을 저장 할 수 있는 변수를 선언해 대입 한다.
- 입력 매개 변수가 있는 함수를 호출할 때는 해당 자료형의 값을 넘겨 줘야 한다.
- ex) double sum (int a, double b) → a.sum(3,5.2)
클래스 내부에서 메서드 호출
- 클래스 내부에 있는 메서드 끼리는 객체를 생성하지 않고 서로를 호출할 수 있다. (필드도 동일)
- 다만 메서드 앞에 static이 붙어 있을때는 static이 붙은 필드 또는 메서드만 호출가능
- 같은 멤버 끼리는 클래스 내부에서 얼마든지 객체 생성없이 서로를 호출가능
기본 자료형 입력매개변수와 참조 자료형 입력 매개변수의 차이
-
참조 자료형이 입력 매개변수로 넘겨질때 객체의 위칫값이 전달
-
등호(=)는 스택 메모리를 복사한다.
-
기본 자료형을 입력 매개변수로 전달하면 전달 받은 메서드는 값을 복사해 사용
-
참조자료형은 스택 메모리에 객체의 참조값(위치값)을 저장하므로 실제 객체가 아닌 객체의 참조값이 전달돼 복사된다.
-
호출된 메서드에서 객체의 값을 변경한 후 호출한 메서드로 돌아오면 값이 바뀌게된다.
오버로딩된 메서드
- 메서드 시그니처 : 메서드명과 입렵매개변수의 자료형
- 메서드 시그니처가 다르면 메서드명이 동일해도 다른 메서드로 인식
- 메서드 오버로딩 : 입력매개변수의 개수나 자료형이 다른 여러 개의 동일한 이름을 지닌 메서드를 같은 공간에 정의하는 것
- 메서드 오버로딩
- 리턴 타입 메서드명 (자료형 변수명, 자료형 변수명, ...) { }
- int sum ( int a, int b) { }
- 호출할 때 넘겨 주는 입력매개변수에 따라 호출될 메서드가 선택된다.
- 리턴 타입으로는 메서드를 구분할 수 없다.
가변 길이 배열 입력매개변수 메서드
- 개수가 정해지지 않은 가변 길이의 입력을 받는 입력매개변수로 입력된 값들은 배열로 저장된다. 배열의 크기는 함수 가 호출될 때 전달된 입력값의 개수로 정해진다.
- 리턴 타입 메서드명 (자료형... 참조 변수명) { 메서드 }
-
ex) method1(1, 2) ; // 입력매개변수 길이 : 2
method1(1, 2, 3); // 입력매개변수 길이 : 3
method1(); // 입력매개변수 길이 : 0
public static void method1(int... values) {
System.out.println(”입력매개변수 길이 : “ + values.length);
for ( int i = 0; i < values.length; i ++)
Systme.out.println(values[i] + “ “);
생성자(Constructor)
- 반드시 클래스명과 동일해야 한다.
- 메서드와 비슷한 구조를 지니지만, 리턴 타입이 없다.
- 구조 : 클래스명(입력매개변수) { }
- 생성자를 포함하지 않는 클래스에게 컴파일러가 기본 생성자를 자동으로 추가
- class A {
int m;
void work() { ... }
A() { } // 컴파일러가 자동으로 기본 생성자 추가 }
- 생성자가 호출되는 것만으로 객체가 내부적으로 생성되며, 생성자의 중괄호 안은 객체가 생성된 이후 할 일이 작성된다. 일반적으로 이곳에서 필드를 초기화 한다.
생성자와 객체의 생성 방법
- 생성자의 모양에 따라 객체를 생성하는 방법이 결정된다.
- 생성자도 메서드처럼 오버로딩 가능 → 메서드처럼 생성자의 입력매개변수 자료형이나 개수에 따라 여러개의 생성자를 정의할 수 있다.
class A {
A() {
System.out.println("첫 번째 생성자");
}
A(int a) {
System.out.println("두 번째 생성자");
}
A(int a, int b) {
System.out.println("세 번째 생성자");
}
}
public class ContstructorOverloading {
public static void main(String[] args) { // 생성자 오버로딩 후 생성자를 호출해 객체 생성
A a1 = new A();
A a2 = new A(3);
A a3 = new A (3, 5);
}
}
this 키워드와 this() 메서드
- 모든 사용할 수있는 상태의 멤버는 항상 객체 속에만 존재한다.
내부 객체 참조 변수명인 this 키워드
클래스 내 다른 생성자를 호출하는 this() 메서드
- this() 메서드 → 자신이 속한 클래스 내부의 다른 생성자를 호출
- 생성자의 내부에서만 사용 가능
- 생성자의 첫 줄에 위치해야 한다.
- 메서드에서는 this() 메서드 사용불가