부모 클래스와 자식 클래스가 있으며, 자식 클래스는 부모의 멤버를 상속받아 사용할 수 있음.
(상위 클래스 <- 하위 클래스 형식으로 표시)
(🟢 extends를 사용하여 상속)
부모 클래스의 생성자 -> 자식 클래스의 생성자
🔴 출력 순서가 달라질 수 있기 때문에 주의 필요!
this() : 자신의 생성자
super() : 부모 생성자
(인자를 넣어서 원하는 생성자를 불러올 수 있음)
super()을 넣어줌🔴 패키지가 달라도, 하위 클래스에서 접근가능하도록 함(상속시에만)
class A{
int a = 10;
public A(int a, int b) {
System.out.println("A 생성자 호출 " + a + b);
}
}
class B extends A{
public B(int a, int b) {
super(a,b); // 부모생성자
System.out.println("B 생성자 호출");
}
}
public class java_11_p11 {
public static void main(String[] args) {
B b = new B(1,3);
}
}
🟢 super(a,b)를 사용하여 해당 생성자를 불러옴
(🔴 부모 클래스에 기본 생성자가 없으므로 super() 사용 불가)
상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니쳐를 갖는 메소드로 다시 정의하는 것 (함수 바디만 다르게)
(🔴 반드시 상속 관계)
class Shape1{
public void draw() { System.out.println("Shape"); }
}
class Circle1 extends Shape1 {
@Override
public void draw() { System.out.println("Circle을 그립니다."); }
}
class Rectangle1 extends Shape1 {
@Override
public void draw() { System.out.println("Rectangle을 그립니다."); }
}
class Triangle1 extends Shape1 {
@Override
public void draw() { System.out.println("Triangle을 그립니다."); }
}
public class java_12_p5 {
public static void main(String[] args) {
// 1번
Shape1 shape = new Shape1();
shape.draw();
Rectangle1 rec = new Rectangle1();
rec.draw();
}
}
🟢 draw()를 시그니쳐만 동일하게 사용하여 오버라이딩함.
같은 이름의 메소드를 중복하여 정의하는 것
(매개 변수의 데이터 타입 또는 개수를 다르게 함)
🟢 상속관계가 아니여도 됨.
println : 매개 변수로 int형, String형 등 다양하게 올 수 있도록 오버로딩되어있음.
상위 클래스가 동일한 메시지로 하위 클래스들을 서로 다르게 동작시키는 객체 지향 원리
private : 직접적인 접근이 불가능
(자신의 내부 클래스에서만 접근 가능)
public과 default의 내용은 클래스 대상과 동일
Shape : 상위 클래스, Circle : 하위 클래스일 때,
Shape shape = new Circle();
- 부모 = 자식 (형변환 없이, 자식 = 부모는 불가능)
- 오버라이딩은 자식의 것
🔴 부모 = 자식을 했을 때, 객체는 오직 부모에 있는 필드와 메소드를 사용할 수 있다 (자식에만 있는 메소드 사용 불가)
🔴 만약, 오버라이딩되어 있는 메소드가 있을 시, 해당 메소드 실행시 오버라이딩된 메소드가 실행됨. (부모의 메소드 실행X)
Shape[] shape = { new Circle(), new Rectangle(), new Triangle() };
for ( Shape s : shape ) {
s.draw();
}
🟢 배열로 활용 가능