[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 로 결과 달라질 수 있음!!
'Java' 카테고리의 다른 글
[JAVA] 자바 - 메소드 오버라이딩(Method Overriding) ⭐⭐ (0) | 2022.07.25 |
---|---|
[JAVA] 자바 - 상속과 생성자 (super, this) (0) | 2022.07.25 |
[JAVA] 자바 - Math 및 Random 클래스 (0) | 2022.07.25 |
[JAVA] 자바 - Date 클래스 (getTime, SimpleDateFormat) (0) | 2022.07.24 |
[JAVA] 자바 - Stirng 클래스 Quiz 풀이 모음(2) ⭐⭐ (0) | 2022.07.24 |
블로그의 정보
개발자 미니민의 개발로그
mini_min