Title
💡 상속 / 캡슐화 / 다형성ex) A가 부모로부터 건물을 물려 받는다, 재산을 상속 받는다.
이처럼 상속은 자식이 부모로 부터 “무엇인가”를 물려 받는다 라고 한다.
자바의 상속
💡 자바의 상속 = 부모 (클래스)로 부터 자식(클래스)이 “변수와 메소드”를 물려 받는다상속의 장점
상속의 형식
자바에서의 자식 클래스는 여러 부모로부터 다중 상속을 받는 것은 불가능하다. 즉, 1개의 부모 클래스로부터 단일 상속만 허용된다. but 부모 클래스는 여러 개의 자식 클래스에게 상속이 가능하다.
예시
class A {
String aField = "클래스 A 필드";
public void aMethod() {
System.out.println(aField);
}
}
class B extends A {
String bField = "클래스 B 필드";
public void bMethod() {
System.out.println(aField); // 부모 클래스 필드 사용
System.out.println(bField); // 본인 클래스 필드 사용
}
}
class C extends B {
String cField = "클래스 C 필드";
public void cMethod() {
System.out.println(aField); // 조부모 클래스 필드 사용
System.out.println(bField); // 부모 클래스 필드 사용
System.out.println(cField); // 본인 클래스 필드 사용
}
}
public class SuperSubEx01 {
public static void main(String[] args) {
System.out.println("----------A----------");
A a = new A();
a.aMethod(); // 본인 메소드 사용
// a.bMethod(); // A(부모) 객체로 B(자식) 메소드 접근 불가
System.out.println("----------A----------");
System.out.println("----------B----------");
B b = new B();
b.aMethod(); // 부모 메소드 사용
b.bMethod(); // 본인 메소드 사용
// b.cMethod(); // B(부모) 객체로 C(자식) 메소드 접근 불가
System.out.println("----------B----------");
System.out.println("----------C----------");
C c = new C();
c.aMethod(); // 조부모 메소드 사용
c.bMethod(); // 부모 메소드 사용
c.cMethod(); // 본인 메소드 사용
System.out.println("----------C----------");
}
}
참고 자료: https://blog.naver.com/PostView.nhn?blogId=heartflow89&logNo=220960019390
자바의 접근 제어자
접근 제어자 | 범위 |
---|---|
public | 접근 제한 없음 |
protected | 동일한 패키지 내에 존재하거나 파생 클래스에서만 접근 가능 |
default | 아무런 접근 제어자를 명시하지 않음, 동일 패키지 내에서만 접근 가능 |
private | 자기 자신만의 클래스 내에서만 접근 가능 |
예시
public class EncapsulationClass {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//메인 클래스
public class Main {
public static void main(String[] args) {
// write your code here
EncapsulationClass cap = new EncapsulationClass();
cap.setId(123);
cap.setName("jay");
System.out.println(cap.getId());
System.out.println(cap.getName());
}
}
출력값
123
jay
참고 자료: https://jaynamm.tistory.com/entry/JAVA-자바-캡슐화-Encapsulation
예시
class Parent { ... }
class Child extends Parent { ... }
...
Parent pa = new Parent(); // 허용
Child ch = new Child(); // 허용
Parent pc = new Child(); // 허용
Child cp = new Parent(); // 오류 발생.
조건
문법
(변환할타입의클래스이름) 변환할참조변수
예시
class Parent { ... }
class Child extends Parent { ... }
class Brother extends Parent { ... }
...
Parent pa01 = null;
Child ch = new Child();
Parent pa02 = new Parent();
Brother br = null;
pa01 = ch; // pa01 = (Parent)ch; 와 같으며, 타입 변환을 생략할 수 있음.
br = (Brother)pa02; // 타입 변환을 생략할 수 없음.
br = (Brother)ch; // 직접적인 상속 관계가 아니므로, 오류 발생.
참고 자료: http://www.tcpschool.com/java/java_polymorphism_concept