23일꺼 못썼다. 시간 지나니까 까먹네... 일단 시간없으니까 보류.
기존의 것(부모 class)를 재사용 + 자신의 것(자식 Class) 사용
→ 중복 코드를 줄일 수 있다. (필드, 메서드 재사용)
예제코드
class A {
public A(){
System.out.println("Class A의 생성자 호출");
}
}
class B extends A {
public B(){
super(); // 넣지 않으면 컴파일러가 자동으로 생성
System.out.println("Class B 의 super() 호출 (B의 부모생성자) 윗줄해서 함");
System.out.println();
System.out.println("Class B의 생성자 호출");
}
}
class C extends B {
public C(){
System.out.println("Class C의 생성자 호출");
}
}
public class Inheritance_1 {
public static void main(String[] args) {
System.out.println("C 생성자 호출");
C c = new C();
System.out.println();
System.out.println("B 생성자 호출");
B b = new B();
System.out.println();
}
}
Class B
는 Class A
를 상속받는 자식클래스이다.
Class C
는 Class B
를 상속받는 자식클래스이다.
Class A
는 부모클래스.
각 클래스의 생성자 호출에 주의하자
Class C
의 생성자를 호출하면 Class B
의 생성자를 호출하고, Class B
의 생성자는 Class A
의 생성자를 호출한다.
그러면 A -> B -> C 순서대로 생성자가 호출된다.
C 생성자 호출
Class A의 생성자 호출
Class B 의 super() 호출 (B의 부모생성자) 윗줄해서 함
Class B의 생성자 호출
Class C의 생성자 호출
B 생성자 호출
Class A의 생성자 호출
Class B 의 super() 호출 (B의 부모생성자) 윗줄해서 함
Class B의 생성자 호출
콘솔에는 이렇게 출력됨.
super();
사용자식 클래스의 default 생성자 안에는 super();
가 자동 생성된다.
super();
안만들어짐.super.A;
사용Method가 자신 클래스 내의 필드를 this.a
로 받는 것처럼, 부모 클래스의 필드를 super.A
이런 식으로 받는다.
Method
명, Return Type
, parameter
가 같고 바디 안의 내용만 다르다.예제 코드
public class MethodOverriding_2 {
public static void main(String[] args) {
Manager obj1 = new Manager();
System.out.println("관리자의 월급: " + obj1.getSalary());
Programmer obj2 = new Programmer();
System.out.println("프로그래머의 월급: " + obj2.getSalary());
}
}
class Employee {
int getSalary(){
return 0;
}
}
class Manager extends Employee {
@Override
int getSalary(){
return 5000000;
}
}
class Programmer extends Employee {
@Override
public int getSalary() {
return 6000000;
}
}
Employee
클래스를 상속받은 Manager
클래스, Programmer
클래스가 있다.
Manager
, Programmer
클래스 모두 Employee
에서 사용하는 getSalary
Method 를 갖고 있다.
Manager
클래스의 객체 변수로 getSalary
를 호출하면 Manager
클래스의 getSalary
가 호출되어 5000000이 리턴된다.Programmer
클래스의 객체변수도 Programmer
내의 getSalary
가 호출되어 6000000이 리턴된다.parameter
의 개수나 타입을 달리 할 수 있다.Return Type
, parameter
전부 동일하게는 만들 수 없다. (컴파일 에러)예제 코드
class Exployee {
int getSalary(){
return 0;
}
int getSalary(int x, int y) {
return x * y;
}
int getSalary(String str) {
return 0;
}
}
→ 위 코드처럼 getSalary
Method 는 3가지 방식으로 오버로딩 되었다
→ (C 같은 경우 getSalary
, getSalary1
, getSalary2
… 이렇게 함수 이름을 다르게 지정해야 한다.)
이거 이해 잘안갔음.
class Shape {
public void draw() {
System.out.println("도형을 그립니다.");
}
}
class Rectangle extends Shape{
@Override
public void draw() {
System.out.println("사각형을 그립니다.");
}
}
Shape shape = new Rectangle(); << upcasting
부모 클래스 변수로 자식 클래스 객체를 잠조할 수 있다.
⇒ 하위 객체를 상위 클래스형 변수에 대입
💫 위의 코드를 예시로 들어보면 부모 클래스 변수 Shape로 자식 클래스 객체인 Rectangle()을 참조했다.
💡 코드로 작성할 때 부모 = 자식 형태로 형변환 없이 적는다 ⇒ (하위 객체를 상위 클래스형 변수에 대입)public class ShapeTest {
public static void main(String[] args) {
Rectangle rectangle = new Shape(); // 여기서 에러남.
rectangle.draw();
}
}
🚨 반대 형태인 자식 = 부모 형태는 안 된다.
포함하는 데이터의 범위가 다르기 때문이다.
솔직히 귀찮아서 팀원분꺼 긁어왔다.