결국 무엇이든 해내는 사람

(Java)Day10 - 인터페이스와 추상화,다형성 본문

두서없는 공부 노트/JAVA

(Java)Day10 - 인터페이스와 추상화,다형성

kkm8257 2020. 8. 19. 15:32
반응형
package first;

public interface InterBoard {

	//인터페이스에 선언을 해놓고, 가져다가 반드시 선언된 그대로 모두 구현하면 되는게 인터페이스
	//메소드가 있지만 가져다 쓰거나 오버라이드 하거나, abstract가 붙은 메소드는 반드시 구현하면 되는게 abstract class

	abstract void upload();
	abstract void delete();
	
	abstract void rePage();
	abstract void exPage();
}

 

주석이 곧 내용 ..

 

 

인터페이스를 통해 추상화 메소드 들을 선언만 해놓음. 인터페이스에는 구현해놓지 않는다.

즉 인터페이스를 implements하여 구체적으로 구현하라는 뜻

 

package first;

public class BaseBoard implements InterBoard{

	@Override
	public void upload() {
System.out.println("업로드 완료");
		
	}

	@Override
	public void delete() {
System.out.println("게시물 삭제완료");		
	}

	@Override
	public void rePage() {
System.out.println("새로고침");		
	}

	@Override
	public void exPage() {
System.out.println("이전페이지");		
	}

	
	
}

 

인터페이스 InterBoard  implements하여 오버라이드 합니다.

구체적으로 구현을 완료하고(빠짐없이)

 

이 BaseBoard라는 클래스는 밑에있는 FreeBoard가 상속받습니다.

package first;

public class FreeBoard extends BaseBoard{

	void FreeBoard_print() {
		
		rePage(); //InterBoard인터페이스의 메소드를 구현한 BaseBoard 클래스에서 상속받은 메소드 rePage
	}
	
	
	
}

 

그러면 FreeBoard의  FreeBoard_print()메소드 호출시  상속받은 BaseBoard의 rePage()메소드를 호출합니다.

 

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

 

좀더 심화로 파봄

 

 

package second;

public interface InterBoard {

	//인터페이스에 선언을 해놓고, 가져다가 반드시 선언된 그대로 모두 구현하면 되는게 인터페이스
	//메소드가 있지만 가져다 쓰거나 오버라이드 하거나, abstract가 붙은 메소드는 반드시 구현하면 되는게 abstract class

	abstract void upload();
	abstract void delete();
	
	abstract void rePage();
	abstract void exPage();
	abstract void herePrint();
}

 

주석이 곧 내용,,,

 

InterBoard 인터페이스에 herePrint()라는 메소드 선언 추가

package second;

public class BaseBoard implements InterBoard{

	@Override
	public void upload() {
System.out.println("업로드 완료");
		
	}

	@Override
	public void delete() {
System.out.println("게시물 삭제완료");		
	}

	@Override
	public void rePage() {
System.out.println("새로고침");		
	}

	@Override
	public void exPage() {
System.out.println("이전페이지");		
	}

	@Override
	public void herePrint() {
		System.out.println("BaseBoard 여기는 BaseBoard");
		
	}


	
}

 

위 코드는  BaseBoard클래스의 코드 . 인터페이스를 받아서 기능을 구현함

 

그리고 MemberBoard와 FreeBoard 코드 는 밑에 적어둠

package second;

public class MemberBoard extends BaseBoard {



	@Override
	public void upload() {
		System.out.println("업로드 완료22222222");

	}

}

 

package second;

public class FreeBoard extends BaseBoard{

	public void nicePrint() {
		
		rePage(); //InterBoard인터페이스의 메소드를 구현한 BaseBoard 클래스에서 상속받은 메소드 rePage
	}
	
	public void herePrint() {
		System.out.println("hihi  이거는 FreeBoard");
	}
	
	
	
}

 

그리고 Main... 메인에 주석 겁내 달아놨음..

 

package second;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		//InterBoard는 인터페이스고, BaseBoard는 InterBoard로부터 implements 됨 . 그리고 이런 
		//BaseBoard는 Memberboard와 FreeBoard에 상속을 해줌
		
		BaseBoard in1 = new MemberBoard();  //가능  , 겉모양은 InterBoard지만 실제로는 BaseBoard이다  . 서로 상속해주고 상속받는 사이
		InterBoard in2 = new FreeBoard();  //가능 겉모양은 InterBoard지만 실제로는 FreeBoard이다 .  부모에게 상속받는 클래스와 그 부모의 인터페이스 관계
		
		
//		in1.nicePrint();
		in1.upload(); //BaseBoard라인을 기준으로 하되 (BaseBoard에 있는거  사용가능), MemberBoard에 오버로딩된걸 쓴다
		in2.herePrint(); //InterBoard라인을 기준으로해야함(InterBoard에  herePrint가 추상으로 존재해야함, 그래야 인터페이스로 받는 BaseBoard에서 구현을 하고 그 기능을 상속받는겨.)
		//즉 FreeBoard에만  herePrint메소드가 존재한다고 사용할수가없음  
		//위의 herePrint는 FreeBoard에서 상속받은 BaseBoard의 hereBoard메소드를 출력함
///////////////////////////////////////////////////////////////////////////	
		//만약 FreeBoard에 주석으로 된 herePrint()의 주석을 해제하면 
		//FreeBoard의 오버라이드된 herePrint가 수행된다. 이조건은 상속받은 BaseBoard에 구현이 되어있어야함
		

//		FreeBoard in3= new FreeBoard();
//		in3.herePrint();
	}

}

 

오버라이드와 오버라이드의 연속.

 

Main에 보이는 객체생성의 특징이  다형성을 의미함

 

매우 복잡한 시도를 해보았는데 결국  인터페이스를 받았을 때 적절히 오버라이드를 하는것이 중요함

 

또한 다형성에서는 하나의 타입(부모)으로 다양한 결과를 얻어내기 위함이다.

 

 

즉  위코드를 살짝 수정해서 (위에꺼필요한것만 봐도댐 수정한건 아래부분이 전부라서 노상관)

 

package second;

public class FreeBoard extends BaseBoard{

	public void nicePrint() {
		
		rePage(); //InterBoard인터페이스의 메소드를 구현한 BaseBoard 클래스에서 상속받은 메소드 rePage
	}
	
	public void herePrint() {
		System.out.println("hihi  이거는 FreeBoard");
	}
	
	
	
}

 

package second;

public class MemberBoard extends BaseBoard {



	@Override
	public void upload() {
		System.out.println("업로드 완료22222222");

	}

	
	public void herePrint() {
		System.out.println("hihi  이거는 MemberBoard");
	}
	
}

FreeBoard클래스와 MemberBoard클래스를 요로콤 herePrint()메소드를 수정해준다. 본인이 어디 클래스인지 알려고 sysout을 저런식으로 작성해줌

 

 

그리고 herePrint()메소드를 호출하면

 

package second;

public class Main {

	public static void main(String[] args) {

		BaseBoard in1 = new MemberBoard(); 
		BaseBoard in2 = new FreeBoard();	
		
	
		
		in1.herePrint();
		in2.herePrint();
		
		

		
		
	}

}

 

 

 

오버라이드된 값들이 출력댐

반응형
Comments