Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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 30
Tags more
Archives
Today
Total
관리 메뉴

ultra_dev

이것이 자바다 CH 7-1(상속) 본문

이것이 자바다

이것이 자바다 CH 7-1(상속)

ultra_dev 2023. 1. 13. 00:32

☑️ 상속 : 잘 개발된 클래스를 재사용하여 중복되는 코드를 줄여줌, 부모 클래스를 수정하면 모든 자식 클래스에 수정효과를 가져옴

☑️ 자바는 다중 상속을 허용하지 않는다. 따라서 extends 뒤에는 단 하나의 부모 클래스만이 와야 한다.

☑️ 자식객체를 생성하면 부모 객체가 먼저 생성된 다음에 자식 객체가 생성된다.

→ 모든 객체는 생성자를 호출해야만 생성되는데 부모 객체의 생성자는 어디 있을까?

→ 자식 생성자의 맨 첫줄에 숨겨져 있는 super()에 의해 호출 된다.

public class SmartPhone extends Phone{
//자식 생성자 선언
	public SmartPhone(String model, String color){
		super();  <- 생략 가능(컴파일시 자동 추가됨)
		this.model = model;
		this.color = color;
	}
}

→ super()는 컴파일 과정에서 자동 추가되는데, 부모의 기본 생성자를 호출한다.

📌 만약 부모 클래스에 기본생성자가 없고, 매개 변수를 갖는 생성자만 있다면 개발자는 super(매개값,…) 생성자를 직접 넣어줘야 한다.

public class SmartPhone extends Phone{
//자식 생성자 선언
	public SmartPhone(String model, String color){
		super(model, color);  <- 반드시 작성해야 함, 생략불
		this.model = model;
		this.color = color;
	}
}

☑️ 메소드 오버라이딩

: 자식 클래스에서 부모 메소드를 재정의해서 사용

→ 메소드가 오버라이딩 됐다면 해당 부모 메소드는 숨겨지고, 자식 메소드가 우선적으로 사용된다.

📌메소드 오버라이딩 규칙

  • 부모 메소드 선언부(리턴 타입, 메소드 이름, 매개변수)와 동일해야 한다.
  • 접근 제한을 더 강하게 오버라이딩할 수 없다. (public → private로 변경 불가)
  • 새로운 예외를 throws할 수 없다.

☑️ @Override

:컴파일시 정확히 오버라이딩 되었는지 체크해줌.

생략 가능하지만 달아둬야 개발자의 실수를 줄여주고, 정확한 체크 가능

☑️ super.method() : 숨겨진 부모 메소드 호출 가능

@Override
public void fly() {
	if(flyMode == SUPERSONIC) {
		System.out.println("초음속 비행합니다.");
}else{
//Airplane 객체의 fly()메소드 호출
super.fly();
		}
	}
}

☑️부모 메소드 호출

  • 메소드 재정의 시, 일부만 변경한다고 해도 중복된 내용을 자식 메소드도 가지고 있어야 함
  • 자식 메소드 내에서 부모 메소드를 호출하여 해결
  • super 키워드와 도트(.) 연산자 사용
  • 부모 메소드 재사용으로 자식 메소드의 중복 작업 내용 없앰
class Child extends Parent {
	@Override
    void method() {
   		super.method(); //부모 메소드 호출
        ... // 추가할 로직
    }
    
}

☑️final class

: final을 class 앞에 붙이면 최종적인 클래스이므로 더이상 상속할 수 없는 클래스가 된다.

→ 즉, final 클래슨는 부모클래스가 될 수 없어 자식 클래스를 만들 수 없다.

ex) String 클래스는 밑에처럼 선언돼 있어서 자식 클래스를 만들 수 없다.

public final class String {...}

☑️final 메소드

:final 키워드를 붙이면 이 메소드는 초정적인 메소드로, 오버라이딩할 수 없는 메소드가 된다.

→ final 메소드는 자식 클래스에서 재정의할 수 없다.

☑️protected 접근 제한자

:같은 패키지, 자식 객체만 사용 가능

public과 default의 중간쯤에 해당하는 접근 제한

→ 같은 패키지에서는 default처럼 접근이 가능하나, 다른 패키지에서는 자식객체만 접근 가능

📌 만약 다른 패키지에 있지만 자식클래스인 경우

부모 클래스의 protected 필드, 생성자, 메소드에 접근은 가능하지만

new 연산자를 사용해서 생성자를 직접 호출할 수는 없고, 자식 생성자에서 super()로 부모 생성자를 호출할 수 있다.

package ch07.package2; //다른 패키지
import ch07.package1.A;

public class D extends A{
//생성자 선언
	public D() {
//A() 생성자 호출
		super();
	}

//메소드 선언
public void method(){
//A 필드값 변경
this.field = "value"; 
//A 메소드 호출
this.method();
}

-----> 위에처럼 상속을 통해서만 사용 ok

//메소드 선언
public void method2(){
A a = new A();  -> X
a.field = "value"; -> X
a.method(); -> X
	}
}
----> 직접 객체생성해서 사용하는 건 안됨!!

---->만약 같은 패키지였으면 A a = new A(); 다 가능
Comments