static

윤주영·2024년 10월 25일

return문

반환타입이 void가 아닌 경우, 반드시 return문 필요

int multiply(int x, int y) {
 	int result = x * y;
 	return result; 	//반환 타입이 void가 아니므로 생략불가
}

int max(int a, int b) {
 	if(a > b) {
 		return a; 	//조건식이 참일 때만 실행된다.
	}
}

호출스택(call stack)

메서드 수행에 필요한 메모리가 제공되는 공간
메서드가 호출되면 호출스택에 메모리 할당, 종료되면 해제

기본형 매개변수

▶ 기본형 매개변수 - 변수의 값을 읽기만 할 수 있다. (resd only) 변경불가
▶ 참조형 매개변수 - 변수의 값을 읽고 변경할 수 있다. (read & write)

static 메서드와 인스턴스 메서드

class MyMath2 {
	long a, b;
	
	long add(){	//인스턴스 메서드
		return a + b;
	}
	
	static long add(long a, long b) {	//클래스 메서드(static메서드)
		return a + b;
	}
}

▶ 인스턴스 메서드

  • 인스턴스 생성 후, ' 참조변수.메서드이름() '으로 호출
  • 인스턴스 멤버와 관련된 작업을 하는 메서드
  • 메서드 내에서 인스턴스 변수 사용가능

▶ static 메서드(클래스메서드) - (객체생성없이 호출가능)

  • 객체생성없이 ' 클래스이름.메서드이름() '으로 호출
  • 인스턴스 멤버와 관련없는 작업을 하는 메서드
  • 메서드 내에서 인스턴스 변수 사용불가
class MyMathTest2 {
	public static void main(String args[]) {
		System.out.println(MyMath2.add(200L,100L));		//클래스메서드 호출
		MyMath2 mm = new MyMath2();		//인스턴스 생성
		mm.a = 200L;
		mm.b = 100L;
		System.out.println(mm.add());	//인스턴스메서드 호출
	}
}

static을 언제 붙여야할까?

▶ 속성(멤버 변수)중에서 공통 속성에 static을 붙인다.

class Card {
	//인스턴스 변수 (개별 속성)
	Strign kind;	// 무늬
	int number; // 숫자
	
	//클래스 변수 (공통 속성)
	static int width = 100;  // 폭
	static int height = 250;  // 높이
}

▶ 인스턴스 멤버를 사용하지 않는 메서드에 static을 붙인다.

class MyMath2 {
	long a,b;
	long add() { return a + b;}		// a, b는 인스턴스변수
	static long add(long a, long b) { return a + b;}	// a, b는 지역변수
}

메서드 간의 호출과 참조

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

class TestClass2 {
	int iv;		// 인스턴스 변수	(객체생성 후 사용가능)
	static int cv;		// 클래스 변수 (언제나 사용가능)
	
	void instanceMethod() {		// 인스턴스 메서드 (객체생성 후 호출가능)
		System.out.println(iv);		// 인스턴스 변수를 사용할 수 있다.
		System.out.println(cv);		// 클래스 변수를 사용할 수 있다. (언제든 사용)
	}
	
	static void staticMethod(){		// static메서드 (객체생성 없이 호출가능)
		System.out.println(iv);	// 에러!!!인스턴스 변수를 사용할 수 없다. (객체생성 후 호출가능)
		System.out.println(cv); 	// 클래스 변수는 사용할 수 있다. (항상 가능)
	}
}	//end of class

▶ static 메서드는 인스턴스 메서드(im)를 호출할 수 없다.

class TestClass {
	void instanceMethod(){}		// 인스턴스메서드
	static void staticMethod(){}	// static메서드
	
	void instanceMethod2(){		// 인스턴스메서드
		instanceMethod();		// 다른 인스턴스메서드를 호출한다.
		staticMethod();		// static메서드를 호출한다.
	}
	
	static void staticMethod2(){	// static메서드
		instanceMethod();		// 에러!!! 인스턴스메서드를 호출할 수 없다.
		staticMethod();		// static메서드는 호출할 수 있다.
	}
}	//end of class

static메서드 → 인스턴스메서드 호출이 안된다.
인스턴스메서드는 static메서드를 호출할 수 있다.

간단한 Q&A문제
Q. static메서드는 static메서드 호출가능?
A. 네
Q. static메서드는 인스턴스 변수 사용가능?
A. 아니오
객체라는 것은 iv묶음이라는것이다. iv를 쓸려면 객체가 생성되어야 사용 가능하다.
static메서드는 언제나 호출가능하다.
Q. static메서드는 인스턴스 메서드 호출가능?
A. 아니오
Q. 왜? static메서드 인스턴스 멤버를 쓸 수 없나요?
A. static메서드 호출시 객체(iv묶음)가 없을 수도 있어서

profile
반갑습니다.

0개의 댓글