상속과 메모리 구조
A를 상속받은 클래스 B가 있다고 치자
new B(); 이렇게 B클래스를 생상하게되면 B클래스의 인스턴스 뿐만아니라 A클래스의 인스턴스도 함께 생성이된다
메서드 호출시 그 메서드가 들어있는 클래스의 타입으로 가서 찾는다.
메서드 호출시 변수타입의 클래스에 들어가 먼저 메서드를 찾고 그 다음에 부모클래스로가서 메서드를 찾는다. 거기에도 없으면 컴파일오류
메서드를 찾는데 자기한테 있으면 바로 호출하고 끝, 하지만 자기 자신에게 없는경우 부모클래스까지 가서 찾아서 호출(없으면 컴파일 오류)
+ 오버로딩
같은 메서드의 매개변수의 타입이나 갯수를 여러개로 들리거나 줄여서 정의하는 것
+오버라이딩 ( 컴파일 오류 뜨면 그때 수정하기때문에 @Overiding 사용하면 좋음)
부모클래스에 있는 메서드의 이름으로 자식클래스에서 재정의하는 것
- 메서드 이름
- 메서드 매개변수의 타입, 개수, 순서가 같아야한다
-반환 타입 : 반환 타입이 하위클래스일수있다
-접근 제어자 : 상위클래스의 접근 제어자보다 더 좁아질 수는 없다
-예외 : 부모보다 더 많은 예외를 선언할 수 없다
- static,final,private 가 붙은 메서드는 오버라이딩 불가능
==> 모두 외울수는 없음.. 그냥 가다가 생각나면 들려서 조건 찾아보기
상속 관계를 사용하면 자식 클래스의 생성자에서 부모 클래스의 생성자를 반드시 호출해야한다.(규칙)
=> 어차피 자식 생성자를 호출하면 부모 생성자도 호출이 되기때문에 둘다 인스턴스가 존재하는 상태임
+ 부모 클래스의 생성자는 첫 줄에서만 호출해야 한다. 하지만, 생성자 안에서 super()를 호출할 때 반드시 첫 번째 문장에서 호출해야 한다. 즉, this()로 다른 생성자를 호출할 수 있지만, super()는 다른 생성자에서 호출되어야 하므로 그 생성자 안에서 super()를 호출해야 한다.
따라서 this()로 다른 생성자를 호출하고, 그 생성자에서 super()를 호출하면 부모 클래스의 생성자는 정상적으로 호출된다.
실행순서?
ClassA, ClassB, ClassC 세개의 클래스가 존재하고
ClassB는 ClassA를 상속받고 ClassC는 ClassB를 상속받는다 치고 ClassC c = new ClassC 로 ClassC를 생성하게 되면 실행 순서는 ClassC -> ClassB -> ClassA 이다 이때 생성되는 순서는 역으로 ClassA -> ClassB -> ClassC 이렇게 된다.
그런데도 마지막은 항상 부모데이터
부모의 데이터 초기화 -> 자식의 데이터 초기화
부모클래스에 있는 메서드를 오버라이드 할 때
부모클래스에 있는 메서드를 오버라이드 하면 재정의를 해야하기 때문에 처음부터 똑같은것을 다시 써야한다는 생각을 할수도 있다 하지만
super.메서드이름();
이렇게 선언 해주면 부모 메서드의 로직을 받아와서 재사용할 수 있기 때문에 번거로운 작성을 안해도 된다
(아마 고수분들은 다 알겠지만 나같은 기본반을 수강하는 사람들은 잘 모를거같아서 써놓았다)
'JAVA' 카테고리의 다른 글
[JAVA] 런타임 오류 VS 컴파일 오류 (0) | 2025.02.18 |
---|---|
[JAVA] 다형성1 (0) | 2025.02.18 |
[JAVA] static final 변수를 사용하는 이유 (1) | 2025.02.07 |
[JAVA] OptionalInt 사용법 - 최솟값, 최댓값 뽑을 때 (Feat. stream) (0) | 2025.02.07 |
[JAVA] 숫자 형변환 - int형의 나눗셈으로 double형 유리수 만들기 (3) | 2025.02.07 |