λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
BackEnd🌱/Java

[Java] super와 super()의 κ°œλ…

by μ•ˆμ£Όν˜• 2022. 3. 24.
λͺ©μ°¨
1. super의 κ°œλ…
2. super()의 κ°œλ… - (쑰상 클래슀 μƒμ„±μž)

 

1. super의 κ°œλ…

superλŠ” μžμ† ν΄λž˜μŠ€μ—μ„œ 쑰상 ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속받은 멀버λ₯Ό μ°Έμ‘°ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” μ°Έμ‘° λ³€μˆ˜μž…λ‹ˆλ‹€. 멀버 λ³€μˆ˜μ™€ μ§€μ—­λ³€μˆ˜μ˜ 이름이 같을 λ•Œ thisλ₯Ό λΆ™μ—¬μ„œ κ΅¬λ³„ν–ˆλ“―μ΄ 상속받은 멀버와 μžμ‹ μ˜ 멀버와 이름이 같을 λ•ŒλŠ” superλ₯Ό λΆ™μ—¬μ„œ ꡬ별할 수 μžˆμŠ΅λ‹ˆλ‹€.

 μ‘°μƒ ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속받은 멀버도 μžμ† 클래슀 μžμ‹ μ˜ λ©€λ²„μ΄λ―€λ‘œ superλŒ€μ‹  thisλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. (κ·Έλž˜λ„ 쑰상 클래슀의 멀버와 μžμ† 클래슀의 멀버가 쀑볡 μ •μ˜λ˜μ–΄ μ„œλ‘œ ꡬ별해야 ν•˜λŠ” κ²½μš°μ—λ§Œ superλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.)

 μ‘°μƒμ˜ 멀버와 μžμ‹ μ˜ 멀버λ₯Ό κ΅¬λ³„ν•˜λŠ” 데 μ‚¬μš©λœλ‹€λŠ” 점을 μ œμ™Έν•˜κ³ λŠ” super와 thisλŠ” 근볡적으둜 κ°™μŠ΅λ‹ˆλ‹€. λͺ¨λ“  μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ—λŠ” μžμ‹ μ΄ μ†ν•œ μΈμŠ€ν„΄μŠ€μ˜ μ£Όμ†Œκ°€ μ§€μ—­λ³€μˆ˜λ‘œ μ €μž₯λ˜λŠ”λ°, 이것이 μ°Έμ‘° λ³€μˆ˜μΈ this와 super의 값이 λ©λ‹ˆλ‹€.

 staticλ©”μ„œλ“œ(class λ©”μ„œλ“œ)λŠ” μΈμŠ€ν„΄μŠ€μ™€ μ „ν˜€ 관련이 μ—†μŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ this와 λ§ˆμ°¬κ°€μ§€λ‘œ super μ—­μ‹œ staticλ©”μ„œλ“œμ—μ„œλŠ” μ‚¬μš©ν•  수 μ—†κ³  μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.μ•„λž˜ μ˜ˆμ‹œ μ½”λ“œλ₯Ό 톡해 ν•œλ²ˆ 더 μžμ„Ένžˆ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

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

μ‹€ν–‰ κ²°κ³Ό

이번 μ½”λ“œμ—μ„œλŠ” 이전과 달리 같은 μ΄λ¦„μ˜ 멀버 λ³€μˆ˜κ°€ 쑰상 클래슀인 Parent에도 있고, μžμ† 클래슀인 Childν΄λž˜μŠ€μ—λ„ μžˆμŠ΅λ‹ˆλ‹€. 이럴 λ•Œμ—λŠ” super.x와 this.xλŠ” μ„œλ‘œ λ‹€λ₯Έ 값을 μ°Έμ‘°ν•˜κ²Œ λ©λ‹ˆλ‹€. super.xλŠ” 쑰상 ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속받은 멀버 λ³€μˆ˜ xλ₯Ό λœ»ν•˜λ©°, this.xλŠ” μžμ† ν΄λž˜μŠ€μ— μ„ μ–Έλœ 멀버 λ³€μˆ˜λ₯Ό λœ»ν•©λ‹ˆλ‹€.

 μ΄μ²˜λŸΌ 쑰상 ν΄λž˜μŠ€μ— μ„ μ–Έλœ 멀버 λ³€μˆ˜μ™€ 같은 μ΄λ¦„μ˜ 멀버 λ³€μˆ˜λ₯Ό μžμ† ν΄λž˜μŠ€μ—μ„œ μ€‘λ³΅ν•΄μ„œ μ •μ˜ν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ©° μ°Έμ‘° λ³€μˆ˜ superλ₯Ό μ΄μš©ν•΄μ„œ μ„œλ‘œ ꡬ별할 수 μžˆμŠ΅λ‹ˆλ‹€.

 λ³€μˆ˜λ§Œμ΄ μ•„λ‹ˆλΌ λ©”μ„œλ“œ μ—­μ‹œ superλ₯Ό μ¨μ„œ ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€. 특히 쑰상 클래슀의 λ©”μ„œλ“œλ₯Ό μžμ† ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ”©ν•œ κ²½μš°μ— μ•„λž˜ μ½”λ“œμ²˜λŸΌ super.λ©”μ„œλ“œ()λ₯Ό μ‚¬μš©ν•˜μ—¬ 호좜이 κ°€λŠ₯ν•©λ‹ˆλ‹€. 

class Point {
    int x;
    int y;
    
    String getLocation() {
        return "x :" + x + ", y: " + y;
    }
}

class Point3D extends Point {
    int z;

    String getLocation() {  // μ˜€λ²„λΌμ΄λ”©
        return super.getLocation() + ", z: " + z;   //μ‘°μƒμ˜ λ©”μ„œλ“œ 호좜
    }
}

 

 

