final, final 클래스, final 메소드, 인터페이스

2019. 3. 11. 17:21JAVA

-------------------------------final클래스 final메소드-------------------


final 클래스는 상속이 불가하다.



public final class A {

부모자격 박탈 

상속금지

}


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

public class B extends A {

(final클래스는 상속이 안돼 에러)

}





final 메소드는 재정의가 불가하다.


public final void m1(){...} ---> public void m1(){...} // 에러

(final 메소드 재정이라 에러)


public void m2(){...} ---> public void m2(){...} // 가능






-----------------------------인터페이스--------------------------------


인터페이스란.

구현객체가 제공할 기능을 규정하는것을 인터페이스라 한다.

객체 추상화랑 비슷함


///인터페이스 메소드 앞에는 public abstract 가 기본적으로 붙어있는것이다.



(객체)      (인터페이스)      (객체)

운전자 --> 메뉴얼   -->

손님 --> 메뉴판   --> 주방




접점을 인터페이스라고 한다. 객체간의 서로 알필요없이 접점인 인터페이스만 알면 된다.


손님 --> 메뉴판   <-- 주방







  ##추상메소드와 인터페이스의 차이##



추상 클래스 인터페이스


    |     |

    v     v


구현부담의 감소 사용방법 같은 구현객체의 생성, 교환성

(구현도 하면서 추상화로 몇몇 메소드만 규약한것) (규약만 하는것, 기본이 abstract다.)






앞으로는 이렇게 작성을 한다.

public class Menu{ ---> public interface Menu{


} }



자바 8미만 기준.

인터페이스는 상수와 추상메소드를 가진다


자바 8

자바 8이상을 인터페이스가 정적메소드, default메소드, 상수, 추상메소드 4가지를 가진다.




interface 특징

- 상수 / 추상메소드

- 객체생성 X

- 다중 상속을 지원(클래스는 단일 상속, 한곳에서만 상속받는것 을 지원한다.)

  (인터페이스 끼리는 다중 상속이 가능하다.)

  // public class Genesis extends AbstractCar implements Highpassable, HeadupDisplayble{

  // public interface Safeable extends Camare, AutoDrivable{ //Camera, AutoDrivable 은 인터페이스


- 구현클래스는 여러개의 인터페이스를 구현할수 있다.

- 인터페이스는 클래스를 상속받을 수 없다. (클래스에는 변수, 생성자, 메소드등 들어있기때문에)





------------예시----------------------(interface)


public interface MemberService {

// 추상메소드

public abstract void removeAllMembers();

// public abstract 는 생략이 가능하다.

public  void printAllMembers();


public void removeMemberByNo(int no);


public String getMemberNameByNo(int no);


}




interface 상속일 경우 extends가 아니라 implements를 적는다.


-------------예시-----------------------(class)

public class MemberServiceImpl implements MemberService{

public void removeAllMembers(){

System.out.println("엑셀파일에서 모든 회원정보를 삭제한다.");

}

public void printAllMembers(){

System.out.println("엑셀파일의 모든 회원정보를 출력한다.");

}


public void removeMemberByNo(int no){

System.out.println("엑셀파일에서 "+no+"번 회원을 삭제한다.");

}


public String getMemberNameByNo(int no){

String name = null;

name = "홍길동";

System.out.println("엑셀파일에서 "+no+"번 회원의 이름을 조회한다.");

return name;

}


}

}



------------예시-----------------------(App파일)


public class MemberApp{

public static void main(String[] args){

// MemberServiceImpl 인터페이스를 구현한 객체 생성

MemberServiceImpl service1 = new MemberServiceImpl();


service1.printAllMembers();


// 인터페이스로 구현한 객체는 인터페이스타입의 변수에 담을 수 있다.

MemberService service2 = new MemberServiceImpl();

service2.printAllMembers();

}

}




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




##인터페이스는 다른 인터페이스를 하나이상 상속받을 수 있다.##

////////////////////////////////////////////////////////

-----------------예시----------------------------------

public interface Camera{

void record();

}


-----------------예시2---------------------------------

public interface AutoDrivable{

void autoDrive();

}


-----------------예시3---------------------------------

// 인터페이스는 다른 인터페이스를 하나이상 상속받을 수 있다.

public interface Safeable extends Camare, AutoDrivable{

void airbag();

}







////////////////////////////////////////////////////////////////


-------------------예시 1 --------------------------------------

public interface DataReader {

void read();

}


-------------------예시 2----------------------------------------

public class NetworkDataReader implements DataReader {

public void read(){

System.out.println("네트워크 통신을 통해서 필요한 데이터를 읽는다.");

}

}


-------------------예시 3-----------------------------------------

public class HRMgr {


// DataReader 인터페이스를 구현한 객체가 연결될 잭(그릇)을 선언

private DataReader reader;


public void setReader(DataReader reader){

this.reader = reader;

}


public void load(){

reader.read();

}

}


-------------------예시 4-------------------------------------------

public class HRMgrApp{

public static void main(String[] args){


// HRMgr 객체 생성

HRMgr mgr = new HRMgr();

// DataReader인터페이스를 구현한 NetworkDataReader객체 생성

NetworkDataReader reader1 = new NetworkDataReader();

// HRMgr의 reader잭에 위에서 생성한 NetworkDataReader객체 연결

mgr.setReader(reader1);


mgr.load();

}

}


-----------------결 과------------------------------------------------

---------- 실행 ----------

네트워크 통신을 통해서 필요한 데이터를 읽는다.


출력 완료 (0초 경과) - 정상 종료