

package inherit2;
import java.util.Date;
public class App3 {
public static void main(String[] args) {
Employee e1 = new Employee();
Employee e2 = new Manager();
Employee e3 = new Sales();
Object obj1 = new Employee();//자바의 모든 class는 extends Object()가 생략되어있다.
Object obj2 = new Manager();
Object obj3 = new Date();//나중에 프로그래밍을 하다가 '상속되어서 이런거구나'하게 됨
}
}
: 실체들간의 공통되는 특성을 추출한 것.

도형으로써 존재하기 위해 반드시 존재해야하는 규정이다.
Rectangle은 범위와 넓이(getArea, getCircumn)를 갖고 있어야 한다는 강제 규약이다.
위로 올라가는 줄은 generalization, 아래로 내려가는 줄은 specialization

package shape;
public abstract class Shape {//추상클래스다. 뼈대가 있는 상태에서 만드는 개념이라 생각!
protected int x;//다른 패키지라도 상속관계에 대해서는 자유롭게 접근 가능.
protected int y;
public Shape() {
}
public Shape(int x, int y) {
this.x = x;
this.y = y;
}
public abstract double getArea();//함수의 모양이 없는 함수. Abstract Method
public abstract double getCircumn();
public String getXY() {
return x + ", " + y;
}
}
package shape;
public class Rectangle extends Shape {// Shape에서 상속받아서 만들어졌지만 사각형이다!
private double width;
private double height;
public Rectangle() {
}
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
public Rectangle(int x, int y, double width, double height) {
super(x, y);
this.width = width;
this.height = height;
}
@Override // 이 도형은 무조건 두 가지 함수가 구현되어져야만 한다. 지우면 빨간줄이 나오고 add unimplemented Method를 추가해야함.
public double getArea() {
return width * height;
}
@Override
public double getCircumn() {
return (width + height) * 2;
}
}
package shape;
public class Triangle extends Shape {//반드시 Shape를 상속해서 만들어라!
private double width;
private double height;
public Triangle() {
}
public Triangle(double width, double height) {
this.width = width;
this.height = height;
}
public Triangle(int x, int y, double width, double height) {
super(x, y);
this.width = width;
this.height = height;
}
@Override
public double getArea() {
return width * height / 2;
}
@Override
public double getCircumn() {
//double z = Math.sqrt(x^2 + y^2);
double z = Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2));
return width + height + z;
}
}
package shape;
public class Circle extends Shape{
private double radius;
public Circle() {
}
public Circle(double radius) {
this.radius = radius;
}
public Circle(int x, int y, double radius) {
super(x, y);
this.radius = radius;
}
@Override
public double getArea() {
return radius * radius * Math.PI;
}
@Override
public double getCircumn() {
return 2 * radius * Math.PI;
}
}
package shape;
public class App {
public static void main(String[] args) {
//Shape s = new Shape(10, 10);//Shape는 골격일 뿐 도형을 생성할 수는 없다.
Shape s1 = new Triangle(10 ,20 ,100, 80);
//이 부분을 쓰지 않고도 선택을 하면 그려지게 하고싶은데? 그걸 가능하게 하는게 spring
//class와 class끼리 관계를 루즈하게 하면서 프로그래밍 하게 한다! -> spring
//관계를 강하게 하면 class하나가 죽으면 다른 class에 영향.
System.out.println(s1.getXY());
System.out.println(s1.getArea());
System.out.println(s1.getCircumn());
}
}

개발은 인터페이스만 보고 한다.
DAO로 OracleDAO를 구현한 것. Oracle하고 연동하는 프로그램이 OracleDAO가 되는 것.
새로운 MariaDBDAO또한 Oracle과 연동하는 또 다른 프로그램이 되는 것.
DTO는 data transfer object : 데이터를 운반하는 역할.
DTO안에 user 관련 id pw name을 셋팅해서 oracleDAO에 운반하게 됨.
각각 따로따로 전달하는 것이 아닌, DTO 객체를 만들어서 전달함.

OracleDAO가 개발이 완료되면 App에 탑재하여 연동하는 것이라고 보면 됨.


새로운 mariaDBDAO를 구현하여 사용하겠다.

mariaDBDAO는 DAO인터페이스를 이용하여 작성을 하고, App에서는 수정하는 부분 없이 DAO dao = new mariaDBDAO만 바꿔주면 된다.
따라서 객체를 교체할 수 있도록 하는 역할.
브라우저에서 회원가입을 위해 id pw name을 친다 -> App로 전송 된다 -> database로 간다 : 회원가입을 위한 절차임.
package db;
public interface DAO {//인터페이스엔 기능 정의만 되어있고 구현은 안되어있다.
public void insert(Object obj);//뭐를 insert할거에요? 모든지 다 넣고싶다? object 사용
public void delete(Object obj);
public void update(Object obj);
}
package db;
public class OracleDAO implements DAO{
//인터페이스 DAO를 implements 받아서 database에 접근하는 프로그램인 OracleDAO를 구현
@Override
public void insert(Object obj) {
System.out.println(obj);
System.out.println("inserted oracle database");
}
@Override
public void delete(Object obj) {
System.out.println(obj);
System.out.println("deleted oracle database");
}
@Override
public void update(Object obj) {
System.out.println(obj);
System.out.println("updated oracle database");
}
}
package db;
public class MariaDBDAO implements DAO {
@Override
public void insert(Object obj) {
System.out.println(obj);
System.out.println("inserted mariadb database");
}
@Override
public void delete(Object obj) {
System.out.println(obj);
System.out.println("deleted mariadb database");
}
@Override
public void update(Object obj) {
System.out.println(obj);
System.out.println("updated mariadb database");
}
}
package db;
public class UserDTO {//데이터를 담아서 운반하는 역할!
private String id;
private String pwd;
private String name;
public UserDTO() {
}
public UserDTO(String id, String pwd, String name) {
this.id = id;
this.pwd = pwd;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "UserDTO [id=" + id + ", pwd=" + pwd + ", name=" + name + "]";
}
}
package db;
import java.util.Scanner;
public class App {
public static void main(String[] args) {
//OracleDAO가 구현이 안됐는데 APP개발은 어떻게 해?
//interface DAO를 바라보고 개발하게 됨.(기능정의가 된 것만을 바라보고 개발함)
//추상클래스 및 인터페이스는 객체생성을 할 수가 없다.
DAO dao = new OracleDAO();
Scanner sc = new Scanner(System.in);
while(true) {
System.out.println("Input Command(q, i, d, u)");
String cmd = sc.next();
if (cmd.equals("q")) {
System.out.println("bye");
break;
}else if(cmd.equals("i")) {
System.out.println("input id...");
String id = sc.next();
System.out.println("input pw...");
String pw = sc.next();
System.out.println("input name...");
String name = sc.next();
UserDTO user = new UserDTO(id, pw, name);//DTO는 내용들을 객체로 만들어서 한번에 전달함.
dao.insert(user);
}else if(cmd.equals("d")) {//primary key를 입력받아서 해당하는 사용자의 정보를 삭제시킴
System.out.println("input id...");
String id = sc.next();
dao.delete(id);
}else if(cmd.equals("u")) {//원하는 정보를 수정하려면, 원하는 정보만 전송하는 게 아니라 모든 정보를 수정요청 전송하게 됨.
System.out.println("input id...");
String id = sc.next();
System.out.println("input pw...");
String pw = sc.next();
System.out.println("input name...");
String name = sc.next();
UserDTO user = new UserDTO(id, pw, name);
dao.update(user);
}
}
sc.close();
}
}