카테고리 없음

[java] 상속

NaZZU 2024. 5. 31. 23:36

객체 지행 프로그램에서 상속은 자식 (하위, 파생) 클래스가 부모 (상위) 클래스의 멤버를 물려받는 것을 의미한다. 

자식이 부모를 선택해서 물려받을 수 있으며, 부모 클래스의 필드와 메소드를 상속받는다.

 

상속의 효과

- 부모 클래스를 재사용해 자식 클래스를 빨리 개발 가능

- 반복된 코드 중복을 줄임

- 유지 보수 편리성 제공

- 객체 다형성 구현 가능

 

부모 클래스의 private한 필드와 메소드, 다른 패키지의 default 필드와 메소드는 상속을 받을 수 없다.

(사실 protected나 public한 메소드를 이용하면 간접적으로 제어할 수 있다. like getter/setter)

 

자식 클래스가 상속할 부모의 클래스를 지정할 때 extends 키워드를 사용한다.

ex) public class child extends parent 

java는 단일 상속만 지원하며, 여러개의 부모클래스를 상속받을 수 없다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package Practice;
 
public class Phone {
    // private으로 설정하면 상속이 불가능하다
    // 대신 getter setter를 사용하면 간접적으로 제어가 가능하다
    public String model;
    public String color;
    
    public void bell()
    {
        System.out.println("벨이 울립니다");
    }
    public void sendVoice(String msg)
    {
        System.out.println("나 : " + msg);
    }
    public void reciveVoice(String msg)
    {
        System.out.println("너 : " + msg);
    }
    public void hangUp()
    {
        System.out.println("전화를 끊습니다");
    }
    
}
 
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package Practice;
 
public class SmartPhone extends Phone {
    private boolean wifi;
    
    public SmartPhone(String model, String color)
    {
        this.model = model;
        this.color = color;
        //super(model, color); 부모 클래스에 생성자가 있는경우 부모 클래스의 생성자 호출 가능
    }
    public boolean isWifi()
    {
        return wifi;
    }
    public void setWifi(boolean wifi) {
        this.wifi = wifi;
        System.out.println("wifi 상태 변경");
    }
    public void internet()
    {
        if (wifi == true)
            System.out.println("인터넷 연결");
        else
            System.out.println("인터넷 연결 실패");
    }
    
}
 
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package Practice;
 
public class SmartPhoneEx {
    public static void main(String[] args)
    {
        SmartPhone myPhone = new SmartPhone("S24""yellow");
        
        System.out.println("모델 : " + myPhone.model);
        System.out.println("색상 : " + myPhone.color);
        
        System.out.println("wifi : " + myPhone.isWifi());
        
        myPhone.bell();
        myPhone.sendVoice("Hello");
        myPhone.reciveVoice("World");
        myPhone.hangUp();
        
        myPhone.setWifi(true);
        myPhone.internet();
    }
}
 
cs

 

부모 클래스에 생성자가 존재한다면, super(매개값, ...) 으로 부모 클래스의 생성자를 호출 가능하다.

super 생성자는 반드시 자식 생성자의 첫 줄에 위치해야 하며, 부모 생성자가 존재하지 않는다면 컴파일 에러가 난다.