추상클래스 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 예외, 예외처리