티스토리 뷰

Java/JAVA의 정석_객체지향

Super VS Super()

Jenny_yoon 2022. 10. 31. 10:29
728x90
반응형

1) Super 특징

- 객체 자신을 가리키는 참조변수

- 인스턴스 메서드(생성자)내에만 존재 (static 메서드 내에서 사용불가)

- 조상의 멤버를 자신의 멤버와 구별할 때 사용 (this는 lv와 iv구별에 사용)

 

ex. Super 예시

class Parent { int x = 10; } //super.x

class Child extends Parent {
	int x = 20; //this.x
	
	void method() {
		System.out.println("x="+x);
		System.out.println("this.x="+this.x);
		System.out.println("super.x="+super.x);
	}
}
public class Ex7_2 {
	public static void main(String[] args) {
		Child c = new Child();
		c.method();
	}
}
더보기

실행결과 :

x=20

this.x=20

super.x=10

 

2) Super() 특징

- 조상의 생성자(호출할 때 사용)

- 조상의 멤버는 조상의 생성자를 호출해서 초기화

 

ex. Super() 예시

class Point {
	int x, y;
    
    point(int x, int y) {
    	this.x = x;
        this.y = y;
    }
}

위를 코드를 아래와 같이 Point3D로 iv초기화를 하였다. (line 4~6)

class Point3D extends Point {
	int z;
    Point3D(int x, int y, int z) {
    	this.x = x; //조상의 멤버를 초기화
        this.y = y; //조상의 멤버를 초기화
        this.z = z;
     }
}

하지만 조상의 멤버는 조상이 Super()를 사용해 초기화 해야하기 때문에 아래와 같이 변경해야한다. (line 2)

Point3D(int x, int y, int z) {
    super(x, y); //조상클래스의 생성자 Point(int x, int y)를 호출
    this.z = z;  //자신의 멤버를 초기화
}

생성자의 첫 줄에 반드시 생성자를 호출해야 한다. 그렇지 않으면 컴파일러가 생성자의 첫줄에 super();를 삽입

ex. 예시

class Point {
    int x;
    int y;
    
    Point() {
    	this(0,0);      //첫줄에 생성자 호출
    }
    Point(int x, int y) {
    	this.x = x; 	//첫출에 생성자 호출이 안됨. 따라서 첫 줄에 super();가 삽입되어야함.
        this.y = y;
    }
}

위 예시에 super();가 삽입되면서 아래와 같이 변경된다.

class Point extends Object {
    int x;
    int y;
    
    Point() {
    	this(0,0);
    }
    Point(int x, int y) {
    	super(); 	//조상인 Object의 기본생성자 생성됨
        this.x = x;
        this.y = y;
    }
}

ex.예시2

더보기

에러내용 : Point생성자가 없다는 에러 발행. 에러발생 위치는 Point3D 선언문.

모든 생성자는 첫줄에 다른 생성자를 호출해야한다 규칙을 지켜야 한다!

:  하지만 생성자 호출이 되지 않아 위와 같이 자동으로 Super();가 추가됨 (Object의 생성자)

 

 

: 자동 Super();추가

(Point의 생성자)

 

 

 

Point3D 내의 super(); 를 호출하려면 Point()를 호출하게 된다. 하지만 Point 클래스 내에 기본 생성자가 없어서 Point기본 생성자가 없다고 오류 발생. 왜냐하면 Point클래스에 이미 Point 생성자가 하나 있어서 컴파일러가 기본 생성자를 자동으로 추가해 주지 않음.

더보기

오류 해결 법

  • Point{} 기본 생성자를 추가해 준다.
    (클래스 만들때 기본생성자 작성 필수 !!!! )

    or

  • 아래와 같이 조상의 생성자 Point(int x, int y)를 호출
      Point3D(int x, int y, int z) {
         super(x,y);
         this.z = z;
      }

* 2번째 방법 사용한다고 해도 기본생성자는 항상 생성해주는것이 좋다.

 

 

728x90
반응형

'Java > JAVA의 정석_객체지향' 카테고리의 다른 글

import문  (0) 2022.10.31
패키지(package)  (0) 2022.10.31
오버라이딩(Overriding)  (0) 2022.10.30
포함(Composite)  (0) 2022.10.30
상속(Inheritance)  (0) 2022.10.30
댓글
250x250
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday