추상클래스 AbstractTest

package day15;

public class AbstractTest {

	public static void main(String[] args) {
		// 클래스 A의 객체 a를 생성
		A a = new A();	//기능은 없지만 생성되는 데 문제 없음

		//추상클래스B의 객체 b를 생성
		B b = new B(); //오류발생: 추상클래스는 객체를 생성할 수 없다
		
		//추상 클래스 B를 상속받은 클래스 C의 객체 c를 생성
		C c = new C();
		
		//클래스 C를 이용하여 객체를 생성한 후, 추상 클래스 B의 객체에 저장
		B b1 = new C();	//클래스 타입변환(자동)
	}

}
class A{}	//일반클래스

abstract class B{
	abstract void print();	//추상 메소드 만들 수 있음. (구현을 안해도 되니깐 더 편함)
} //추상클래스

class C extends B{

	@Override
	void print() {
		// TODO Auto-generated method stub
		
	}}	//B를 상속받는 일반 클래스 C
//추상메소드 B에 추상메소드를 만들자 C에 오류남. 해결책1. C를 추상클래스로 만들거나 해결책2. 오버라이드를 해줘야 함.

// 타입 변환은 부모-자식 관계에서만 가능함
**// 상속받은 자식클래스를 이용하거나	C c = new C(); , 상속받은 클래스를 통해서 객체 생성가능 B b1 = new C();**

익명 객체 AnonymousTest

public class AnonymousTest {

	public static void main(String[] args) {
		//TvRemocon클래스를 이용하여 객체를 만든 것과 같은 결과를 가진다.
		//단, 해당 익명객체를 사용하려면 코드를 복붙해야 하기 때문에 비효율적이다.
		Remocon r = new Remocon() {
			@Override
			public void turnOn() { System.out.println("전원 켜짐");}	//이거메소든데 main안에있잖아. 원래 main안에서 메소드선언못하는데 한거라면 => 익명객체다 
			@Override
			public void turnOff() { System.out.println("전원 꺼짐");}
			
		};
		r.turnOn();
	}
}

abstract class Parent{
	public abstract void print();
}

class Child extends Parent{
	@Override
	public void print() {
		System.out.println("안녕");
	
	}
}

class TempA{
	//private Parent p = new Child();		//앞에서 child 클래스만들고나서 객체를 만든 것
	//Parent 추상 클래스를 이용하여 새로운 익명 객체를 생성한 후, 생성한 익명 객체의 주소를 p와 저장
	private Parent p = new Parent(){
		int num = 10;
		public void print() {				//상속받고나서 메소드부모꺼 쓴건가싶음
			System.out.println("안녕");
		}
	};
}
interface Remocon{
	void turnOn();
	void turnOff();
}
class TvRomocon implements Remocon {
	public void turnOn() {System.out.println("전원 켜짐");}
	public void turnOff() {System.out.println("전원 꺼짐");}
	
	}

인터페이스 메소드 Interface method / UserService

//회원과 관련된 처리를 하는 기능들을 모아놓은 인터페이스
public interface UserService {

	/* 기능    : 회원의 아이디와 비밀번호가 주어졌을 때, 로그인 가능 여부를 알려주는 메소드 
	 * 매개변수 : 아이디, 비밀번호 => String id, String pw
	 * 리턴타입 : 로그인 가능 여부 => boolean
	 * 메소드명 : logIn
	 * */
	/*abstract*/ boolean logIn(String id, String pw);	**//인터페이스에서는 abstract안써도 자동으로 추상메소드로 됨 + 구현부가없어서 {}중괄호쓰면안됨**.
	
	
	/* 기능    : 회원의 아이디, 비밀번호, 이메일, 전화번호가 주어지면 해당 정보로 회원가입하여 가입 여부를 알려주는 메소드 
	 * 매개변수 : 회원의 아이디, 비밀번호, 이메일, 전화번호=> 회원 정보 => User user
	 * 리턴타입 : 회원가입 성공 여부 => boolean
	 * 메소드명 : signUp
	 * */
	boolean signUp(User user);
	
	/* 기능    : 회원의 이메일, 전화번호를 수정하는 메소드 
	 * 매개변수 : 수정할 이메일, 전화번호 =>  회원 정보 => User user
	 * 리턴타입 : 없음 => void 
	 * 메소드명 : modifyUser
	 *  */
	void modifyUser(User user);
	
}
class User{
	String id;
	String pw;
	String email;
	String num;
	
}

인터페이스 Interface / BoardService

public interface BoardService {

	/* 기능    : 게시글 등록하는 메소드
	 * 			(=게시글 제목, 내용, 작성자, 작성일이 주어지면 게시글을 등록하는 메소드)
	 * 매개변수 : 등록할 게시글(게시글번호, 제목, 내용, 날짜, 작성자) =>  게시글 정보 =>  Board board;
	 * 리턴타입 : void
	 * 메소드명 : addPost
	 * */
	public void addPost(Board board);		//interface에서는 접근제한자를 안써도 기본으로 public으로 사용됨
	
	/* 기능    : 게시글 삭제하는 메소드
	 * 			게시글 번호가 주어지면 해당 게시글 번호를 삭제한 후, 삭제 여부(url을 통해서 삭제하다보면 삭제가 잘못될 수도 있음 따라서 여부를 알려줘야함)를 알려주는 메소드
	 * 매개변수 : 삭제할 글번호
	 * 리턴타입 : 삭제여부=> boolean
	 * 메소드명 : deletePost
	 * */
	public boolean deletePost(int postNum);
	
