๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
BackEnd๐ŸŒฑ/Java

[Java] super์™€ super()์˜ ๊ฐœ๋…

by dkswnkk 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;
    }

์กฐ์ƒ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋Š” ์ด์ฒ˜๋Ÿผ ์กฐ์ƒ์˜ ์ƒ์„ฑ์ž์— ์˜ํ•ด ์ดˆ๊ธฐํ™”๋˜๋„๋ก ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋Œ“๊ธ€