인스턴스 메서드와 클래스 메서드
클래스 메서드 = static 메서드
ㄴ static 붙은 메서드
ㄴ 클래스 이름으로 호출할 수 있음
ㄴ 호출 시 => 클래스명.메서드명();
ㄴ "클래스 메서드"를 인스턴스 주소를 사용하여 호출할 수 있지만, 다른 개발자가 그냥 "인스턴스 메서드"인 줄 착각할 수 있기 때문에 이렇게 호출하지 말기를 권고
인스턴스 메서드 = non-static 메서드
ㄴ static 이 붙지 않은 메서드
ㄴ 인스턴스 주소가 있어야만 호출할 수 있음
ㄴ 인스턴스 메서드는 클래스 이름으로 호출할 수 없음
ㄴ 인스턴스 메서드는 반드시 인스턴스 주소를 사용하여 호출해야 함
// 인스턴스 메서드와 클래스 메서드
package com.eomcs.oop.ex03;
public class Exam0210 {
static class A {
//1) 클래스 메서드 = static 메서드
// => static 붙은 메서드
// => 클래스 이름으로 호출할 수 있음
static void m1() {
System.out.println("m1()");
}
//2) 인스턴스 메서드 = non-static 메서드
// => static 이 붙지 않은 메서드
// => 인스턴스 주소가 있어야만 호출할 수 있음
void m2() {
System.out.println("m2()");
}
}
public static void main(String[] args) {
// 클래스 메서드 호출
// 문법) 클래스명.메서드명();
A.m1(); // OK!
// => 인스턴스 메서드는 클래스 이름으로 호출할 수 없다.
// A.m2(); // 컴파일 오류!
A obj1 = new A();
obj1.m1(); // OK! 그런데, 이렇게 하지 말기
// 물론 "클래스 메서드"를 인스턴스 주소를 사용하여 호출할 수 있지만,
// 다른 개발자가 그냥 "인스턴스 메서드"인 줄 착각할 수 있기 때문에
// 이렇게 호출하지 말기를 권고
obj1.m2(); // OK! 인스턴스 메서드는 반드시 인스턴스 주소를 사용하여 호출해야 함
A obj2 = null;
obj2.m2(); // 컴파일은 OK! 실행은 오류!
// 왜? obj2 변수에 들어 있는 인스턴스 주소가 무효하기 때문이다.
}
}
// 결론!
// 클래스 메서드(=스태틱 메서드)
// => 인스턴스 변수를 사용하지 않을 경우 클래스 메서드로 선언하라!
// 인스턴스 메서드
// => 인스턴스 변수를 사용할 경우 인스턴스 메서드로 선언하라!
// 실무
// => 일단 인스턴스 메서드로 무조건 만들라!
// => 인스턴스 변수를 완전히 사용하지 않음을 확신하면
// 그 때 클래스 메서드로 전환하라!
ㄴ 인스턴스 변수를 사용하지 않을 경우 클래스 메서드(스태틱 메서드)로 선언하자
ㄴ 인스턴스 변수를 사용할 경웅 인스턴스 메서드로 선언하자
ㄴ 실무에서는 일단 인스턴스 메서드로 무조건 만들고 인스턴스 변수를 완전히 사용하지 않음을 확신하면 그 때 클래스 메서드(스태틱 메서드)로 전환하자
인스턴스 메서드 - 내장 변수 this
ㄴ 클래스 메서드(스태틱 메서드)는 인스턴스 주소 없이 호출되기 때문에 인스턴스 주소를 받는 내장 변수가 없음
=> this 사용하지 않음
ㄴ 인스턴스 메서드는 인스턴스 주소가 있어야만 호출되기 때문에 인스턴스 주소를 받을 변수가 내장되어 있음
=> this 를 사용함
ㄴ 인스턴스 변수를 사용할 때 this 를 생략할 수 있는데, 이럴 경우 컴파일 시 앞에 자동으로 this 가 붙음
ㄴ 로컬 변수의 이름이 인스턴스의 이름과 같을 경우 this 를 붙이지 않으면 로컬 변수를 가리키므로 로컬 변수가 아닌 인스턴스 변수를 가리키고 싶으면 this 를 붙여야 함
ㄴ 컴파일 결과 클래스 파일을 통해 인스턴스 메서드는 인스턴스 주소를 받을 this 라는 내장변수가 생성되는 것을 확인할 수 있음
// 인스턴스 메서드 - 내장 변수 this
package com.eomcs.oop.ex03;
public class Exam0220 {
static class A {
int value;
static void m1() {
// 클래스 메서드는 인스턴스 주소 없이 호출되기 때문에
// 인스턴스 주소를 받는 내장 변수가 없다.
// this.value = 100; // 컴파일 오류!
}
void m2() {
// 인스턴스 메서드는 인스턴스 주소가 있어야만 호출되기 때문에
// 인스턴스 주소를 받을 변수가 내장되어 있다.
this.value = 100;
}
void m3() {
// 인스턴스 변수를 사용할 때 this를 생략할 수 있다.
//this.value = 200;
value = 200; // 앞에 자동으로 this가 붙는다.
}
void m4(int value) {
// 로컬 변수의 이름이 인스턴스 이름과 같을 경우
// this를 붙이지 않으면 로컬 변수를 가리킨다.
value = 200; // 로컬 변수이다.
this.value = 300; // 인스턴스 변수이다.
// 따라서 로컬 변수가 아닌 인스턴스 변수를 가리키고 싶으면 this를 붙여야 한다.
}
}
public static void main(String[] args) {
// 클래스 메서드는 인스턴스 주소 없이 클래스 이름으로 호출한다.
// 그래서 클래스 메서드는 this라는 내장 변수가 없는 것이다.
A.m1();
A obj1 = new A();
// 인스턴스 메서드는 인스턴스 주소가 있어야만 호출할 수 있기 때문에
// 인스턴스 메서드에는 인스턴스 주소를 받을 수 있는 내장 변수 this가 있다.
obj1.m2();
// 물론 클래스 메서드도 레퍼런스를 가지고 호출할 수 있지만,
// 인스턴스 주소가 메서드에 전달되지 않는다.
// 그래서 클래스 메서드는 내장 변수 this가 없다.
obj1.m1();
A obj2 = new A();
// 인스턴스 메서드의 this 변수는 메서드를 호출할 때 전달한 인스턴스 주소 값을 가진다.
// 그래서 메서드가 호출될 때 마다 this 변수의 값이 바뀐다.
obj2.m2();
obj2.m3();
obj2.m4(100);
}
}
ㄴ 클래스 메서드(스태틱 메서드)는 인스턴스 주소 없이 클래스 이름으로 호출하므로 클래스 메서드는 this 라는 내장 변수가 없는 것
'네이버클라우드 > JAVA 웹 프로그래밍' 카테고리의 다른 글
JAVA 16일차 (2023-06-14) 자바 기초 DAY14_인스턴스 필드와 인스턴스 메서드, 생성자와 의존 객체 주입_개인 프로젝트 - 마트 관리 시스템 (0) | 2023.06.14 |
---|---|
JAVA 16일차 (2023-06-14) 자바 기초 DAY14_CRUD 구현 / 스태틱 필드의 한계 확인_개인 프로젝트 - 마트 관리 시스템 (0) | 2023.06.14 |
JAVA 15일차 (2023-06-13) 자바 기초 DAY13_게시판 관리 기능 추가 (0) | 2023.06.13 |
JAVA 15일차 (2023-06-13) 자바 기초 DAY13_변수의 종류 (2) | 2023.06.13 |
JAVA 14일차 (2023-06-12) 자바 기초 DAY12_개인 프로젝트 - 마트 물품 관리 시스템 (0) | 2023.06.12 |