안녕하세요, 코린이의 코딩 학습기 채니 입니다.
개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.
☞ 인스턴스 메소드
- 반드시 객체 생성 후에 사용 가능
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)을 호출하였습니다.
'Java > Java' 카테고리의 다른 글
메소드) call by value, call by reference (0) | 2022.03.17 |
---|---|
메소드) 메소드 오버로딩, 메소드 시그니처란? (0) | 2022.03.17 |
접근 제한자) 멤버 및 생성자의 접근 제한자, 클래스의 접근 제한자 (0) | 2022.03.16 |
변수) 인스턴스 변수의 초기화 순서, static 변수의 초기화 순서 (0) | 2022.03.16 |
변수) 변수 별 생명 주기 Liftcycle (0) | 2022.03.16 |