개발자 미니민의 개발스터디

[JAVA] 자바 - 상속 관계 정의 (super/sub 클래스)

by mini_min

 

[JAVA]
자바 - 상속관계

정처기 시험에서 자바 문제 하면 많이 나오던!!

그 상속 관계 개념 정리 스타트

✔️ 상속이란?

상속은 상위클래스를 하위클래스가 받는 것

즉, 기존에 있던 클래스에 메소드와 필드를 추가해 새로운 클래스를 만드는 것을 말한다. 상속을 통해 공통적인 규약을 정의하고, 적용하는 것이 실질적인 목표다.

 

⭕ 부모꺼는 부모꺼지만, 자식꺼는 부모 것도 있고 자식 것도 있다~

 

- 상위클래스 내용을 변경하면, 하위클래스도 함께 수정된다.

- 하위클래스 하나만 고치는 경우도 가능하다.

- 보통 자바에서 제공하는 기본 클래스들을 상속받아 사용하는 경우가 제일 많다!

- 자바의 조상인 Object 를 뺀 모든 클래스는 아버지가 있다.

 

💡 상속 관계
* 슈퍼클래스 = 상속을 해주는 부모클래스(상위=기반)
* 서브클래스 = 상속을 받는 자식클래스(하위=파생)

 

 

 

✔️ 상속 관계 2가지

🏷️ is a 관계 (상속관계)

a 클래스가 b 클래스를 상속 받은 경우, a 클래스는 b 클래스에 포함되기 때문에 a = b 라고 표현가능

ex) 택시는 자동차이다. 

 

🏷️ has a 관계 (포함관계)

하나의 클래스가 다른 클래스의 멤버를 가지고 이용하는 구조다.

ex) 자동차는 핸들을 가지고 있다.

 

💡 자바 상속 종류 4가지
- 단일상속
- 다단계상속
- 계층적상속
- 다중상속(자바는 다중상속 지원안함)

 

 

 

✔️ 상속 주의사항!!

❌ 자바는 다중 상속을 지원하지 않는다.

❌ 2개 이상의 클래스를 동시에 상속 받지 않는다.

❌ 상위클래스의 생성자, 초기화 블록은 상속되지 않는다. ⭐⭐

⭕ 상위 클래스가 가지고 있는 메소드와 필드를 상속받는다.

 

 

 

✔️ 상속에서 'OO OOO'중요

바로, '접근제어자'이다. 자바에서 상속 관계를 만들 때,  <클래스, 메소드, 멤버 변수> 를 선언하면서 접근제어자를 지정해야하는데, 접근 제어자는 항상 상위클래스의 접근제어자보다 같거나 커야한다!

❌ 만약, 상위클래스의 x 필드/메소드가 private 이면 하위클래스에서 접근이 불가능하다.

 

// 자바는 단일 상속만 지원한다.
class Demo1 {	//상위 클래스 : object 
	private int a = 10; //private는 하위 클래스도 접근 불가
	int b = 20; //동일한 패키지 안에서 접근 가능
	protected int c = 30; //동일한 패키지 및 하위클래스에서 접근 가능
	public int d = 40; //어디에서나 접근 가능
	
	public void print() {
		System.out.println(a+","+b+","+c+","+d);
	}
}


class Test1 extends Demo1 {	//상위 클래스 : Demo1
			
	int x = 100;
	
	public void disp() {
		//System.out.println(a); 	//컴오류
		System.out.println("상위에서 물려받은 필드 : "+ b +"," + c + "," +d);
		System.out.println("x : "+x);
	}
	
	public void write() {
		print(); //상위 클래스 메소드 호출~~!
	}

 

 

 

✔️ 상속 관계에서 필드값 찾기

두 개의 클래스가 상속관계에 있을 때, 특정 필드값을 호출하고 싶을 때, 어떻게 하는지 아는 것이 중요하다. 일단 상속관계에서 필드값을 찾을 때 주로 사용하는 것은 'this' 와 'super' 이다. 'super' 는 만능. 무조건 상위클래스 필드에 해당되는 값을 반환한다. 'this'는 하위클래스 필드값을 반환한다.

 

◾ 상위클래스

class Demo2 {
	int a = 10;
	int b = 20;
	
	public void print() {
		System.out.println(this.a + "," + this.b);   
				//a나 b와 동일한 지역변수 가 없으므로 this 생략가능
	}
	
}

 

◾ 하위클래스

class Test2 extends Demo2 {		//데모2를 상속받음
	int b = 100;
	int x = 200;
	int y = 300;
	
	public void disp() {	
		int x = 50;
        
        //10. super클래스의 a필드 값이 온다.
        System.out.println("a : " + a);
        //10. super클래스를 상속받아
        //상위클래스 것이 곧 하위클래스 것이 되어 this 접근 가능
        System.out.println(this.a);
        //super 클래스 값 출력
        System.out.println(super.a);
        
        //하위클래스에 b 필드가 있기 때문에 100.
        System.out.println("b : " + b);
        //하위클래스 b 필드 자기 자신 this. 100
        System.out.println(this.b);
        //super 클래스 값 출력
        System.out.println(super.b);
        
        //x 필드값보다, disp()메소드의 지역변수가 더 우선순위 가짐
        System.out.println("x : " + x);
        //지역변수 vs 필드 일때, this 는 필드 값을 얻게 함. 
        System.out.println("x : " + this.x);
        
        }
        
}

 

💡 우선순위??
우선순위는 무조건은 아니지만, 보통 '해당 클래스 자기자신의 지역변수' > '필드값' > '상위클래스 필드값' 이렇게 되는 것 같다. super 와 this 로 결과 달라질 수 있음!!

 

 

 

 

 

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기