GitHub

https://github.com/Backcoder-June

BackCoder 기록 그리고 숙달

Back to the Java

상속과 Override, 상속을 막는 final 메소드와 final 클래스.

Backcoder 2022. 6. 27. 19:55

<상속> 

 "클래스"는 extends 클래스 단일상속만 가능 (두개 불가능) 
 "인터페이스"는 extends JpaReposit<Student, Long> , StudentReposit { } 
                    동시 상속 가능 


//클래스는 단일상속밖에 되지 않는 한계에 대해 해결책 - 면접질문 
  1. 객체화를 이용한다. 2. 인터페이스로 돌려서 이용한다. 

< 다른 클래스를 가져다 쓰는 두가지 방법 > 

1. 상속해서 사용 
~이다 ( is ) 관계 => 상속을 사용
(ex. 학생은 사람이다 // 즉 완전한 포함관계) 
 
2. 객체생성 해서 사용
 가지다 (has) 관계=>  객체화 사용
즉, 특정 기능만 가져오고 싶을때!
(ex. 운전자는 자동차의 특정 기능만 가진다. O => 객체 O) 
 

< 상속과 Override > 
- 상,하위클래스 동일명 변수 존재하면 하위클래스(현재클래스)에서 선언된 변수가 
우선적으로 적용된다. (Overriding) (지역변수 우선적용) 
 
=> 근데, 상위클래스 변수를 사용하고 싶다면 
1. super 사용

2. static 사용 
같은 변수 상,하위클래스에서 둘다 static 선언
static 으로 주면 클래스 자체로 접근할수있으니까 
classA.name / classB.name 이렇게 필요한걸로 사용할 수 있다. 


< 메소드 overriding >   
=> 상속 -> 상위메소드 그대로 사용 가능 
=> 추가,변경해서 사용하고자 할때 overriding 사용  (다형성)  
@Override
이름 / 파라미터 / 리턴타입 다 똑같이 하고  
"실행 내용"만 수정.추가해서 사용 한다. 
( modifier는 같거나 더 넓게만 변경 가능 - private<default<protected<public )  

// 매개변수 바꿔서 overriding 하면 => 이건 overloading 으로 인식된다. 
( @Override => 사전방지 가능 ) 

 

메소드 상속 

@Override
public void emp( ){
super.emp( ); 
sout("추가기능") }   // 이렇게 하면 새롭게 emp 가 정의됨 ( 상속한 클래스 내에서 )


재정의 할때,  return super.sum( );   - 이런식으로 그대로 땡겨오면서 추가기능을 주는식으로 편하게 만들기 가능

 

 


< final 과 overriding > 
=> final void method( ){  }  메소드에 붙이면 그 메소드 오버라이딩 불가능  

=> final class{  } 클래스에 붙이면 그 클래스 상속불가능 
     - 상속 안되기 때문에, 그 클래스의 메소드들 전부 오버라이딩  못함   
        => 객체 생성으로 메소드 가져와서 간접적으로는 오버라이딩 가능 ( 직접은 아니고 간접적으로 손댈 수있는 수준 ) 


final class Math{
     int abs(int i){
  if(i>=0){return i;}
  else {return i * -1; } }

class MyMath {
    Math m1 = new Math();
    int abs(int i) {
        return m1.abs(i) * -1;        //객체로 메소드 가져와서 손보기 (아예 다시 정의하는건 X ) 
       }    }

 

<final 과 생성자 > 

객체에서 
private final addFee;  이렇게 못박아도 
"생성자"에서 초기화하는거 딱 한번만 "인정"해준다. 

public Student ( ~ ) { 
this.addFee = Integer.parseInt(args[4]); } 
생성자로 초기화해서 값을 줄 수 있다.  => 생성자 이후로는 값 변경 불가. final 적용됨.   

 

 

<자동 상속> Object class - (Root)
class A (extends java.lang.Object) => dafault 로 자동상속

class A{ i ;}    
A( ){ i = 100; } 
class B extends A{ (super( );)  j;                 => super( ); 가 자동으로 생성(생략)되어있음  
                                             => A( ) 생성자 자동 호출 => i = 100 이라는 A( ) 생성자를 자동호출하여 사용할 수 있다. 
B( ){ j = 200; }  }                          

 

( Class B 순서 : (1) <맨처음>A ( ) 생성자 호출  (2) j ; 선언 (3) B( ) 생성자 호출 )  

B b1 = new B( ); < = 자동으로 new A( ); 도 생성 
Object 객체생성 -> A 객체생성 -> B 객체생성 
거슬러올라가서 맨 위에 super 까지 자동으로 생성