본문 바로가기
JAVA

JAVA_객체지향(매개변수, 메서드 구분 )

by haheaven 2021. 7. 28.

- 기본형 매개변수와 참조형 매개변수

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

댓글