GitHub

https://github.com/Backcoder-June

BackCoder 기록 그리고 숙달

Back to the Java

abstract 클래스-메소드 / super 메소드-생성자

Backcoder 2022. 6. 27. 20:36

<abstract> => 클래스/메소드
abstract 메소드 - 선언부만 있고, 구현부 X  
메소드 하나라도 abstract 면 클래스도 무조건 abstract 

abstract class 도형{ 
abstract void 면적( );       //여기까지만 쓰는게 선언만 하는 것 
public void ( ) { sout }  }  // 다른 일반 메소드 O

  => abstract 는 "상속" 해서 => 구현 해서 사용한다. 
       모든 abstract 메소드 구현이 필수 (overriding)

class 사각형 extends (abstract)도형{ 
@Override
void (abstract)면적 ( ) { 가로 * 세로 ; }  }

 

여러개의 서로다른 클래스 내부에 필수적으로 구현해야할 공통메소드 정해놓는것 ( 필수구현 보장 )
 
(각자 필요에 따라서 실제적 구현은 따로 해라)
사각형 extends 도형 
원 extends 도형 

(혹은 협업할 때, 구현해야할 클래스가 많다. => 필수 공통메소드 서로 "약속" 해놓고 
각자 필요에 맞게 구현한다. => 나중에 합칠 때, 메소드 명부터해서 어느정도 공통점을 갖게된다. ) 

- final abstract class

    abstract final void m( ){ }     ( X ) 모순 , 같이붙을 수 없는 modifier (대표적) 


------------------------------------------------------------------


<super> 
super - 상속하는 상위 객체 의미 

super. 멤버변수    => 상위 멤버변수와 하위 멤버변수 구분-> 상위멤버변수를 가져옴 
(this. 와 비교 => this 는 현재 클래스 ) 

class Employee { name = 회사원 } 
class Manager extends Emplyee{ name = 관리직 } 

void test( ) { String name = "지역변수"; 
sout (name);    => 지역변수
sout (this. name);     => 관리직 (현재 클래스의 멤버변수)
sout (super. name); } => 회사원 (super 클래스의 멤버변수)


이렇게 변수가 다있는게 아니라, 

1. super 멤버변수만 있거나 
2. this 멤버변수만 있거나 
3. 지역변수만 있거나 할땐 
이렇게 구별할 필요 없이, 그냥 name 때리면 알아서 찾아서 그 값을 가져온다. 
( 2,3번 없으니까 1번 말하나보네. 이런식 ) 
여러개 똑같은 변수명 name 으로 있으면 this/super 써가면서 구별해서 사용한다. 


< super. 메소드( ) > 

=> 하위클래스 메소드 overriding 해서 상위클래서 그대로 재사용 + 추가 수정 

 

void infor( ){ sout( id + name ) } 
< 상속 >
void infor( ){ super.infor( );  //한방에 500코드도 가져오는거지
     sout ( "추가" ) }


변경할꺼 없으면 그냥 상속했으니까 메소드 그대로 사용하면 됨 


< 생성자와 super > 

super( ); 상위 포함 기본 생성자 호출 // (항상 생략되어있는 것)
           생성자 첫문장 super ( ) 자동호출해서 생략해놓은거 
( 생략되어서 존재하고 있음을 인지하자 )

 

class A{
class A(String s) {  }   // 기본생성자가 아니라 파라미터 가진걸로 정의하면 
    // B에서도 super( ); 으로 A 생성자 호출해하는데 파라미터가 
   // 들어있는 생성자라서 호출이 안됨 - 오류 
class B extends A{
// "명시적"으로 파라미터 맞춰서 super 해줘야함 
super("string파라미터주기");    ( 가장 첫 문장으로 )

 

classX{ 
       X (int a, intb ){  }   }   파라미터 가진 생성자 
<상속>
classY extends X {  
       Y(int a, int b) {super(a, b);}    - 생성자 상속 땡겨오기