본문 바로가기

자바스프링웹공부(2024)/자바

2024.09.10. 상속, 오버라이드,접근제한자

반응형

* 상속 (Inheritance)  

- 이클립스 단축키 : Alt + Shift + S -> V

- 슈퍼클래스(부모)의 모든 멤버를 서브클래스(자식)에서 물려받아 선언없이 사용하는 것 - 중복코드 없애려고
    => 상속을 받은 서브클래스에서 별도의 선언 및 정의 없어도 슈퍼클래스가 가진 멤버변수나 메서드 등을 자신의 멤버처럼 사용가능
    => 상속을 활용하면 코드 중복이 제거되며, 유지보수에 용이해진다. 
- 슈퍼클래스 (Super Class) = 부모클래스, 조상클래스 = 상위 클래스
  서브 클래스 (Sub Class) = 자식클래스, 자손클래스 = 하위클래스 = 파생클래스 
- 서브클래스 정의시 버스클래스명 뒤에 extends 키워드를 사용하고, extends 키워드 뒤에 슈퍼클래스의 이름을 명시함.
- 생성자는 상속이 되지 않음(클래스 이름이 다름)
- 자바는 단일 상속만 지원하므로 동시에 2개 이상의 클래스를 상속받을 수 없음
- 클래스 정의 시 별도의 extends 키워드를 사용하지 않으면 (상속 명시하지 않으면) 자동으로 java.lagn.Object 클래스를 상속받게 됨.
    => 따라서 ,Object 클래스는 모든 자바 클래스의 최상위 클래스이다!
    => 즉, 모든 클래스에서 Object 클래스의 멤버에 접근가능!
- private 접근제한자가 적용된 멤버는 상속 대상에서 제외됨.(=상속 시키지않으려면 private 붙여주면 됨)

  => private 접근제한자는 자신의 클래스 내에서만 접근 가능하고 다른 클래스에서 접근 불가능하도록 제어하므로
       상속받는 자식도 접근 불가능하기 때문에 상속되지 않는다. 
- 자식클래스는 자신의 클래스 내의 멤버 뿐만 아니라 슈퍼 클래스로부터 상속받은 멤버도 선언없이 사용가능
  단, 슈퍼클래스에서는 서브클래스의 멤버에 접근 불가능하다.
- 슈퍼클래스인 아버지와 그의 슈퍼클래스인 할아버지의 모든 멤버에 접근 가능!!

 

* 생성자도 상속대상에서 제외되는 예문

class Person {
	String name;
	int age;
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
}
class SpiderMan extends Person {
	String nickName;
	private void fireWeb() {
		System.out.println("거미줄발사!");
	}
}

....main(){
		Person p = new Person("hong", 20);// 사용가능.
		SpiderMan s = new SpiderMan("peter",20); // Person 클래스처럼 생성자에 바로 쓰고 싶어도 생성자는 상속이 되지않아서 사용못함.
		// => 생성자도 상속되지 않으므로, 서브클래스 타입의 파라미터 생성자 호출 불가능.
}



 * 메서드 오버라이딩 (Method Overriding)

- 슈퍼클래스로 부터 상속받은 메서드를 서브클래스에서 새롭게 재정의 하는 것
- 반드시 상속 관계에서 상속받은 메서드에 대해서만 적용가능
- 서브클래스에서 오버라이딩 수행 후에는 슈퍼클래스의 메서드는 은닉됨 - 있긴있는데 잠시 숨겨져있다. 메모리에는 올라가있다. 근데 이름이 같은걸로 덮어둔거임. 다시 사용할 수 있게 될 거임. 나중에 알아보자.

- @Override 표시는 Annotation 기능으로 자바 컴파일러를 위한 주석 ( 이 메서드가 오버라이딩 되어 있다는표시이므로, 반드시 오버라이딩만 가능하며 오버라이딩 규칙을 위반할 경우 오류가 발생)
 
 < 메서드 오버라이딩 규칙 >
1. 슈퍼클래스의 메서드와 시그니처(리턴타입, 메서드명, 매개변수)가 동일 해야함.
2. 접근제한자는 범위가 좁아질 수 없다.  (=> 부모가 public 이면 자식도 public만 선택가능함)

 

* 멤버변수에 대한 오버라이딩

- Parent 클래스로부터 상속 받은 멤버변수와 동일한 이름의변수를 서브클래스에서 선언하면
  메서드 오버라이딩과 마찬가지로 멤버변수에 대한은닉이 발생하여
  슈퍼클래스의 멤버변수는 보이지 않고, 서브클래스의 멤버변수에만 접근가능해진다.

* 래퍼런스 super

 - 래퍼런스 this와 마찬가지로 인스턴스 주소를 저장하는 참조변수
 - 레퍼런스 this는 자신의 인스턴스 주소를 저장하는 반면, 
   레퍼런스 super는 부모 인스턴스 주소를 저장함.
 - 메서드 (또는 변수) 오버라이딩으로 인해 슈퍼클래스의 멤버가 은닉되었을 때 
   서브 클래스에서 슈퍼 클래스의 은닉된 멤버에 접근하기 위해 사용함.
 
< 변수 사용 시 선언 방법에 따른 접근 순서 >
1. 변수명만 지정했을 경우
   현재 선언된 메서드 내에서 먼저 탐색 -> 없을 경우 자신의 멤버변수에서 탐색
    -> 부모의 멤버변수에서 탐색 
2. this.변수명을 지정했을 경우
   자신의 멤버변수에서 탐색 -> 부모의 멤버변수에서 탐색 -> 조부모 -> ...
3. super.변수명을 지정했을 경우
   부모의 멤버변수에서 탐색 
===>>>>>> 결론! 탐색 시작지점을 지정해 준다고 생각해도 무방함!

 

 

* 접근제한자

< 접근제한자의 접근범위 >
  1. public : 모든 클래스에서 접근 가능(제한없음)
  2. protected: 같은 패키지 또는 다른 패키지이더라도 "상속관계"에 있는 서브클래스만 접근 가능
  3. default : 같은 패키지에서만 접근 가능
  4. private  : 자신의 클래스 내에서만 접근 가능 (다른 클래스에서 접근 불가)

반응형