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()에 의해 생성되는데, 명시하지 않으면 컴파일러가 기본형을 자동으로 추가한다. //특정 매개값을 갖는 생성자는 객체 생성과 동시에 객체가 가진 필드의 값을 초기화하기 편리하라고 있는 것 (?) } } |
오버라이딩
오버라이딩 조건)
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 |