기본형 매개변수 : 변수의 값을 읽기만 할 수 있다. (read only)
참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다. (read & write)
class Data6_1 {
int x; // 기본형
int y; // 기본형
}
class Data6_1Main {
public static void main(String[] args) {
Data6_1 data = new Data6_1();
data.x = 10;
data.y = 20;
System.out.println("Data6_1 클래스로 만든 data 인스턴스의 변수 x, y 값 확인");
System.out.println("data 인스턴스 변수 x = " + data.x);
System.out.println("data 인스턴스 변수 y = " + data.y);
System.out.println();
// changeParameter 메서드 의 매겨변수에 Data 클래스의 인스턴스 변수를 입력한다.
System.out.println("입력받은 매개변수의 값을 바꾸는 메서드 수행");
changeParameter(data.x, data.y);
System.out.println();
// changeParameter(data.x, data.y); 여기서의 data.x 와 data.y는
// data 의 인스턴스 변수의 값 그자체가 복사되어 넘어갑니다.
// 따라서 changeParameter 메서드에서 입력받은 매개변수의 값을 바꿔도
// 영향을 받지 않습니다.
System.out.println("Data6_1 클래스로 만든 data 인스턴스의 인스턴스 변수의 값이 변경되었는지 확인");
System.out.println("changeParameter 메서드 수행 후 data 인스턴스 변수 x = " + data.x);
System.out.println("changeParameter 메서드 수행 후 data 인스턴스 변수 y = " + data.y);
}
static void changeParameter(int x, int y) {
System.out.println();
System.out.println("changeParameter 메서드 시작");
System.out.println("입력 받은 매개변수 x 와 y의 값 확인");
System.out.println("입력 받은 매개변수 x = " + x);
System.out.println("입력 받은 매개변수 y = " + y);
System.out.println();
System.out.println("입력 받은 매개변수 x 와 y의 값을 변경 한 후 확인");
x = 100;
y = 200;
System.out.println("변경 한 후 x = " + x);
System.out.println("변경 한 후 y = " + y);
System.out.println("changeParameter 메서드 끝");
}
}
class Data6_2 {
Data6_3 data2 = new Data6_3(); // 참조형
}
class Data6_3 {
int x; // 기본형
int y; // 기본형
}
class Data6_2Main {
public static void main(String[] args) {
Data6_2 data = new Data6_2();
data.data2.x = 10;
data.data2.y = 20;
System.out.println("Data6_2 클래스로 만든 data 인스턴스의 data2인스턴스의 인스턴스 변수 값 확인");
System.out.println("참조변수 data2의 인스턴스 변수 x = " + data.data2.x);
System.out.println("참조변수 data2의 인스턴스 변수 y = " + data.data2.y);
System.out.println();
// changeParameter 메서드 의 매개변수에 Data6_2 클래스의 참조형 변수인 data2 를 입력
System.out.println("입력받은 매개변수의 값을 바꾸는 메서드 수행");
changeParameter(data.data2);
System.out.println();
// changeParameter(Data6_3 data2); 여기서 data.data2 는
// data 인스턴스의 참조형 변수 data2의 주소값이 넘어 갑니다.
// 따라서 changeParameter 메서드에서 입력받은 data2의 주소값을 통해
// data2 의 인스턴스에 접근하여 인스턴스 변수를 바꾸기 때문에 영향을 받습니다.
System.out.println("Data6_3 클래스로 만든 data 인스턴스의 참조변수 data2의 인스턴스 변수 값이 변경되었는지 확인");
System.out.println("changeParameter 메서드 수행 후 data2의 인스턴스 변수 x = " + data.data2.x);
System.out.println("changeParameter 메서드 수행 후 data2의 인스턴스 변수 y = " + data.data2.y);
}
static void changeParameter(Data6_3 data2) {
System.out.println();
System.out.println("changeParameter 메서드 시작");
System.out.println("입력 받은 매개변수 data2의 인스턴스 x 와 y의 값 확인");
System.out.println("입력 받은 매개변수 data2의 인스턴스 x = " + data2.x);
System.out.println("입력 받은 매개변수 data2의 인스턴스 y = " + data2.y);
System.out.println();
System.out.println("입력 받은 매개변수 data2의 인스턴스 x 와 y의 값을 변경 한 후 확인");
data2.x = 100;
data2.y = 200;
System.out.println("변경 한 후 data2의 인스턴스 x = " + data2.x);
System.out.println("변경 한 후 data2의 인스턴스 y = " + data2.y);
System.out.println("changeParameter 메서드 끝");
}
}
객체 생성 없이 '클래스이름.메서드이름()' 으로 호출 : ex) Math.random()
인스턴스 멤버(인스턴스 변수, 인스턴스 메서드) 와 관련없는 작업을 하는 메서드.
메서드 내에서 인스턴스 변수 사용 불가.
class StaticMethod7_1 {
int num1, num2; // 인스턴스 변수 선언
// 클래스 변수 선언
// static int num1 = 10, num2 = 20;
static int add(int num1, int num2) { // 메서드 반환타입 앞에 static 이 붙었기 때문에 static 메서드가 됩니다.
System.out.println();
System.out.println("매개변수로 입력 받은 num1, num2 확인");
System.out.println("num1 = " + num1);
System.out.println("num2 = " + num2);
// 여기서 매개 변수에 있는 num1, num2 와 위에 인스턴스 변수로 선언한 num1, num2 는 같은 걸까요?
// 기본형 매개변수에서 배웠드싱 같지 않습니다. 서로 영향을 받지 않습니다.
// 여기서 num1 과 num2 는 단지 인스턴스 변수와 이름만 같은 지역변수일 뿐 메서드가 종료되면 사라집니다.
// 인스턴스 변수는 클래스 메서드에서 사용하지 못합니다.
// 그렇다면 추가로 StaticMethod7_1 에 선언한 변수를 사용하고 싶다면?
// 인스턴스 변수가 아닌 클래스 변수를 선언해야합니다. static 타입 변수이름;
// 위에 클래스 변수의 주석을 풀고 인스턴스 변수는 주석을 해주세요!
// 자 그럼 이제 클래스 변수로 선언을 했으니까
// 매개 변수에 있는 num1, num2 와 위에 클래스 변수로 선언한 num1, num2 는 같은 걸까요?
// 그렇지 않습니다. 위에 말씀드렸듯이 num1, num2는 매개변수이자 클래스 변수와 이름만 같습니다.
// 또한 클래스 변수 를 사용하려면 클래스명.클래스변수 로 만 접근 가능합니다.
// 이렇게 클래스 ㅔ서드에서 클래스 변수를 사용할 수 있습니다. 아래 주석 풀어주세요!
// System.out.println("클래스변수 확인");
// System.out.println("StaticMethod7_1.num1 = " + StaticMethod7_1.num1);
// System.out.println("StaticMethod7_1.num2 = " + StaticMethod7_1.num2);
System.out.println("num1 + num2 = " + (num1 + num2));
return num1 + num2;
}
}
class StaticMethod7_1Main {
public static void main(String[] args) {
StaticMethod7_1 methodTest = new StaticMethod7_1(); // 객체 생성
methodTest.num1 = 10;
methodTest.num2 = 20;
// methodTest.add(methodTest.num1, methodTest.num2);
// add 는 static 메서드 이기 때문에 객체로 생성된 참조변수로는 접근할 수 없습니다.
// 클래스이름.메서드이름() 방식으로 static 메서드를 호출
StaticMethod7_1.add(methodTest.num1, methodTest.num2);
}
}
오늘도 어제에 이어서 객체에 대해 공부하였다. 오늘 학습한 양은 많지는 않았지만 이해하는데 시간이 많이 필요하였다. 지금도 여전히 머리속이 복잡하다. 그래도 코드 실행단계를 손으로 그리면서 학습하다보니 어느정도 감은 잡히는것 같다.