본문 바로가기
Java/Java

메소드) 인스턴스 메소드, static 메소드

by 박채니 2022. 3. 17.
SMALL

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


☞ 인스턴스 메소드

- 반드시 객체 생성 후에 사용 가능

public class MethodStudy1 {
	
	public static void main(String[] args) {
		MethodStudy1 study = new MethodStudy1();
		study.test1();
	}
	
	public void test1() {
		System.out.println("instance 메소드");
	}
}

@콘솔출력값
instance 메소드

멤버/인스턴스 필드와 마찬가지로 인스턴스(멤버)메소드 또한 객체 생성 후 사용할 수 있습니다.

 

☞ static 메소드

- 객체 생성 없이도 사용 가능 (클래스명으로 호출)

public class MethodStudy1 {
	
	public static void main(String[] args) {
		MethodStudy1.test2();
	}
	
	public static void test2() {
		System.out.println("static 메소드");
	}
}

@콘솔출력값
static 메소드

static 메소드는 객체 생성 없이 클래스명으로도 바로 접근 가능하며, 객체로도 호출할 수 있습니다.

(단, 객체 생성하여 호출하는 방식은 권장하지 않음!!)


☞ 인스턴스 메소드 안에서 사용할 수 있는 필드와 메소드

public class MethodStudy1 {
	
	int a = 100;
	static int b = 99;
	
	public static void main(String[] args) {
		MethodStudy1 study = new MethodStudy1();
		study.test1();
//		MethodStudy1.test2();
	}
	
	public void test1() {
		System.out.println("instance 메소드");
		System.out.println("멤버변수 : " + a);
		System.out.println("클래스변수 : " + b);
		test2();
	}
	
	
	public static void test2() {
		System.out.println("static 메소드");
//		System.out.println("멤버변수 : " + a);
		System.out.println("클래스변수 : " + b);
	}
}

@콘솔출력값
instance 메소드
멤버변수 : 100
클래스변수 : 99
static 메소드
클래스변수 : 99

인스턴스 메소드 안에서는 인스턴스 변수, static 변수, static 메소드 모두 위치할 수 있는 것을 알 수 있습니다.

 

☞ static 메소드 안에서 사용할 수 있는 필드와 메소드

public class MethodStudy1 {
	
	int a = 100;
	static int b = 99;
	
	public static void main(String[] args) {
		MethodStudy1 study = new MethodStudy1();
//		study.test1();
		MethodStudy1.test2();
	}
	
	public void test1() {
		System.out.println("instance 메소드");
		System.out.println("멤버변수 : " + a);
		System.out.println("클래스변수 : " + b);
		test2();
	}
	
	
	public static void test2() {
		System.out.println("static 메소드");
//		System.out.println("멤버변수 : " + a); //Cannot make a static reference to the non-static field a 
		System.out.println("클래스변수 : " + b);
//		test1(); //Cannot make a static reference to the non-static method test1() from the type MethodStudy1
	}
}

@콘솔출력값
static 메소드
클래스변수 : 99

하지만 static 메소드 안에서는 인스턴스 필드와 인스턴스 메소드는 사용이 불가하였습니다.

위와 같은 에러 메세지가 발생하는 것을 확인할 수 있었습니다.

 

그 이유는?

static 멤버 (static 필드, static 메소드)는 객체 생성 없이 실행 되어야 하며, 인스턴스 멤버 (인스턴스 필드, 인스턴스 메소드)는 반드시 객체 생성 후에 이용할 수 있습니다.

static 멤버들의 생명 주기는 클래스 최초 사용 시작 ~ 프로그램 종료 시까지라고 하였습니다.

즉, 가장 빨리 생성되며 가장 늦게 소멸 되는 멤버들입니다.

 

따라서 먼저 생성된 메소드에서 뒤늦게 만들어진 객체를 참조할 수 없다는 것입니다.

(인스턴스 멤버들은 객체 생성 ~ 객체 소멸까지의 생명 주기를 갖고 있음)

※ 정적 메소드 내에서 인스턴스 멤버를 사용한다면 결국 정적 메소드도 객체 생성 후 동작할 수 있을 것!!!

※ 정적 메소드 내에서는 클래스 내부에서 자신의 객체를 가리키는 this 키워드 사용 불가!!!

 

부득이 하게 static 메소드에서 인스턴스 필드/메소드를 꼭! 사용해야 한다면,

객체를 생성하여 호출은 가능합니다.

public class MethodStudy1 {
	
	int a = 100;
	static int b = 99;
	
	public static void main(String[] args) {
		MethodStudy1 study = new MethodStudy1();
		study.test1();
		MethodStudy1.test2();
	}
	
	public void test1() {
		System.out.println("instance 메소드");
		System.out.println("멤버변수 : " + a);
		System.out.println("클래스변수 : " + b);

		test2();	//MethodStudy1. 생략
		test3();	//this. 생략
	}
	
	
	public static void test2() {
		System.out.println("static 메소드");
//		System.out.println("멤버변수 : " + a);
		System.out.println("클래스변수 : " + b);
//		test1();	//Cannot make a static reference to the non-static method test1() from the type MethodStudy1
		new MethodStudy1().test3();
	}
	
	public void test3() {
		System.out.println("test3");
	}
}

@콘솔출력값
instance 메소드
멤버변수 : 100
클래스변수 : 99
static 메소드
클래스변수 : 99
test3
test3
static 메소드
클래스변수 : 99
test3

static 메소드에서 new MethodStudy1().test3()으로 객체 생성하여 인스턴스 메소드(test3)을 호출하였습니다.

 

LIST