package overloading;
public class Calculator {
public int sum(int a, int b) {
int result = 0;
result = a + b;
return result;
}
public int sum(int a, int b, int c) {
int result = 0;
result = a + b + c;
return result;
}
public int sum(int a, int b, int c, int d) {
int result = 0;
result = a + b + c + d;
return result;
}
}
package overloading;
public class App {
public static void main(String[] args) {
Calculator c = new Calculator();
System.out.println(c.sum(10, 20));// 오버로딩. 메소드는 동일한데 아규먼트가 다름.
//리턴이 다른것에 대해서는 신경 안씀(double, int 노상관), 함수가 어떻건 상관 없음.
System.out.println(c.sum(10, 20, 30));
System.out.println(c.sum(10, 20, 30, 40));
}
}
package cthis;
import java.util.Calendar;
public class Employee {
private String id;
private String name;
private int salary;
//getter setter
public Employee() {
Calendar cal = Calendar.getInstance();
this.id = ""+ cal.get(Calendar.YEAR) + cal.get(Calendar.MILLISECOND);
//cal.get이 Int라서 +""하여 str로 변경
}
public Employee(String name, int salary) {
this();
this.name = name;
this.salary = salary;
}
public Employee(String id, String name, int salary) {
this.id = id;
this.name = name;
this.salary = salary;
}
public double getTax() {
double result = 0.0;
result = this.salary * 0.17;//this. 는 현재 객체. 이 클래스로 인해서 만들어진 객체.
return result;
}
public int getAnnSalary() {
int result = 0;
result = this.salary * 12;
return result;
}
public double getAnnTax() {
double result = 0;
result = this.getAnnSalary() * 0.17;
return result;
}
@Override
public String toString() {
return "Employee [id=" + id + ", name=" + name + ", salary=" + salary + "]";
}
}
package cthis;
public class App {
public static void main(String[] args) {
Employee e = new Employee("이종석", 500);
System.out.println(e);
Employee e2 = new Employee("이종석2", 600);
System.out.println(e2);
}
}
Date d = new Date();
java.sql.Date dd = new java.sql.Date(0);
//이름이 같은 패키지는 import를 못함. 또 쓰고 싶다면 패키지 이름을 전부 쓴다.
public : 모두 접근 가능.
protected(특정상황에서만 접근제어) : default + 상속이 되었을 때
default : 동일 패키지(같은 디렉토리)에서만 접근 가능.
private : 아무도 접근 못함. 동일 클래스에서 사용 가능.
접근을 제한하는 이유는 안 보여주겠다는 이유보다는, 다른 팀에서 다른 패키지에서 접근을 했을 때 문제가 생기는 걸 막겠다는 안정화의 목적.



마름모는 protected, 삼각형은 default, private은 안보임.

