Java

์ƒ์†Inheritance

voider 2020. 9. 6. 19:03

๐Ÿ“š ์ž๋ฐ”์˜ ์ •์„์„ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

์ƒ์†Inheritance

๊ธฐ์กด์˜ ํด๋ž˜์Šค๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ฝ”๋“œ๋ฅผ ๊ณตํ†ต์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ง€๋ณด์ˆ˜ ํ•˜๊ธฐ ์‰ฝ๋‹ค.

class Child extends Parent {
    //...
}

extends๋งŒ์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ƒ์† ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

์ƒ์†ํ•ด์ฃผ๋Š” ํด๋ž˜์ŠคParent๋ฅผ ์กฐ์ƒ ํด๋ž˜์Šค, ์ƒ์†์„ ๋ฐ›๋Š” ํด๋ž˜์ŠคChild๋ฅผ ์ž์† ํด๋ž˜์Šค๋ผ๊ณ  ํ•œ๋‹ค.

์ด ๋‘ ๊ด€๊ณ„๋ฅผ ์ƒ์†๊ด€๊ณ„๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

์ถœ์ฒ˜ : https://www.javatpoint.com/inheritance-in-java

์กฐ์ƒํด๋ž˜์Šค๋Š” ์ž์† ํด๋ž˜์Šค๊ฐ€ ๋ณ€๊ฒฝ ๋˜์–ด๋„ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์ง€๋งŒ,

์กฐ์ƒํด๋ž˜์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ž์† ํด๋ž˜์Šค๋Š” ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค.

์ž์† ํด๋ž˜์Šค๋Š” ์กฐ์ƒ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๋ฉค๋ฒ„๋ฅผ ์ƒ์† ๋ฐ›๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ํ•ญ์ƒ ์กฐ์ƒ ํด๋ž˜์Šค๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ๋งŽ์€ ๋ฉค๋ฒ„๋ฅผ ๊ฐ–๋Š”๋‹ค. ์ƒ์†์— ์ƒ์†์„ ๊ฑฐ๋“ญํ•œ๋‹ค๋ฉด, ๋ฉค๋ฒ„๋Š” ์ ์  ํ™•์žฅ(extends)๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์ƒ์†์„ ์ด์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ฆ‰ ์กฐ์ƒ ํด๋ž˜์Šค๋ฅผ ํ™•์žฅextendsํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๊ธฐ๋„ ํ•˜๋‹ค.

์ž๋ฐ”๋Š” ๋‹จ์ผ์ƒ์†๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‘ ๊ฐœ์˜ ํด๋ž˜์Šค๋ฅผ ๋™์‹œ์— extendsํ•  ์ˆ˜ ์—†๋‹ค.

ํ•„์š”ํ•˜๋‹ค๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ํฌํ•จ๊ด€๊ณ„๋ฅผ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.

ํฌํ•จ๊ด€๊ณ„

ํ•œ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋กœ ๋‹ค๋ฅธ ํด๋ž˜์Šค ํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค.

class ArcReactor{
    //...
}
class TonyStark{
    ArcReactor arc = new ArcReactor();
}

class Ironman() {
    TonyStark tony = new TonyStark();
}

์œ„์™€ ๊ฐ™์ด ๋‹จ์œ„๋ณ„๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํด๋ž˜์Šค๋ฅผ ํฌํ•จํ•ด์„œ ๋” ํฐ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ํ•  ๋•Œ extends๋Š” ํ•œ ๋ฒˆ๋„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ํฌํ•จ๊ด€๊ณ„๋Š” ์ˆ˜๋„ ์—†์ด ๋งŽ์ด ์‚ฌ์šฉํ–ˆ๋‹ค.

Object

Object๋Š” ๋ชจ๋“  ํด๋ž˜์Šค์˜ ์กฐ์ƒ์ด๋‹ค. ์•„๋ฌด๊ฒƒ๋„ ์ƒ์†๋ฐ›๊ณ  ์žˆ์ง€ ์•Š์€ ํด๋ž˜์Šค๋„ ๊ฒฐ๊ตญ Object๋ฅผ ์ƒ์†๋ฐ›๊ณ  ์žˆ๋‹ค. toString()์ด๋‚˜ equals() ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋Š” ๋ชจ๋‘ Object์˜ ๋ฉ”์„œ๋“œ๋‹ค.

์˜ค๋ฒ„๋ผ์ด๋”ฉOverriding

์ƒ์† ๋ฐ›์€ ๋ฉ”์„œ๋“œ์˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด๋ผ๊ณ  ํ•œ๋‹ค.

class CarCompo {
    String color;
    String gearType;
    int door;

    /*Objectํด๋ž˜์Šค์˜ toString()์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์„œ ์‚ฌ์šฉ*/
    @Override
    public String toString() {
        return "CarCompo [color=" + color + ", gearType=" + gearType + ", door=" + door + "]";
    }
}

์ดํด๋ฆฝ์Šค ๊ธฐ์ค€ alt + shift + s โ†’ Override/implements Methods๋ฅผ ๋ˆ„๋ฅด๋ฉด ์‰ฝ๊ฒŒ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

