1. 학습목표
클래스 메서드와 인스턴스 메서드를 이해할 수 있다.
2.필요 개념 문장정리
클래스 메서드와 인스턴스 메서드
- 메서드 앞에 static이 붙어 있으면 클래스메서드이고 붙어 있지 않으면 인스턴스 메서드이다.
- 클래스 메서드도 객체를 생성하지 않고도 클래스이름.메서드이름(매개변수)로 호출이 가능하다. 인스턴스 메서드는 반드시 객체를 생성해야만 호출할 수 있다.
- 클래스를 설계할 때 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다.
- 클래스 변수는 인스턴스를 생성하지 않아도 사용할 수 있다.
- 클래스 메서드는 인스턴스 변수를 사용할 수 없다.
- 메서드 내에서 인스턴스 변수를 사용하지 않는다면 static을 붙이는 것을 고려한다.
- 같은 클래스에 속한 멤버들 간에는 별도의 인스턴스를 생성하지 않고도 서로 참조 또는 호출이 가능하다.
- 클래스멤버가 인스턴스 멤버를 참조 또는 호출하고자 하는 경우에는 인스턴스를 생성해야 한다.
- 인스턴스 멤버가 존재하는 시점에 클래스 멤버는 항상 존재하지만 클래스멤버가 존재하는 시점에 인스턴스 멤버가 존재하지 않을 수도 있기 때문이다.
- 같은 클래스 내의 메서드는 서로 객체의 생성이나 참조변수 없이 직접 호출이 가능하지만 static메서드는 인스턴스 메서드를 호출할 수 없다.
- 메서드간의 호출과 만찬가지로 인스턴스 메서드는 인스턴스변수를 사용할 수 있지만 static메서드는 인스턴스변수를 사용할 수 없다.
3. 코드작성
class MemberCall {
int iv = 10;
static int cv = 20;
int iv2 = cv;
static int cv2 = iv; // 에러. 클래스변수는 인스턴스 변수를 사용할 수 없음.
static int cv2 = new Mwmbercall().iv; // 이처럼 객체를 생성해야 사용가능.
static void staticmethod1() {
System.out.println(cv);
System.out.println(iv); //에러. 클래스메서드에서 인스턴스변수를 사용불가.
membercall c = new MemberCall();
System.out.println(c.iv); // 객체를 생성한 후에야 인스턴스변수의 참조가능.
}
void instanceMethod1() {
System.out.println(cv);
System.out.println(iv); // 인스턴스메서드에서는 인스턴스변수를 바로 사용가능.
}
static void staticMethod2() {
staticMethod1();
instanceMethod1(); //에러. 클래스메서드에서는 인스턴스메서드를 호출할 수 없음.
MemberCall c = new MemberCall();
c.instanceMethod1(); // 인스턴스를 생성한 후에야 호출할 수 있음.
}
void instanceMethod2() { //인스턴스메서드에서는 인스턴스메서드와 클래스메서드 모두 인스턴스 생성없이 바로 호출이 가능.
staricMeethod1();
instanceMethod1();
}
}
- 클래스멤버는 언제나 참조,호출이 가능하기 떄문에 인스턴스멤버가 클래스멤버를 사용가능하다. 클래스멤버간 참조,호출도 가능
- 인스턴스멤버는 반드시 객체를 생성한 후에만 참조, 호출이 가능하다.
- 실제로 같은 클래스 내에서 클래스멤버가 인스턴스멤버를 참조,호출해야하는 경우는 드물다. 인스턴스메서드로 작성해야할 메서드를 클래서메서드로 한것은 아닌지 확인해봐야한다.
4. 마무리
클래스 멤버와 인스턴스 멤버를 구분하고 객체를 생성하여 사용하는 것을 이해할 수 있었다.
MemberCall c = new Membercal();
int result = c.instanceMethod1();
다음과 같이 한 줄로 할 수 있다.
int result = new MemberCall().instanceMethod1();
대신 참조변수를 선언하지 않았기 때문에 생성된 MemberCall인스턴스는 더 이상 사용할 수 없다.
주어진 코드에서 MemberCall c = new MemberCall();와 int result = new MemberCall().instanceMethod1();은 동일한 작업을 수행합니다. 그러나 참조 변수를 선언하지 않고 직접적으로 인스턴스를 생성하면, 생성된 인스턴스에 대한 참조를 따로 유지할 수 없게 됩니다.
- MemberCall c = new MemberCall();: 이 코드는 MemberCall 클래스의 새로운 인스턴스를 생성하고, 이를 c라는 참조 변수에 할당합니다. 이렇게 하면 c를 통해 생성된 인스턴스에 접근할 수 있습니다.
- int result = new MemberCall().instanceMethod1();: 이 코드는 MemberCall 클래스의 새로운 인스턴스를 생성하고, 바로 해당 인스턴스의 instanceMethod1() 메소드를 호출하여 결과를 result 변수에 할당합니다. 이 코드에서는 참조 변수를 사용하지 않고 직접 인스턴스를 생성하므로, 생성된 인스턴스에 대한 참조를 따로 유지할 수 없습니다.
따라서, 두 번째 코드에서는 new MemberCall()를 통해 생성된 인스턴스에 대한 참조 변수가 없기 때문에, 이 인스턴스는 한 번의 사용 이후에는 더 이상 참조되지 않으며, Java의 가비지 컬렉터에 의해 메모리에서 제거될 것입니다. 이는 임시적으로 사용되는 인스턴스에 대한 간단한 작업을 수행할 때 유용할 수 있습니다.
'언어 기초 > JAVA' 카테고리의 다른 글
[자바의정석 | Chapter 06 객체지향 프로그래밍1] 생성자 (0) | 2024.01.30 |
---|---|
[자바의정석 | Chapter 06 객체지향 프로그래밍1] 오버로딩 (0) | 2024.01.21 |
[자바의정석 | Chapter 06 객체지향 프로그래밍1] 메서드로 배열 다루기 (0) | 2024.01.17 |
[자바의정석 | Chapter 06 객체지향 프로그래밍1] 매개변수 (0) | 2024.01.17 |
[자바의정석 | Chapter 06 객체지향 프로그래밍1] 메서드 (0) | 2024.01.17 |