다른 패키지에서 봤을 때, 안 보임. (혹시라도 잘못 선택할까봐 원천적으로 막는 것)
package bank;
public class Account {
private String accNum;
private String accName;
private double balance;
public Account() {// 여기다 계좌번호 만드는 로직을 작성하면 길어진다. 따라서 따로 class를 만들어서 쓰자.
// MakeAccountNumber makenum = new MakeAccountNumber();
this.accNum = MakeAccountNumber.makeAccNum();// static class의 경우 인스턴스 생성 없이 함수를 사용 가능!
}
public Account(String accName, double balance) {
this();
this.accName = accName;
this.balance = balance;
}
public Account(String accNum, String accName, double balance) {
this.accNum = accNum;
this.accName = accName;
this.balance = balance;
}
@Override
public String toString() {
return "Account [accNum=" + accNum + ", accName=" + accName + ", balance=" + balance + "]";
}
public double getBalance() {
return balance;
}
public void withdraw(double money) {
if (money <= 0) {
System.out.println("출금금액을 확인하세요.");
return;
}
if (money > balance) {
System.out.println("잔액을 확인하세요.");
return;
}
this.balance -= money;
System.out.printf("잔액은 %4.1f 입니다.\n", balance);
}
public void deposit(double money) {
if (money <= 0) {
System.out.println("입금금액을 확인하세요");
return;
}
this.balance += money;
System.out.printf("잔액은 %4.1f 입니다.\n", balance);
}
}
package bank;
import java.util.Calendar;
public class MakeAccountNumber {
public static String makeAccNum() {//static : 이러한 함수의 기능만 사용할거야! 그럼 객체 생성 없이 사용 가능!
String accNum = "";
Calendar cal = Calendar.getInstance();
accNum = ""+ cal.get(Calendar.YEAR)
+ (cal.get(Calendar.MONTH) + 1)
+ cal.get(Calendar.DAY_OF_MONTH)
+ cal.get(Calendar.MILLISECOND);
return accNum;
}
}
package bank;
public class App {
public static void main(String[] args) {
Account acc = new Account("이말숙", 10000);
System.out.println(acc);
acc.withdraw(10000);
acc.deposit(30000);
acc.withdraw(20000);
System.out.println(acc);
}
}
package bank;
import java.util.Scanner;
public class App2 {
public static void main(String[] args) {
Account acc = null;
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("Input command(c, w, d, s, q)...");
String cmd = sc.next();
if (cmd.equals("q")) {
System.out.println("Bye...");
break;
} else if (cmd.equals("c")) {
System.out.println("create account");
System.out.println("Input Account Info[name, balance]");
System.out.println("Input Name");
String name = sc.next();
System.out.println("Input Balance");
double balance = Double.parseDouble(sc.next());// 얘도 static으로 만들어진 함수구나...
acc = new Account(name, balance);// acc는 if문 내에서만 사용할 수 있다. 따라서 while문 밖에서 선언해줘야함
System.out.println(acc);
} else if (cmd.equals("w")) {
System.out.println("Withdraw");
System.out.println("Input Withdraw money");
double money = Double.parseDouble(sc.next());
acc.withdraw(money);
} else if (cmd.equals("d")) {
System.out.println("Deposit");
System.out.println("Input Deposit money");
double money = Double.parseDouble(sc.next());
acc.deposit(money);
} else if (cmd.equals("s")) {
System.out.println("Search");
System.out.println(acc);
}
}
sc.close();
}
}
객체간의 관계
집합관계 읽어볼 글 : https://ocwokocw.tistory.com/14
package aggregation;
public class Human {
private String name;
private Car car;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
public Human() {
}
public Human(String name) {
this.name = name;
}
public Human(String name, Car car) {
this.name = name;
this.car = car;
}
@Override
public String toString() {
return "Human [name=" + name + ", car=" + car + "]";
}
public void drive() {//사람에게 요청을 하면 자동차의 메소드를 실행시키는 함수를 만듬.
car.go();
}
public void stopCar() {
car.stop();
}
}
package aggregation;
public class Car {
public String name;
public String color;
public int size;
public Car() {
this.name = "k1";
this.color = "red";
this.size = 1000;
}
public Car(String name, String color, int size) {
this.name = name;
this.color = color;
this.size = size;
}
@Override
public String toString() {
return "Car [name=" + name + ", color=" + color + ", size=" + size + "]";
}
public void go() {
System.out.printf("%s, %s go car...", this.name, this.color);
}
public void stop() {
System.out.println(this.name + "stop car...");
}
}
package aggregation;
public class App {
public static void main(String[] args) {
Human human = new Human("james");
System.out.println(human);
Car car = new Car("k1", "red", 1000);
human.setCar(car);
System.out.println(human);
human.drive();
human.stopCar();
}
}
사람, 차를 class로 만들었는데 사람은 차를 소유할 수 있음. aggregation의 관계임.
또한 human class 내부에서 함수를 만들었을 때 car class내의 메소드를 실행하는 함수를 넣어서 구동시킴.


app은 웹.
service는 기능.(게시판 기능 등)
dao는 데이터 엑세스 오브젝트. 데이터베이스에 연동되어지는 로직.
app는 service클래스를 사용하고 service는 dao클래스를 사용하고 dao클래스는 database에 실직적으로 접근한다.
개발을 할 때도 app팀 service팀이 각각 작업을 하고 service팀이 개발이 늦어져도 각각 작업을 완수할 수 있게 하여 개발 퍼포먼스를 향상시킨다.
기능을 업데이트해야할 때, 화면은 안건들이고 service부분만 떼서 수정하면 된다.
package board;
public class Service {
DAO dao;
public Service() {
dao = new DAO();//객체를 만들어야 사용을 시작할 수 있음.
}
public void register(String str) {
//security or log
dao.insert(str);//service는 dao에게 정보를 입력하라고 전달을 함.
}
public void remove(int num) {
dao.delete(num);
}
public void modify(int num, String str) {
dao.update(num, str);
}
public String get(int num) {
return dao.select(num);
}
}
package board;
public class DAO {
public void insert(String str) {
System.out.println("Inserted Oracle Database Row:" + str);
}
public void update(int num, String str) {//해당 글번호를 입력하고 내용을 이렇게 업데이트 할게요
System.out.println("Updated Oracle Database Row:" + num + " " + str);
}
public void delete(int num) {
System.out.println("Deleted Oracle Database Row:" + num);
}
public String select(int num) {//해당번호를 누르면 해당 글을 리턴하겠습니다.
return "HI. database";
}
}
package board;
import java.util.Scanner;
public class App {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Service service = new Service();
while (true) {
System.out.println("Input cmd(r,u,d,g,q)");
String cmd = sc.next();
if (cmd.equals("q")) {
System.out.println("bye.");
break;
} else if (cmd.equals("r")) {
System.out.println("Input contents");
String content = sc.next();
service.register(content);
} else if (cmd.equals("g")) {
System.out.println("Input num");
int num = Integer.parseInt(sc.next());
String result = service.get(num);
System.out.println(result);
}else if (cmd.equals("u")) {
System.out.println("Input num");
int num = Integer.parseInt(sc.next());
System.out.println("Input content");
String content = sc.next();
service.modify(num, content);
}else if (cmd.equals("d")) {
System.out.println("Input num");
int num = Integer.parseInt(sc.next());
service.remove(num);
}
}
sc.close();
}
}