2. super()의 κ°œλ… - (쑰상 클래슀 μƒμ„±μž)

this()와 λ§ˆμ°¬κ°€μ§€λ‘œ super() μ—­μ‹œ μƒμ„±μžμž…λ‹ˆλ‹€. this()λŠ” 같은 클래슀의 λ‹€λ₯Έ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λŠ” 데 μ‚¬μš©λ˜μ§€λ§Œ, super()λŠ” 쑰상 클래슀의 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. 

 μžμ† 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λ©΄, μžμ†μ˜ 멀버와 μ‘°μƒμ˜ 멀버가 λͺ¨λ‘ 합쳐진 ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ©λ‹ˆλ‹€. κ·Έλž˜μ„œ μžμ† 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ 쑰상 클래슀의 멀버듀을 μ‚¬μš©ν•  수 μžˆλŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λ•Œ 쑰상 클래슀 λ©€λ²„μ˜ μ΄ˆκΈ°ν™” μž‘μ—…μ΄ μˆ˜ν–‰λ˜μ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— μžμ† 클래슀의 μƒμ„±μžμ—μ„œ 쑰상 클래슀의 μƒμ„±μžκ°€ ν˜ΈμΆœλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

 μƒμ„±μžμ˜ 첫 μ€„μ—μ„œ 쑰상 클래슀의 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•΄μ•Ό ν•˜λŠ” μ΄μœ λŠ” μžμ† 클래슀의 멀버가 쑰상 클래슀의 멀버λ₯Ό μ‚¬μš©ν•  μˆ˜λ„ μžˆμœΌλ―€λ‘œ μ‘°μƒμ˜ 멀버듀이 λ¨Όμ € μ΄ˆκΈ°ν™”λ˜μ–΄ μžˆμ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

 μ΄μ™€ 같은 쑰상 클래슀 μƒμ„±μžμ˜ ν˜ΈμΆœμ€ 클래슀의 상속관계λ₯Ό 거슬러 μ˜¬λΌκ°€λ©΄μ„œ 계속 λ°˜λ³΅λ©λ‹ˆλ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ λͺ¨λ“  클래슀의 졜고 쑰상인 Object클래슀의 μƒμ„±μžμΈ Object()κΉŒμ§€ κ°€μ„œμ•Ό 끝이 λ‚©λ‹ˆλ‹€.

Object클래슀λ₯Ό μ œμ™Έν•œ λͺ¨λ“  클래슀의 μƒμ„±μžλŠ” 첫 쀄에 λ°˜λ“œμ‹œ μžμ‹ μ˜ λ‹€λ₯Έ μƒμ„±μž λ˜λŠ” μ‘°μƒμ˜ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•΄μ•Ό ν•©λ‹ˆλ‹€.
λ§Œμ•½ κ°œλ°œμžκ°€ 직접 μΆ”κ°€ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ μƒμ„±μžμ˜ 첫 쀄에 'super();'λ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.

 

import java.util.ArrayList;

class Test {
    public static void main(String[] args) {
        Point3D point3D = new Point3D(1, 2, 3);
        System.out.println(point3D.toString());
    }

}

class Point {
    int x, 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();λ₯Ό 여기에 μžλ™μœΌλ‘œ μΆ”κ°€ν•œλ‹€.
        this.x = x;
        this.y = y;
        this.z = z;
    }


}

μœ„ μ½”λ“œκ°€ μ œλŒ€λ‘œ 컴파일이 μ§„ν–‰λ κΉŒμš”? 결둠을 λ¨Όμ € λ§μ”€λ“œλ¦¬μžλ©΄ 컴파일 μ—λŸ¬κ°€ λ°œμƒν•˜κ²Œ λ©λ‹ˆλ‹€. Point3D 클래슀의 μƒμ„±μžμ˜ 첫 쀄이 μƒμ„±μž(μ‘°μƒμ˜ 것이든 μžμ‹ μ˜ 것이든)λ₯Ό ν˜ΈμΆœν•˜λŠ” λ¬Έμž₯이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— μ»΄νŒŒμΌλŸ¬λŠ” λ‹€μŒκ³Ό 같이 μœ„ μ½”λ“œμ˜ 주석 뢀뢄에 μžλ™μœΌλ‘œ super();λ₯Ό μΆ”κ°€ν•΄μ£Όκ²Œ λ©λ‹ˆλ‹€.

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

κ·Έλž˜μ„œ Point3D클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λ©΄, μƒμ„±μž Point3D(int x, int y, int z)κ°€ ν˜ΈμΆœλ˜λ©΄μ„œ 첫 λ¬Έμž₯인 super();λ₯Ό μˆ˜ν–‰ν•˜κ²Œ λ©λ‹ˆλ‹€. super()λŠ” Point3D클래슀의 쑰상인 Point클래슀의 κΈ°λ³Έ μƒμ„±μžμΈ Point()와 같은 μ˜λ―Έμž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ Point() ν΄λž˜μŠ€μ— μƒμ„±μž Point()κ°€ μ •μ˜λ˜μ–΄ μžˆμ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 컴파일 μ—λŸ¬κ°€ λ°œμƒν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. λ”°λΌμ„œ μ•„λž˜μ™€ 같이 μž‘μ„±ν•΄μ•Ό μ •μƒμ μœΌλ‘œ μž‘λ™ν•˜κ²Œ λ©λ‹ˆλ‹€.

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

쑰상 클래슀의 멀버 λ³€μˆ˜λŠ” 이처럼 μ‘°μƒμ˜ μƒμ„±μžμ— μ˜ν•΄ μ΄ˆκΈ°ν™”λ˜λ„λ‘ ν•΄μ•Ό ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

λŒ“κΈ€