<1교시>
추상클래스(=부모클래스)
--> 상속용
--> public abstract class 클래스명 { }
--> new 연산자로 객체 직접 생성 불가능 ( A a = new A() ; )
--> 용도 : 1) 공통된 필드와 메소드의 이름 통일 2) 실체 클래스 작성 시간 절약
실체클래스(=자식클래스)
--> 모든 필드, 메소드 물려받음
[p360~361 예제] ex06
package ex06;
public abstract class Phone { // 추상클래스
//필드
String owner;
// 생성자
public Phone(String owner) {
this.owner = owner;
}
//메소드
public void turnOn() {
System.out.println("전원을 켠다");
}
public void turnOff() {
System.out.println("전원을 끈다");
}
public abstract void sound(); // 오류(재정의가 없기때문에)
}
package ex06;
public class SmartPhone extends Phone {
//생성자
public SmartPhone(String owner) { // 매개변수 1개를 이용한 생성자
super(owner); // 부모생성자의 영향을 받아.. 매개변수 1개 처리
}
//메소드
public void internetSearch() {
System.out.println("인터넷 검색");
}
@Override
public void sound() {
// TODO Auto-generated method stub
}
}
package ex06;
public class Test {
public static void main(String[] args) {
//Phone p = new Phone; 불가능!
SmartPhone s = new SmartPhone("홍길동");
s.turnOn();
s.internetSearch();
s.turnOff();
}
}
/* 출력
전원을 켠다
인터넷 검색
전원을 끈다
*/
추상메소드
--> 추상 클래스에서만 선언 가능
--> 무조건 상속받아야함!! : 자식클래스에서 재정의(source > override )
--> 할아버지, 아버지, 자식 : 아버지가 상속 안받으면 자식에게 물려줄수있음
(할아버지 - 추상클래스, 아버지 - 추상클래스, 자식 - 재정의 )
[p3363~365 예제]
package ex07;
public abstract class A { // 추상클래스
String kind = "포유류"; // 생성자에 초기화 아니어도 이렇게 초기화도 가능(else 구문)
public void breathe() {
System.out.println("숨을 쉰다");
}
public abstract void sound(); // 추상 메소드 (실행영역 만들지 X --> 재정의 해야하므로)
}
package ex07;
public class D extends A {
// 생성자
public D() {
// this.kind = "포유류";
}
// 메소드
@Override
public void sound() { // 재정의
System.out.println("멍멍");
}
}
package ex07;
public class C extends A {
// 생성자
public C() {
// this.kind = "포유류";
}
// 메소드
@Override
public void sound() { // 재정의
System.out.println("야옹");
}
}
package ex07;
public class E extends A {
//생성자
public E() {
this.kind = "양서류"; // if구문
}
//메소드
@Override
public void sound() {
System.out.println("개굴");
}
}
package ex07;
public class Test {
public static void main(String[] args) { // 메인메소드
D d = new D(); // 자식클래스로 자식 생성자
C c = new C(); // 자식클래스로 자식 생성자
E e = new E(); // 자식클래스로 자식 생성자
d.sound();
c.sound();
e.sound();
System.out.println("==========");
// 자동타입변환
A a; // 초기화
a = new D(); // 부모 A클래스로 자식 생성
System.out.println(a.kind);
a.sound();
a = new C(); // 업데이트
a.sound();
a = new E(); // 업데이트
System.out.println(a.kind);
a.sound();
System.out.println("==========");
// 메소드 다형성
animalSound(new D());
animalSound(new C());
}
public static void animalSound(A a) { // 부모 a로 해서 자식 D,C,E 다 가능하게
a.sound();
}
}
[p367 Q03]
package ex07;
public abstract class HttpServlet { // 추상클래스
public abstract void service(); // 추상메소드
}
package ex07;
public class Login extends HttpServlet{
@Override
public void service() {
System.out.println("로그인합니다");
}
}
package ex07;
public class File extends HttpServlet {
@Override
public void service() {
System.out.println("파일다운로드합니다");
}
}
package ex07;
public class HttpTest {
public static void main(String[] args) {
method(new Login()); // 로그인 (자식)
method(new File()); // 파일 다운로드 (자식)
}
public static void method(HttpServlet s) {
s.service();
}
}
<2교시>
인터페이스(interface) * project3에서 사용
--> 객체의 사용 방법을 정의한 타입
--> 선언 : public interface 이름 { } * interface 파일 열면 됨
--> 멤버 : 상수(=변수와 동일)필드, 추상메소드
interface 이름 {
[public static final 생략] 타입(int 등) 상수이름 = 값; // 이름은 무조건 대문자
타입(리턴) 메소드이름 (매개변수... );
}
--> 모든 요소들을 재정의 해야함 (why? 인터페이스는 상속받기 위해 사용되므로)
클래스 - 클래스 상속 (= 친가)
ㄴ> extends ( Class A - B - C ) // 단 하나만 상속
클래스 - 인터페이스 상속 (= 외가)
ㄴ> implements ( Interface AA - BB - CC ) // 여러개 상속 가능
인터페이스 - 인터페이스 상속
ㄴ> interface 하위인터 extends 상위인터1,2 ... (p399)
[p373~376 예제]
package ex01;
public interface RemoteControl {
//인터페이스에서 변수는 상수가 됨
public int MAX_VOLUME = 10;
public int MIN_VOLUME = 0;
// 인터페이스에서 메소드는 추상메소드가 됨
public void trunOn();
public void trunOff();
public void setVolume(int v);
}
package ex01;
public class T implements RemoteControl {
// 필드
private int volume; // 전역변수 (내꺼) (T클래스에서만 사용할수있음)
// 다른 클래스에서 사용하려면 setter getter 써야함
// 메소드 (부모꺼)
@Override
public void trunOn() {
System.out.println("티비 켜다");
}
@Override
public void trunOff() {
System.out.println("티비 끄다");
}
@Override
public void setVolume(int v) { // 물려받은 set
if(v > RemoteControl.MAX_VOLUME) {
this.volume = RemoteControl.MAX_VOLUME; // 볼륨 10까지가 최대
} else if(v < RemoteControl.MIN_VOLUME) {
this.volume = RemoteControl.MIN_VOLUME; // 볼륨 0으로 최소 처리
} else {
this.volume = volume;
}
System.out.println("현재 티비 볼륨: " + this.volume);
}
}
package ex01;
public class A implements RemoteControl {
// 필드
private int volume;
//메소드
@Override
public void trunOn() {
System.out.println("오디오 켜다");
}
@Override
public void trunOff() {
System.out.println("오디오 끄다");
}
@Override
public void setVolume(int v) { // 물려받은 set
if(v > RemoteControl.MAX_VOLUME) {
this.volume = RemoteControl.MAX_VOLUME; // 볼륨 10까지가 최대
} else if(v < RemoteControl.MIN_VOLUME) {
this.volume = RemoteControl.MIN_VOLUME; // 볼륨 0으로 최소 처리
} else {
this.volume = v;
}
System.out.println("현재 오디오 볼륨: " + this.volume);
}
}
package ex01;
public class Test {
public static void main(String[] args) {
RemoteControl r; // 선언만
r = new T();
r.trunOn();
r.setVolume(11); // MAX 값(10) 적용
r.trunOff();
System.out.println("================");
r = new A();
r.trunOn();
r.setVolume(5);
r.trunOff();
}
}
<3교시>
다중 인터페이스
--> 형식: public class 클래스이름 implements 인터페이스1, 인터페이스2 { }
[p378 위 예제 이어서 사용]
package ex01;
public class T implements RemoteControl, Searchable { // 외할아버지, 외할머니
// 필드
private int volume; // 전역변수 (내꺼) (T클래스에서만 사용할수있음)
// 다른 클래스에서 사용하려면 setter getter 써야함
// 메소드 (부모꺼)
@Override
public void trunOn() {
System.out.println("티비 켜다");
}
@Override
public void trunOff() {
System.out.println("티비 끄다");
}
@Override
public void setVolume(int v) { // 물려받은 set
if(v > RemoteControl.MAX_VOLUME) {
this.volume = RemoteControl.MAX_VOLUME; // 볼륨 10까지가 최대
} else if(v < RemoteControl.MIN_VOLUME) {
this.volume = RemoteControl.MIN_VOLUME; // 볼륨 0으로 최소 처리
} else {
this.volume = volume;
}
System.out.println("현재 티비 볼륨: " + this.volume);
}
@Override
public void search(String url) {
System.out.println(url + "을 검색합니다");
}
}
package ex01;
public interface Searchable {
void search(String url);
}
package ex01;
public class Test {
public static void main(String[] args) {
RemoteControl r; // 선언만(외할아버지로부터)
Searchable s; // 선언만(외할머니로부터)
r = new T();
r.trunOn();
r.setVolume(11); // MAX 값(10) 적용
s = new T();
s.search("mbc");
r.trunOff();
System.out.println("================");
////////////
T t = new T(); // 자식 클래스 타입으로 자식 생성자
t.trunOn();
t.setVolume(4);
t.search("tvn");
t.trunOff();
System.out.println("================");
r = new A();
r.trunOn();
r.setVolume(5);
r.trunOff();
}
}
[p385 Q03]
package ex02;
public interface Soundable {
// 타입마다 자식클래스에 어떻게 적어야하는지 구분하기!
String sound();
void sound2();
int sound3(); // 1 = 야옹 2 = 멍멍
}
package ex02;
public class Cat implements Soundable {
@Override
public String sound() { // String 이므로 return있어야함
return "야옹";
}
@Override
public void sound2() {
System.out.println("야옹");
}
@Override
public int sound3() {
return 1;
}
}
package ex02;
public class Dog implements Soundable {
@Override
public String sound() {
return "멍멍";
}
@Override
public void sound2() {
System.out.println("멍멍");
}
@Override
public int sound3() {
return 2;
}
}
package ex02;
public class Test {
public static void main(String[] args) {
printSound(new Cat());
printSound(new Dog());
printSound2(new Cat());
printSound2(new Dog());
printSound3(new Cat());
printSound3(new Dog());
}
private static void printSound(Soundable s) {
System.out.println(s.sound());
}
private static void printSound2(Soundable s) {
s.sound2();
}
private static void printSound3(Soundable s) {
// int num = s.sound3();
if(s.sound3() == 1) { // num == 1
System.out.println("야옹");
} else {
System.out.println("멍멍");
}
}
}
<4교시>
[p389~390 예제]
package ex03;
public interface Tire {
void roll();
}
package ex03;
public class H implements Tire {
@Override
public void roll() {
System.out.println("한국타이어 굴러간당");
}
}
package ex03;
public class K implements Tire {
@Override
public void roll() {
System.out.println("금호타이어 굴러간당");
}
}
package ex03;
public class Car {
Tire fl = new H(); // 앞왼
Tire fr = new H(); // 앞오
Tire bl = new K(); // 뒤왼
Tire br = new K(); // 뒤오
void run() {
fl.roll();
fr.roll();
bl.roll();
br.roll();
}
}
package ex03;
public class Test {
public static void main(String[] args) {
Car c = new Car(); // 객체 생성(차 뽑음)
c.run();
c.bl = new H(); // 뒤왼을 한국타이어로 교체
System.out.println("=====교체=====");
c.run();
}
}
다형성 : 부모클래스 타입으로 받겠다는 의미
[p393~394 예제]
package ex04;
public interface Vehicle { // 부모
void run(); // 추상메소드
}
package ex04;
public class Bus implements Vehicle { // 자식
@Override
public void run() {
System.out.println("버스가 달립니다");
}
}
package ex04;
public class Taxi implements Vehicle { // 자식
@Override
public void run() {
System.out.println("택시가 달립니다");
}
}
package ex04;
public class Driver { // 운전자는 자식 중 선택
public void drive(Vehicle v) { // 매개변수 이용
v.run();
}
}
package ex04;
public class Test {
public static void main(String[] args) {
Vehicle v = new Bus(); // 부모 인터페이스 타입으로 자식 생성자
Vehicle v2 = new Taxi(); // 부모 인터페이스 타입으로 자식 생성자
v.run();
v2.run();
////////////////////////////////////
Driver d = new Driver();
System.out.println("===========");
d.drive(v);
d.drive(v2);
////////////////////////////////////
drive3(v);
}
public static void drive3(Vehicle v) { // Test클래스에서만 사용할 수 있음
System.out.println("===========");
v.run();
}
}
[p395~936 위 예제 이어서 사용]
package ex04;
public interface Vehicle { // 부모
void run(); // 추상메소드
}
package ex04;
public class Bus implements Vehicle { // 자식
@Override
public void run() {
System.out.println("버스가 달립니다");
}
public void checkFare() {
System.out.println("승차요금을 체크합니다");
}
}
package ex04;
public class Test {
public static void main(String[] args) {
Vehicle v = new Bus(); // 부모 인터페이스 타입으로 자식 생성자
Vehicle v2 = new Taxi(); // 부모 인터페이스 타입으로 자식 생성자
Bus b = (Bus)v; // 강제 형변환
b.checkFare();
/////////////////////////////////
Bus b1 = new Bus();
b1.run();
System.out.println("===========");
b1.checkFare();
///////////////////////////////////
v.run();
v2.run();
////////////////////////////////////
Driver d = new Driver();
System.out.println("===========");
d.drive(v);
d.drive(v2);
////////////////////////////////////
drive3(v);
}
public static void drive3(Vehicle v) { // Test클래스에서만 사용할 수 있음
System.out.println("===========");
v.run();
}
}
[계산기 예제] ch08 >ex04 > Cal, Four, T01
ㄴ> 여유될 때......
<5교시 JSP 준비>
1. 아파치 톰캣 설치 ( https://tomcat.apache.org ) > Server Port : 8005 수정
2. 이클립스 EE 설치 ( https://www.eclipse.org/ ) > 20년06월껄로
3. 아파치 톰캣, EE 연동
EE 사용
1. project 생성 : File > New > Dynamic web project
2. WebContent > 우클릭 > New > JSP file
3. 실행 : test 우클릭 > Runas > 1.Run on Server
ㄴ> 오류 404 : 파일 없음을 의미
<6교시>
WebContent > 우클릭 > New > Folder
<7교시>
include : 대표 하나만 수정하면 전부다 수정되게(header, footer에 잘 쓰임)
ㄴ> 파일로 땡겨올 땐 <%@ include file="/include/이름.jsp" %>
css 땡겨올 땐 <link rel="stylesheet" href="/css/basic.css">
<8교시>
project1 틀 잡기
'JAVA > jsp' 카테고리의 다른 글
회원가입- 주소 추가하기 (0) | 2023.01.19 |
---|---|
230116 (0) | 2023.01.16 |
230112_상속, 오버라이딩, 다형성 (0) | 2023.01.12 |
230111_멤버(필,생,메), 오버로딩, 접근제한자 (0) | 2023.01.11 |
230110_참조, 배열, 객체, 필드 (0) | 2023.01.10 |