삽질의 현장/- Java

[삽잡이::java] 자식이 생성될 때 부모의 생성자를 부른다.

shovelman 2016. 7. 7. 21:44



 



참으로 훈훈한 부자지간(?)이군요!

아버지가 자식에게 상속을 하는 모습입니다.


재산을 상속 받다.

되물림받다. 세습하다. 계승하다.


등등등...


옛 것(?)으로 부터 이어서 받아오는 그 무언가!


자... 여러분은 어떻게 태어나셨습니까?!

부모님에 의해 태어났죠?


이와 같은 아름다운 일들이

프로그래밍 세계에서도 존재합니다.


부모되는 클래스로부터

자식 된 클래스가 만들어질 수 있다 이겁니다.


우리가 부모님께 용돈 받아 쓰고,

부모님의 집에 얹혀 살듯이 ...

(부모님께 효도하세요)


자식된 클래스는 

부모 클래스의 것들을 가져다 사용할 수 있습니다.


그런데, 이 자식된 클래스가 

객체로 태어나게 될 때 반드시 부모를 호출하게 됩니다.


엄밀히 말하자면,

자식 클래스가 생성될 때 

부모 클래스의 생성자를 호출하게 되는 것입니다.




(프로그래밍 세계에서는 가능합니다.)


생성자란, 클래스의 이름과 똑같으며 

반환형이 아에 없는 메서드를 말하는데요.

클래스가 객체화 될 때 단 한 번 호출이 되는 메서드입니다.


이 생성자라는 친구는

태어날 때... 즉, 객체가 메모리에 생성될 때 해야할 일들이 정의되어있습니다.


아무튼...

이 놈의 자식(?)이 생성될 때 부모를 부릅니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Tool {
    string brand;
    int old
 
    public Tool()
    {
        this.brand = "싸구려";
        this.old = 3;
    }
    
    public Tool (string _brand)
    {
        this.brand = _brand;
        this.old = 3;
    }
}
cs


이처럼 Tool이라는 클래스가 있다고 

생각해보시길 바랍니다.


Tool이라는 클래스가 생성될 때에는

두가지 Case의 생성자가 존재합니다.


string형 name을 받으며 객체를 생성할 것인지,

그냥 생성할것인지 말입니다.


자... 이제 자식을 보시죠.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Shovel extends Tool {
    string name;
    int price;
    
    public Shovel()
    {
        super();
        this.price = 14000;
    }
    
    public Shovel(string _brand, string _name)
    {
        super(_brand);
        this.name = _name;
        this.price = 14000;
    }
}
cs



자... Shovel이라는 삽 클래스입니다.

shovel 클래스는 Tool 클래스를 extends 

즉, 상속받고 있습니다.


이에 Shovel이라는 클래스를 객체화 시키게 된다면,

부모 클래스를 호출하게 됩니다.


이때 우리는 super() 메서드를 호출시켜 

부모 클래스를 부르게 됩니다.


참고로 컴파일러는 super()를 명시적으로 호출해주지 않으면

알아서 기본적인 super()를 호출한다는 점~


아무튼...

만약, 부모의 생성자가 

명시적으로 하나밖에 없다면,

거기에 기본 생성자가 아닌

 인자를 반드시 받는 생성자밖에 없다면....


1
2
3
4
5
6
7
8
9
10
public class Tool {
    string brand;
    int old
 
    public Tool (string _brand)
    {
        this.brand = _brand;
        this.old = 3;
    }
}
cs


이 때에는 그냥 super()은 안되겠지요.


예 그렇습니다.

반드시 string형 인자를 하나 넘겨줘야합니다.

인자를 받는 생성자가 없기 때문이지요.



중요한 개념입니다.

정말로...


제가 오랜만에 객체지향 프로그래밍에 뛰어들었다가

호되게... 삽질을 한 기억이...


하하...


아무튼~ 즐거운 프로그래밍 합시다~