	/* 기능    : 게시글 수정하는 메소드
	 * 			게시글 번호와 수정할 게시글 정보(제목, 내용)가 주어지면 해당 게시글의 내용을 수정하는 메소드
	 * 매개변수 : 게시글 번호와 수정할 게시글 정보 => Board board
	 * 리턴타입 : 없음=> void
	 * 메소드명 : editPost
	 * */
	public void editPost(Board board);
	
	/* 기능    : 게시글번호가 주어지면 게시글을 전달(=알려주는) 하는 메소드  //게시글을 눌러서 들어갔을 때 필요
	 * 			게시글 번호가 주어지면 주어진 게시글에 대한 게시글 정보(제목, 내용, 작성자, 작성일)을 알려주는 메소드
	 * 매개변수 : 게시글번호 
	 * 리턴타입 : 게시글 정보 => Board
	 * 메소드명 : getPost
	 * */
	public Board getPost(int postNum);
	
	/* 기능    : 게시글 리스트를 가져오는 메소드	//홈화면에서 게시글 리스트가 뜰 때 필요
	 * 			게시글의 정보(제목, 내용, 작성자, 작성일)들을 가져오는 메소드
	 * 매개변수 : 없음
	 * 리턴타입 : 게시글 정보들 => Board []     //게시글정보 하나 Board, 게시글정보들은 Board []배열로 나타냄
	 * 메소드명 : listPost
	 * */
	public Board[] listPost();
	
	/* 기능    : 검색어가 들어간 게시글 리스트를 가져오는 메소드
	 * 매개변수 : 검색어 => String words
	 * 리턴타입 : 검색된 게시글 정보들 => Board[]
	 * 메소드명 : listPost
	 * */
	**public Board[] listPost(String words);**	
	//검색어가 들어가긴 했지만, 결국은 게시글 정보를 가져오는 것이기때문에 **메소드오버로딩으로 메소드명을 똑같이 사용(매개변수가 다름) 할 수 있음**.
	
	
	
	
	
}
class Board{
	int postNum;
	String title;
	String writer;
	String contents;
	String registerDate;
}

인터페이스의 다형성 Interface PolymorphismTest

//인터페이스의 다형성
public class PolymorphismTest {

	public static void main(String[] args) {
		Car car = new Car();
		car.frontLeft.roll();
		car.frontRight.roll();

		repair(car.frontLeft);	//한국타이어 수리
		repair(car.frontRight);	//금호타이어 수리
		
	}
	**//인터페이스를 이용한 매개변수의 다형성을 살펴보는 예제**
	public static void repair(Tire tire) { //매개변수가 Tire로 오게해서 한국,금호타이어를 모두 수리할 수 있도록 함 => 매개변수의 다형성
		/*(HankookTire)tire.company : Tire 인터페이스의 멤버변수 company를 찾은 후, tire를 HankookTire로 타입변환
		 *((HankookTire)tire).company : tire를 한국타이어로 타입 변환 후, 멤버 변수 company를 찾음
		 * 
		 * */
		if(tire instanceof HankookTire) {
			HankookTire t = (HankookTire)tire;
			System.out.println(t.company + "수리합니다."); //밑에랑 같은거
			System.out.println(((HankookTire)tire).company + "수리합니다.");
		}
		if(tire instanceof KumhoTire) {
			KumhoTire t = (KumhoTire)tire;
			System.out.println(t.company + "수리합니다.");
			System.out.println(((KumhoTire)tire).company + "수리합니다.");
		}
	}
}
class Car{			// hankooktire = new kumhotire; 안돼. 상속관계가 아니라서 
	**//인터페이스를 이용한 멤버변수(필드)의 다형성 예제**
	Tire frontLeft = new HankookTire();
	Tire frontRight = new KumhoTire();
}	

interface Tire{
	void roll(); //바퀴가 구르는 기능 
}
class KumhoTire implements Tire{
	String company = "금호";
//class랑 interface 가 KumhoTire앞자리에 올 수 있고    tire앞에는 extends나 implements가 올수 있는자리. 
//class => interface는 객체를 만들 수 없으므로 class이며, implements => tire를 구현해야함.
	public void roll() {
		System.out.println("금호 타이어가 굴러갑니다.");
	}
}
class HankookTire implements Tire{
	String company = "한국";
	public void roll() {
		System.out.println("한국 타이어가 굴러갑니다.");
	}
}
public interface RemoteControl {
//class대신 interface가 붙음
	
	//전원 켜기&끄기
	public void powerOn();
	public void powerOff();
}
//RemoteControl 인터페이스를 구현한 TvRemoteControl 구현 클래스
public class TvRemoteControl implements RemoteControl{

	private boolean power;
	private int channel;
	private int volume;
	private final int MAX_CHANNEL = 999;
	
	@Override
	public void powerOn() {power = true;}

	@Override
	public void powerOff() {power = false;}

	public void channelUp() {
		if(!power) {	//power가 꺼져있으면
			return;		//메소드 종료
		}
		channel++;
		if(channel > MAX_CHANNEL) {
			channel = 1;
		}
	}
	
	public void channelDown() {	
		if(!power) {	//power가 꺼져있으면
			return;		//메소드 종료
		}
		channel++;
		if(channel <1) {
			channel = MAX_CHANNEL;
		}
	}
	
	public void setChannel(int channel) {
		if(!power) {	//power가 꺼져있으면
			return;		//메소드 종료
		}
		**this.channel = channel;**
		if(channel < 1 || channel >MAX_CHANNEL) {
			channel = MAX_CHANNEL;	
		}
	}
}

ExceptionTest 예외, 예외처리