자바 객체지향을 공부하다보면 상속을 배우고 상속을 배우다 보면 super라는 개념이 나온다.
처음에 볼때 이게 뭐지? 라는 생각이 드는 생소한 개념이지만 앞선 포스팅의 this와 유사하니 참고 하면 좋을것 같다!
2022.05.14 - [Programming/Java] - [JAVA] this()와 this 의 차이점!
[JAVA] this()와 this 의 차이점!
this()와 this 의 차이점! 우리는 자바를 공부하다보면 this()와 this를 볼 수 있는데 처음에는 '이게 같은건가?'라는 생각을 할 수 있지만 엄연히 둘은 전혀 관계가 없는 생성자와 참조변수이다! this( )
puenti.tistory.com
참조변수 super
- this : 인스턴스 자신을 가르키는 참조변수, lv와 iv를 구별하는데 사용
- super : this와 같음. 조상의 멤버와 자신의 멤버를 구별하는데 사용
- 조상의 멤버와 자신의 멤버를 구별하는데 사용된다는 점을 제외하고는 super와 this는 같다.
- 조상 클래스의 멤버와 자손 클래스의 멤버가 중복 정의되어 서로 구별할 경우에만 super를 사용하는 것이 좋다.
class SuperTest {
public static void main(String args[]) {
Child c = new Child();
c.method();
}
}
class Parent {
int x=10;
}
class Child extends Parent {
void method() {
System.out.println("x=" + x);
System.out.println("this.x=" + this.x);
System.out.println("super.x=" + super.x);
}
}
위 코드의 결과는
x=10
this.x = 10
super.x = 10
x, this.x, super.x 모두 같은 변수를 의미하므로 모두 같은 값이 출력되었다.
class SuperTest2 {
public static void main(String args[]) {
Child c = new Child();
c.method();
}
}
class Parent {
int x=10;
}
class Child extends Parent {
int x=20;
void method() {
System.out.println("x=" + x);
System.out.println("this.x=" + this.x);
System.out.println("super.x=" + super.x);
}
}
결과
x=20
this.x=20
super.x=10
superTest 예제와 달리 같은 이름의 멤버변수(int x)가 조상 클래스인 Parent도 있고 자손 클래스인 Child 클래스에도 있다.
super.x와 this.x는 서로 다른 값을 참조하게 되는데 super.x는 조상 클래스로부터 상속받은 멤버변수 x 이며,
this.x는 자손 클래스에 선언된 멤버변수를 뜻한다
조상 클래스의 생성자 super( )
- 자손 클래스의 인스턴스를 생성하면, 자손의 멤버와 조상의 멤버가 합쳐진 하나의 인스턴스가 생성된다.
- 조상의 멤버들도 초기화되어야 하기 때문에 자손의 생성자의 첫 문장에서 조상의 생성자를 호출해야 한다.
※ Object 클래스를 제외한 모든 클래스의 생성자 첫 줄에는 생성자를 호출해야 한다.
그렇지 않으면 컴파일러가 자동적으로 super(); 를 생성자의 첫 줄에 삽입한다.
인스턴스를 생성할 때는 클래스를 선택하는 것만큼 생성자를 선택하는 것도 중요하다!!!
- 클래스 : 어떤 클래스의 인스턴스를 생성할 것인가?
- 생성자 : 선택한 클래스의 어떤 생성자를 이용해서 인스턴스를 생성할 것인가?
class PointTest2{
public static void main(String args[]) {
Point3D p3 = new Point3D();
Systme.out.println("p3.x=" + p3.x);
Systme.out.println("p3.y=" + p3.y);
Systme.out.println("p3.z=" + p3.z);
}
}
class Point {
int x=10;
int y=20;
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
class Point3D extends Point{
int z = 30;
Point3D() {
this(100, 200, 300); // Point3D(int x, int y, int z)를 호출
}
Point3D(int x, int y, int z){
super(x, y); // Point(int x, int y)를 호출
this.z = z;
}
}
결과
p3.x=100
p3.y=200
p3.z=300
호출 순서
Point3D() → Point3D(int x, int y, int z) → Point(int x, int y) → Object()
'Programming > Java, Spring' 카테고리의 다른 글
[JAVA] 다형성(polymorphism)이란?? (0) | 2022.06.01 |
---|---|
[JAVA] 상속(inheritance)이란? / 상속의 특징 / 상속의 장점 / 예시 (0) | 2022.05.28 |
[JAVA] 오버라이딩이란?? / 오버라이딩 vs 오버로드 (0) | 2022.05.21 |
[JAVA] 변수 초기화란? / 명시적 초기화 / 변수의 초기화 시기와 순서 (0) | 2022.05.17 |
[JAVA / JSP] 자바 빈즈(Java Beans)란? / 빈즈(Beans)의 장점 / 빈즈(Beans) 클래스 구조 (0) | 2022.05.15 |