@Override ์–ด๋…ธํ…Œ์ด์…˜์€ ํ˜น์—ฌ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ์ž˜๋ชป ํ–ˆ์„ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•ด ํ•ญ์ƒ ๋ถ™์ด๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ์ž˜๋ชป๋˜์—ˆ๋‹ค๊ณ  ๋ฐ”๋กœ ๋นจ๊ฐ„ ์ค„์„ ๊ทธ์–ด์ฃผ๋‹ˆ๊นŒ.

์˜ค๋ฒ„๋ผ์ด๋”ฉ ์กฐ๊ฑด

  • ์ด๋ฆ„์ด ๊ฐ™์•„์•ผ ํ•œ๋‹ค
  • ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๊ฐ™์•„์•ผ ํ•œ๋‹ค
  • ๋ฐ˜ํ™˜ํƒ€์ž…์ด ๊ฐ™์•„์•ผ ํ•œ๋‹ค
  • ์ ‘๊ทผ ์ œ์–ด์ž๋ฅผ ์ข์€ ๋ฒ”์œ„๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.
  • ์›๋ž˜ ๋ฉ”์„œ๋“œ๋ณด๋‹ค ๋งŽ์€ ์˜ˆ์™ธ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์—†๋‹ค.

์˜ค๋ฒ„๋ผ์ด๋”ฉ๊ณผ ์˜ค๋ฒ„๋กœ๋”ฉ์€ ์ด๋ฆ„๋งŒ ๋น„์Šทํ•  ๋ฟ ๋™๋ฃŒ๊ฐ€ ์•„๋‹ˆ๋‹ค.

์˜ค๋ฒ„๋กœ๋”ฉ : ๊ธฐ์กด์— ์—†๋Š” ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ(new)

์˜ค๋ฒ„๋ผ์ด๋”ฉ:์ƒ์† ๋ฐ›์€ ๋ฉ”์„œ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ(modify)

super

super๋Š” ์ผ์ข…์˜ this๋‹ค. ์ƒ์†๋ฐ›์€ ๋ฉค๋ฒ„์™€ ์ž์‹ ์˜ ๋ฉค๋ฒ„ ์ด๋ฆ„์ด ๊ฐ™์„ ๋•Œ super๋ฅผ ๋ถ™์—ฌ์„œ ๊ตฌ๋ถ„ํ•œ๋‹ค.

์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ์‰ฝ๋‹ค.

public class Super {
    public static void main(String[] args) {
        Child child = new Child();
        child.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); //์ž์‹ (Child)์„ ๊ฐ€๋ฆฌํ‚ค๋Š” this.
        System.out.println("super.x : " + super.x);//๋ถ€๋ชจ(Parent)๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” super.
    }

/*
๊ฒฐ๊ณผ : 
x : 20
this.x : 20
super.x : 10
*/

super๋Š” toString()์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•  ๋•Œ super.toString() + ์ž์† ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜ ์ถœ๋ ฅ

ํ•˜๋Š” ์‹์œผ๋กœ ์จ๋ดค๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ๋‚˜์ค‘์—๋Š” lombok์„ ์“ฐ๋‹ˆ ๊ฑฐ์˜ ์‚ฌ์šฉํ•  ์ผ์ด ์—†๊ธด ํ–ˆ๋‹ค.

super()

์กฐ์ƒ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์“ด๋‹ค.

์ƒ์„ฑ์ž ์ฒซ ์ค„์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์ด์œ ๋Š” ์ž์†ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๊ฐ€ ์กฐ์ƒํด๋ž˜์Šค ๋ฉค๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ, ์กฐ์ƒํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋ฅผ ๋ฏธ๋ฆฌ ์ดˆ๊ธฐํ™” ํ•ด๋‘์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Ojectํด๋ž˜์Šค๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž ์ฒซ ์ค„์— this() ๋˜๋Š” super()๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ์ž ์ฒซ ์ค„์— ์‚ฝ์ž…ํ•œ๋‹ค.

์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋Š” ์ด ๋‘๊ฐ€์ง€๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

  1. ์–ด๋–ค ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๊ฒƒ์ธ๊ฐ€?
  2. ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์–ด๋–ค ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•ด์„œ ๋งŒ๋“ค ๊ฒƒ์ธ๊ฐ€?
public class Point {
    public static void main(String[] args) {
        Point3D p3 = new Point3D();
        System.out.println("p3.x : " + p3.x);
        System.out.println("p3.y : " + p3.y);
        System.out.println("p3.z : " + p3.z);
    }
}

class PointXY {
    int x = 10;
    int y = 20;

    PointXY(int x, int y) {
        //super(); == Object()
        this.x = x;
        this.y = y;
    }
}

class Point3D extends PointXY {
    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); //    PointXY(int x, int y) ํ˜ธ์ถœ
        this.z = z;
    }

}

/*
๊ฒฐ๊ณผ : 
p3.x : 100
p3.y : 200
p3.z : 300
*/

'Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์ถ”์ƒํด๋ž˜์Šค & ์ธํ„ฐํŽ˜์ด์Šค  (0) 2020.09.09
๋‹คํ˜•์„ฑPolymorphism  (0) 2020.09.06
์ œ์–ด์žModifier  (0) 2020.09.06
๊ฐ์ฒด์ง€ํ–ฅ2  (0) 2020.09.06
๊ฐ์ฒด์ง€ํ–ฅ1  (0) 2020.09.06