기본형 매개변수
기본형 매개변수 - 변수의 값을 읽기만 할 수 있다. (readonly)
참조형 매개변수 - 변수의 값을 읽고 변경할 수 있다. (read & write)
class Data { int x; }
class Example {
public static void main(String[] args) {
Data d = new Data();
d.x = 10;
System.out.println("main() : x = " + d.x);
change(d.x);
System.out.println("main() : x = " + d.x);
}
static void change(int x) { // 기본형 매개변수
x = 1000;
System.out.println("change() : x = " + x);
}
}
먼저 값을 예상해본다.
Data타입의 d라는 참조 변수에 Data객체를 생성해서 그 주소를 d가 가리킨다.
d.x를 통해서 메서드를 호출하고 10이 change에 들어간다.
출력을 통해 change 메서드에 있는 출력문을 출력하고
돌아왔을때 d.x를 또 호출하지만 값은 10이다. why? void타입으로 return을 하고 있지 않기 때문!!
참조형 매개변수
class Data { int x; }
class Example {
public static void main(String[] args) {
Data2 d = new Data2();
d.x = 10;
System.out.println("main() : x = " + d.x);
change(d);
System.out.println("main() : x = " + d.x);
}
static void change(Data2 d) { // 참조형 매개변수
d.x = 1000;
System.out.println("change() : x = " + x);
}
}
참조형 매개 변수도 실행 순서를 먼저 적어 본다.
메서드를 호출하고 d의 값을 change메서드에 파라미터로 보낸다
그런다음 d.x를 통해서 d의 x값에 1000을 대입한다
그러면 객체 d 주소에 있는 x의 값을 1000으로 바꿧으므로 메인 메서드의 d.x에 1000이 저장된다.
change(d)에서 메인메서드는 대기 상태가 되고,
d가 이동하는 것이 아니라 복사가 되고, 이 참조변수도 d.x 10의 값을 가리키게 되는 것.
그리고 10이였던 값을 1000으로 바꾼다.
참조형 반환타입
class Data { int x; }
class Example {
public static void main(String[] args) {
Data3 d = new Data3();
d.x = 10;
Data3 d2 = copy(d)
System.out.println("1 : " + d.x);
System.out.println("2 : " + d2.x);
}
static Data3 copy (Data3 d) {
Data3 tmp = new Data3();
tmp.x = d.x;
return tmp;
}
}
먼저 예상해보자!
일단 d.x는 아무런 변화가 없음 10이 찍힐 것
d2는 d를 참조하는 매개변수를 복사해서 파라미터로 넘겨주고
그곳에는 tmp라는 참조변수를 가진 Data3타입의 객체가 생성되고
tmp가 가리키는 x의 값에 d가 가리키는 10의 값을 넣어준다.
그리고 tmp를 돌려줌으로 Data3 타입의 d2.x또한 10을 갖게 된다!
return tmp; 부분에서
0x200 주소에 저장되어있는 객체의 주소를 반환해주는 것
0x200 주소를 d2가 갖게되고, 그 다음 tmp.x의 0x200의 10을 가리킨다.
static 메서드와 인스턴스 메서드
메서드 앞에 static이 붙는 것이 클래스 메서드(static 메서드)
그럼 인스턴스 메서드는 ? static 없는 것
인스턴스 메서드
- 인스턴스 생성 후, 참조변수.메서드이름()으로 호출
- 인스턴스 멤버(iv, im)와 관련된 작업을 하는 메서드
- 메서드 내에서 인스턴스 변수(iv) 사용 가능
static 메서드(클래스 메서드)
- 객체생성없이 클래스이름.메서드이름()으로 호출 예를 들면 Math.random
- 인스턴스 멤버(iv, im)와 관련없는 작업을 하는 메서드
- 메서드 내에서 인스턴스 변수(iv) 사용 불가
static을 언제?
속성(멤버 변수)중에서 공통 속성에 static을 붙인다.
'Java' 카테고리의 다른 글
Java : 상속 (0) | 2021.11.24 |
---|---|
Java : 오버로딩 , 생성자 (0) | 2021.11.24 |
Java : 메서드, return , 호출 스택 (2) | 2021.11.06 |
Java : 변수 종류, 인스턴스 변수, 클래스 변수 (0) | 2021.10.29 |
Java : 객체지향 언어 , 클래스 , 인스턴스 (0) | 2021.10.28 |