티스토리 뷰

반응형

 

🤔 참조변수 super란?

✔ 객체 자신을 가리키는 참조변수. 인스턴스 메서드(생성자) 내에서만 존재

✔ 조상의 멤버를 자신의 멤버와 구별할 때 사용

 

 

🤔 this와 super의 차이점?

this : 지역변수(local variable)와 인스턴스 변수(instance variable)의 구분에 사용

super : 조상의 멤버와 자신의 멤버 구분에 사용

 

다음의 예제를 보자.

class T2 {
    public static void main(String[] args) {
        Child c = new Child();
        c.method();
    }
}

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);
    }
}

 

출력결과는 다음과 같다.

x = 20
this.x = 20
super.x = 10

 


 

 

🤔 super() 란?

조상의 생성자

✔ 조상의 생성자를 호출할 때 사용

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

✔ 생성자의 첫 줄에 반드시 생성자를 호출해야 한다. ⭐⭐

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

 

다음의 코드를 보자.

class T2 {
    public static void main(String[] args) {
        Point3D p3 = new Point3D(1, 2, 3);
    }
}

class Point {
    int x;
    int y;

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

    String getlocation() {
        return "x : " + x + ", y : " + y;
    }
}

class Point3D extends Point {
    int z;

    Point3D(int x, int y, int z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }

    String getLocation() { // 오버라이딩
        return "x : " + x + ", y : " + y + ", z : " + z;
    }
}

 

위 코드를 실행시키면 어떻게 될까?

문제가 있지 않은가?

 

코드를 실행시키면 다음과 같은 컴파일 에러가 난다.

컴파일 에러

 

Poitn3D(int x, int y, int z)에서 에러가 난다고 하는데

왜 에러가 나는 것일까?

 

위에서 말했다 싶이

✔ 생성자의 첫 줄에 반드시 생성자를 호출해야 한다. ⭐⭐

 

근데 24번째줄의 생성자를 생성하면서

생성자를 호출하지 않았다.

때문에 컴파일러가 자동으로 super();를 넣고 실행하는데

 

super()의 경우 상속받은 부모이기 때문에

위의 예시에서 Point();이다.

 

근데 코드에서 Point(int x, int y) 생성자만 생성해주었고

Point(){}의 기본 생성자는 생성해주지 않았다.

 

심지어 Point(int x, int y)의 생성자가 없었다면

컴파일러가 자동으로 default constructor를 생성해주었을 텐데

위 예제에서는 생성자가 있기 때문에 Point(){} 의 기본 생성자를 추가로 정의해야 한다.

 

 

➕ 수정된 코드를 보자.

class T2 {
    public static void main(String[] args) {
        Point3D p3 = new Point3D(1, 2, 3);
    }
}

class Point {
    int x;
    int y;
    

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

    String getlocation() {
        return "x : " + x + ", y : " + y;
    }
}

class Point3D extends Point {
    int z;

    Point3D(int x, int y, int z) {
        super(x, y);
        this.z = z;
    }

    String getLocation() { // 오버라이딩
        return "x : " + x + ", y : " + y + ", z : " + z;
    }
}

다음과 같이 수정하면 된다.

 


🤔 패키지(package)란?

서로 관련된 클래스의 묶음

 

🤔 패키지의 선언

✔ 패키지는 소스파일의 첫 번째 문장으로 단 한 번 선언

✔ 같은 소스 파일의 클래스들은 모두 같은 패키지에 속하게 된다.

✔ 패키지 선언이 없으면 이름없는(unnamed) 패키지에 속하게 된다.

 


🤔 static import문이란?

static 멤버를 사용할 때 클래스 이름을 생략할 수 있게 해준다.

 

 import static java.lang.Integer.*; // Ingeter클래스의 모든 static 메서드
 import static java.lang.Math.random; // Math.random()만. 괄호 안붙임.
 import static java.lang.System.out; // System.out을 out만으로 참조가능
 
// System.out.println(Math.random()); // 다음의 문장을
 
 out.println(random()); // 다음과 같이 사용할 수 있음.
 import static java.lang.Integer.*; // Ingeter클래스의 모든 static 메서드
 import static java.lang.Math.PI;
 import static java.lang.Math.random; // Math.random()만. 괄호 안붙임.
 import static java.lang.System.out; // System.out을 out만으로 참조가능

public class T2 {
    public static void main(String[] args) {
//        System.out.println(Math.random());
        out.println(random());

//        System.out.println("Math.PI : Math.PI");
        out.println("Math.PI : " + PI);
    }
}
 

 

 

🤔 static import문 사용 이유?

코드를 단축하기 위해서!! 

 


오늘도 열공하자. 🔥

반응형