본문 바로가기

Java/문법

10-4장 인스턴스 필드와 정적 멤버의 중복

1. 인스턴스 필드의 중복

 

 - 인스턴스 필드는 상속받은 필드와 동일한 이름으로 자식 클래스에서 정의해도 각각의 저장공간에 정의되므로 오버라이딩은 발생하지 않는다.

 

 - 클래스 B는 A를 먼저 상속받은 후 필드를 동일한 이름으로 선언하고, 값을 4로 초기화

class A {
	int m =3;
}

class B extends A {
	int m = 4;
}

1)  A a = new A(); -> a.m =3

 - A() 생성자로 선언하고 A타입으로 선언

 - 힙 메모리에는 m =3인 필드를 포함하고 있는 객체가 생성

 - A 타입으로 선언돼 있으므로 참조변수는 이 A타입의 객체를 가리키고 있음

 

2) B b = new B(); ->b.m =4

 

 

- B()로 B 객체를 생성하는 과정에서 먼저 부모 객체인 A 객체가 먼저 생성 

- B 객체 속에는 필드 m의 값 2개 존재 

- 부모 클래스에서 만든 필드 m(=3), 자식 클래스에서 만든 필드 m(=4)

- 인스턴스 필드는 이름이 중복되더라도 객체 내의 각각의 공간속에 저장 

- 저장 공간이 완벽하게 분리돼 있으므로 오버라이딩 발생X

 

3) A ab = new B(); -> ab.m=3

 

- A 타입으로 선언됐기 때문에 A 객체를 가리키고 있음 

- A 객체에는 1개의 m값(=3)만 포함하고 있으므로 ab.m =3의 결과가 나타남

 

2. 정적 필드의 중복 

 

 - 정적 필드의 저장 공간은 정적 영역의 클래스 내부에 만들어지고, 모든 객체가 공유

 - 정적 필드는 객체를 생성하지 않아도 사용 가능

 - 상속할 때 정적 필드명을 중복해 정의해도 저장공간이 분리돼 있으므로 오버라이딩은 발생하지 않음

 

 -  클래스 A는 정적 필드 m=3을 포함하고 있고 ,이를 상속한 클래스 B에서도 동일한 이름의 정적 필드 m=4를 정의 

class A {
	static int m = 3;
}

class B extends A {
	static int m = 4;
}

 

 1)  A a = new A();  -> a.m = 3

A.m = 3; //A객체를 생성하지 않고 필드값 지정

A a = new A(); //A 객체를 생성한 후 필드값 지정
a.m=3

 - 클래스 영역의 클래스 A 내에 정적필드 m=3의 값이 저장 

 

2) B b = new B(); -> b.m = 4

A.m = 3;
B.m = 4; // A,B 객체를 생성하지 않고 필드값 지정

B b = new B(); //B 객체를 생성한 후 필드값 지정
b.m = 4;

 - 클래스 A와 B 내에 포함된 정적 필드의 저장공간은 완벽하게 분리

 - 오버라이딩 발생 x

 

3) A ab = new B(); -> ab.m = 3

A.m = 3; //A,B 객체를 생성하지 않고 필드값 지정
B.m = 4;

A ab = new B(); //B객체를 A타입으로 지정한 후 필드값 지정
ab.m =3;

 - A 타입이 가리키는 객체 속의 m값. A.m = 3과 동일한 의미 

 - 주 클래스의 정적 필드 저장 공간은 완벽히 분리돼 있으므로 오버라이딩 발생 x

 

3. 정적 메서드의 중복 

 

 - 정적 메서드는 각자의 클래스 내부에 존재, 즉 다른 공간에 저장

 - 부모 클래스의 정적 메서드는 부모 클래스의 내부, 자식 클래스의 정적 메서드는 자식 클래스의 내부에 저장 

 - 부모 클래스의 정적 메서드와 동일한 이름으로 자식 클래스에서 정의한다 하더라도 절대 오버라이딩되지 않음

 

package Overlampmember;

class A {
	static void print() {
		System.out.println("A 클래스");
	}
}

class B extends A {
	static void print() {
		System.out.println("B클래스");
	}
}

public class OVerlapmember1 {
	public static void main(String[] args) {
		//클래스명으로 바로 접근
		A.print();
		B.print();
		System.out.println();
		
		//객체 생성 
		A aa = new A();
		B bb = new B();
		A ab = new B();
		
		//객체를 통한 메서드 호출
		aa.print();
		bb.print();
		ab.print();
	}

}

 

4. 인스턴스 멤버와 정적 멤버의 중복 정리 

 

 -  인스턴스 메서드는 객체가 어떤 생성자로 생성됐는지,

 -  인스턴스 필드, 정적 필드, 정적 메서드는 어떤 타입으로 선언됐는지가 기준 

 

인스턴스 필드  오버라이딩 x
인스턴스 메서드  오버라이딩 o  -> 메서드 오버라이딩
정적 필드 오버라이딩 x
정적 메서드 오버라이딩 x