🔥 Vamos/Java

0928 | 자바의 정석 기초편 :: ch6-26~6-31

unikue 2022. 9. 28. 23:23

static 메서드와 instance 메서드

 

class MyStudy{
	long a,b; // 인스턴스 변수 - 클래스 전체에서 사용 가능
    long add() // 인스턴스 메서드. 앞에 static이 없는 것.
    	return a+b;	// 인스턴스변수
    }
    
    static long add(long a, long b) { // 클래스 메서드. static이 붙어있음. 인스턴스변수 사용불가
    // long a, long b는 지역변수로 유효범위가 static 메서드 내부.
    	return a+b;	// 지역변수
     }
     
 
 public static void main(String[]args){
	System.out.println(MyStudy.add(200L,100L);	// 클래스이름.메서드이름 - 클래스메서드호출
	MyStudy mm = new MyStudy(); // 인스턴스 생성
		mm.a = 200L;	 
		mm.b = 100L;
	System.out.println(mm.add());}	//	참조변수.메서드이름 - 인스턴스메서드 호출
    }

* 프로그램을 짤때 STATIC을 붙일지 안붙일지 결정할 수 있어야 한다. IV를 안쓸때 붙이면 됨.

STATIC 메서드는 자기 작업에 필요한 것들을 매개변수로 모두 받아둠. 그래서 IV가 필요없음.(IV가 필요없다 == 객체가 필요없다)

인스턴스메서드는 매개변수가 없어서 IV가 필요하기도 하고, IV가 있기때문에 매개변수가 없기도 함. 그래서 STATIC 메서드와 차이가 나게됨.

 

✔ 인스턴스 메서드 ✔ 클래스 메서드(static 메서드)

: 인스턴스 변수나 인스턴스 메서드와 관련된 작업 진행
: 인스턴스 생성후 사용 가능
: 참조변수.메서드이름() 으로 호출
: 메서드 내에서 인스턴스 변수 사용 가능

: 인스턴스 변수나 인스턴스 메서드와 관련없는 작업
: 객체 생성 없이 사용 가능
: 클래스이름.메서드이름() 으로 호출
: 메서드 내에서 인스턴스 변수 사용 불가 >> 둘을 가르는 큰 차이점
: 메서드 내에서 인스턴스 변수를 사용하지 않는다면 static을 붙이는게 좋음
  Math.random()
Math.round()

👉 static 변수: 공통 속성에 static

👉 static 메서드: 공통적인 메서드라 static 메서드인게 아니고, iv안쓰면 붙임.

 

 

 

 


 

static 메서드와 instance 메서드간의 호출과 참조

 

 

👉 static 메서드는 인스턴스변수 (iv)를 사용할 수 없다.

class SAndI{
	int iv ; 	// 인스턴스 변수 - 객체 생성 후 사용 가능
    static int cv ; // 클래스 변수 - 항상 사용가능
    
    void instanceMethod(){		// 인스턴스 메서드 - 객체 생성 후 호출 가능 - 메서드 호출은 iv가 이미 있다는뜻
    	System.out.println(iv); // 인스턴스 변수 사용 가능
        Ststem.out.println(cv); // 클래스 변수 사용 가능
     	}
   
   static void staticMethod() {	// static 메서드
   		System.out.println(iv); // error! 인스턴스 변수 사용 불가. static 호출시 객체가 있을지 없을지 몰라서.
        System.out.println(cv); // 클래스 변수 사용 가능
        }
  }

 

 

👉 static 메서드는 인스턴스메서드 (im)를 사용할 수 없다.

class SAndI{
	void instanceMethod() {} 	// 인스턴스 메서드
    static void staticMethod() {} // static 메서드
    
    void instanceMethod2() {	// 인스턴스 메서드
    	instanceMethod();	// 다른 인스턴스메서드 호출
        staticMethod();		// static 메서드 호출 (항상 가능)
      }
  
  	static void staticMethod2(){	// static 메서드
    	instanceMethod();			// error!인스턴스 메서드 호출 불가.iv로 작업하는 메서드라 객체필요.
        statocMethod();				// static 메서드 호출가능
      }

 

 


 

오버로딩 (overloading)

: 한 클래스 안같은 이름의 메서드를 여러개 정의하는 것

: 매개변수는 다르지만 하는 작업이 같을때 오버로딩 사용

 

System.out.println()

System.out.println(int x)

System.out.println(char[] x)

System.out.println(object x)

 

void println()

void println(boolean x)

void println(int x)

 

컴파일러가 매개변수를 확인해서 그에 맞는 메서드를 연결.

 

 

✔ 오버로딩의 조건

: 메서드 이름이 같아야 한다

; 매개변수의 개수 or 타입이 달라야 한다

: 반환타입은 영향 없다 - 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 아니다.