- 기본형 매개변수와 참조형 매개변수
1) 기본형 매개변수(primitive)
: 값을 읽기만 함, 특정 값을 저장 ( int, long, double, char, float, short, byte, boolean)
2) 참조형 매개변수(reference)
: 변수의 값을 읽고 변경 , 특정 객체를 간접적으로 가리키는 변수(주소저장) (String, int[], ..)
public class ReferenceTest{
public static void main(String[] args){
//기본형
int money = 10000;
System.out.print(money + " -> " ); // 10000 ->
zero(money);
System.out.println(money); // 10000 -> 10000
//참조형(reference)
Money m1 = new Money(10000);
System.out.print(m1.getWon() + " -> "); // 10000 ->
zero(m1);
System.out.println(m1.getWon()); // 10000 -> 0
}
static void zero(int d){
d=0 ;
}
static void zero(Money m){
m.won = 0;
}
}
class Money {
int won;
Money(int w){
won=w;
}
public int getWon(){
return won;
}
}
- >그림으로 설명하자면,
1. int money는 값 자체 =10000 이고, 복사해서 d가 바껴도 원래 값 자체인 money = 10000 이 바뀌지 않음
2. m1은 Money 인스턴스 won을 가리키는 주소값이고, 이를 갖고 옴(주소를),
zero()를 통해 참조변수 m이 m1을 갖고 옴(주소를)
m과 m1은 같은 주소를 바라보게 되고, m.won=0을 통해 인스턴스의 won이 0으로 변경되었고,
m1도 참조하고 있었던 인스턴스니 자동으로 m의 값도 0으로 바뀜
- 클래스 메서드와 인스턴스 메서드
- 클래스 메서드 (static)
① 객체 생성 하지 않아도 되며, '클래스이름, 메서드이름()'으로 호출
② 인스턴스멤버와 관련없는 메소드
③ 메서드 내에서 인스턴스 변수 사용불가!
-> 왜 ??? 인스턴스 변수는 객체 생성 후 사용이 가능하고, static 변수나 메서드는 언제나 호출이 가능하다. 객체가 생성되었는지 안되었는지 모르는 상태에서 부를 수 없기 때문에 사용이 불가!!
- 인스턴스 메서드
① 인스턴스 생성 후, '참조변수. 메서드이름()'으로 호출
② 인스턴스 멤버와 관련 작업하는 메서드
③ 메서드 내에 인스턴스 변수 사용 가능
** 아래 코드를 보며 인스턴스변수 사용가능 여부를 확인해보자
class Student {
String name = "haheaven" ; //인스턴스변수
static String className = "JavaClass" ; //클래스변수
void instanceMethod1(){ //인스턴스메소드
System.out.println(name);
System.out.println(className); //클래스변수 언제든지 호출가능(고정)
}
static void staticMethod1() { //클래스메소드
// System.out.println(name); //error!! 클래스 메소드 인스턴스변수 사용불가
// Student s3 = new Student(); // 인스턴스 객체를 생성하면
// System.out.println(s3.name); //호출 가능
System.out.println(className);
}
void instanceMethod2(){ //인스턴스메소드
instanceMethod1(); //instanceMethod의 객체가 생성되었으므로 호출 가능
staticMethod1(); //클래스메소드 언제나 호출 가능
}
static void staticMethod2() { //클래스메소드
//instanceMethod1(); //error!! 인스턴스메소드1이 생성되었는지 모르기때문에
Student s2 = new Student(); //인스턴스 생성하면
s2.instanceMethod1(); //인스턴스 메서드 호출가능
staticMethod1(); //클래스 메서드 호출가능
}
}
main() 호출시,
class MethodTest {
public static void main(String[] args) {
Student s1 = new Student(); // 객체를 생성해야지 instance메서드 호출가능..
s1.instanceMethod1(); // 결과값 : haheaven \n JavaClass
System.out.println();
Student.staticMethod1(); // 결과값 : JavaClass
System.out.println();
s1.instanceMethod2(); // 결과값 : haheaven \n JavaClass \n JavaClass
System.out.println();
Student.staticMethod2(); // 결과값 : haheaven \n JavaClass \n JavaClass
}
}
참고 : 자바의정석(남궁성), cloudstudying
'JAVA' 카테고리의 다른 글
JAVA_상속 (0) | 2021.07.31 |
---|---|
JAVA_오버로딩(Overloading)과 오버라이딩(Overriding) (0) | 2021.07.29 |
JAVA_JVM 메모리 구조 (0) | 2021.07.28 |
JAVA_객체지향 프로그래밍2(변수, 메서드) (0) | 2021.07.28 |
JAVA_객체지향 프로그래밍1(OOP, 클래스, 객체, 인스턴스) (0) | 2021.07.28 |
댓글