본문 바로가기
Java/study

클래스 상속

by avvin 2019. 4. 9.



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 study01;
 
public class Car {
    private String company;
    String model;
    String color;
    public int speed = 250//다른 패키지에서도 접근할 수 있다.
    
    Car(){
    }
    
    Car(String model, String company, String color){ 
    
        this.model = model;
        this.company = company;
        this.color = color;
            
    }
    
    public String getCompany() {
        return company;
    }
 
    public void setCompany(String company) {
        this.company = company;
    }
 
cs



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package study01;
 
public class Bus extends Car {
    
    Bus(String company,String color){
        
        // 부모클래스에서 private으로 선언된 필드는 어떻게 참조하는지
        //super(model, company, color);
        this.setCompany(company); 
        //부모클래스를 상속받고 super()로 부모 객체를 먼저 생성해도 생성자만으로는 간접 접근이 안된다. 
        //자식 클래스에서도 프라이빗 필드는 메서드로 간접 접근한다. 
//        this.company = company;
        this.color = color;
    }    
}
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package study01;
import study01exam.*;
 
public class Hello {
    
    public static void main(String[] args) {
    
        Bus bus1 = new Bus("소신여객""GR"); // 다음 예시부턴 값을 직접 주지 말고 Getter Setter로 간접 접근하기
 
        System.out.println ("bus1");
        System.out.println ("company :" + bus1.getCompany());
        //자식클래스에서 부모클래스의 프라이빗 필드를 상속받아 값을 주려면 생성자에서부터 setter로 접근해야한다.
        //값을 불러올때도 getter로 불러온다.
        System.out.println ("speed :" + bus1.speed);
        
        //자식 객체를 생성하면 부모객체를 먼저 생성한 후 자식 객체가 생성되는 것.
        //부모객체는 자식클래스의 생성자 첫 줄에서 super()에 의해 생성되는데, 명시하지 않으면 컴파일러가 기본형을 자동으로 추가한다.
//특정 매개값을 갖는 생성자는 객체 생성과 동시에 객체가 가진 필드의 값을 초기화하기 편리하라고 있는 것 (?)
    }
}

cs



오버라이딩



오버라이딩 조건)

1. 부모메서드와 동일한 시그너쳐

2. 재정의되는 자식 메소드는 부모메서드와 같거나 부모 메서드보다 약한 접근 제한을 가질 수 있다.

   ex)부모 메서드가 default인 경우 자식 메서드는 public으로 오버라이드 가능

3. 새로운 예외는 throws 불가 



이클립스 오버라이드 메소드 자동생성★(매우 유용)


1. 자식 클래스에서 오버라이딩 메소드 작성할 곳에 커서 위치하고

2. Source -> Override/Implement Method

3. 부모 클래스에서 오버라이딩될 메소드 선택


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package study01;
 
public class Car {
    String company;
    String model;
    String color;
    public int speed; //다른 패키지에서도 접근할 수 있다.
    
    Car(){
    }
 
    public String getCompany() {
        return company;
    }
 
    public void setCompany(String company) {
        this.company = company;
    }
 
    public void move(){
    
        System.out.println("부모메서드 호출");
    }
}
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package study01;
 
public class Bus extends Car {
    
    Bus(String company,String color){
 
        this.setCompany(company); 
        this.color = color;
    }
 
    @Override
    public void move() {
        // TODO Auto-generated method stub
        System.out.println("자식메서드 호출");
        super.move(); //부모메서드에 접근 가능하게 해준다. 오버라이드 메서드 자동생성 기능에 포함돼있다.
    }    
}
cs



1
2
3
4
5
6
7
8
9
10
11
package study01;
 
public class Hello {
    
    public static void main(String[] args) {
   
Bus bus1 = new Bus("소신여객", "GR");     
        bus1.move();
 
    }    
}
cs



출력결과

: 자식메서드 호출

 부모메서드 호출


오버라이드로 숨김처리된 부모메서드를 자식객체를 통해 불러오려면 자식 메서드에 super.메서드명();

자동 오버라이딩 기능 사용하면 메서드 안에 super.메서드명(); 자동생성됨

자식 객체의 move() 메서드 내에서 호출하므로 조건 블럭 안에 넣고 조건 충족시에 불러올 수 있게 쓰는 것이 좋겠다.


아래처럼 부모 객체를 통한 메서드 접근은 오버라이딩된 해당 메서드 외부에서도 가능하다.


1
2
3
4
5
6
7
8
9
10
    @Override
    public void move() {
        // TODO Auto-generated method stub
        System.out.println("자식메서드 호출");
        super.move(); //부모메서드에 접근 가능하게 해준다. 오버라이드 메서드 자동생성 기능에 포함돼있다.
    }    
    
    public void parentsMove() {
        super.move();
    }
cs





 

'Java > study' 카테고리의 다른 글

접근제한자  (0) 2019.04.09
가변인자  (0) 2019.04.09
static / Singleton / final /상수  (0) 2019.04.08
공부해야할 내용들  (0) 2019.04.05
참조 변수, 배열 (04/05)  (0) 2019.04.05