Java /day10 / 23.09.05(화) / (핀테크) Spring 및 Ai 기반 핀테크 프로젝트 구축

허니몬·2023년 9월 5일
post-thumbnail

P08_class


ch10_quiz


Product

하나의 제품 정보를 가지는 Product class 를 정의하고, ProductManager class 에서 테스트

  • 제품 종류, 제품명, 가격, 관리번호, 전체 등록 제품수
    -> 가격 : -(minus) 값 적용 불가
    관리번호 : 변경 불가
    전체 등록 제품수 : 제품이 하나 추가될 때 마다 증가
package ch10_quiz;
public class Product {
	private static int cnt; // 등록된 제품수
	private String kind;    // 종류
	private String name;    // 제품명
	private int price;      // 가격
	private final String serial; // 관리번호
	
	public Product(String kind, String name, int price, String serial) {
		++cnt;
		this.kind = kind;
		this.name = name;
		this.price = price;
		this.serial = serial;
		System.out.println(this.name + " 등록 완료");
	}
	
	public String getKind() { return kind; }
	public void setKind(String kind) {
		this.kind = kind;
	}
	
	public String getName() { return name; }
	public void setName(String name) {
		this.name = name;
	}
	
	public int getPrice() { return price; }
	public void setPrice(int price) {
		if(price >= 0)
			this.price = price;
	}
	
	public void info() {
		System.out.println("--- 제 품   정 보 ---");
		System.out.println("종  류 : " + kind);
		System.out.println("제품명 : " + name);
		System.out.println("가  격 : " + price + " 원");
		System.out.println("S/N    : " + serial);
	}
	
	public static void currentCnt() {
		System.out.println("등록 제품수 : " + cnt);
	}
}

ProductManager

package ch10_quiz;

import java.util.Scanner;

public class ProductManager {
	public static void main(String[] args) {
		
		Product proA = new Product("유제품", "꿀단지 바나나", 2000, "0001");
		proA.info();
		
		Product proB = new Product("스낵", "감자칩", 1500, "0002");
		proB.info();
		
		Product.currentCnt();
	}
}

꿀단지 바나나 등록 완료
--- 제 품 정 보 ---
종 류 : 유제품
제품명 : 꿀단지 바나나
가 격 : 2000 원
S/N : 0001

감자칩 등록 완료
--- 제 품 정 보 ---
종 류 : 스낵
제품명 : 감자칩
가 격 : 1500 원
S/N : 0002

등록 제품수 : 2


P09_inheritance


ch01_inheritance


Point

package ch01_inheritance;

public class Point {
	private int px;
	private int py;
	
	public Point() {
		System.out.println("- Point() -");
		this.px = this.py = 0;
	}
	public Point(int px, int py) {
		System.out.println("- Point(int xp, int py) -");
		this.px = px;
		this.py = py;
	}
	public int getPx() {
		return px;
	}
	public void setPx(int px) {
		this.px = px;
	}
	public int getPy() {
		return py;
	}
	public void setPy(int py) {
		this.py = py;
	}
	
	public void twoPoint() {
		System.out.println("좌표 X : " + px + " - Y : " + py);
	}
}

PointTriple extends Point

상속 ( inheritance )

  • 기존 class 의 내용을 그대로 가져와서 새로운 class 를 정의하는 것
  • 상속을 하더라도 접근제한자는 유지 됨
  • 자식클래스 객체를 생성할 때,
    자식클래스 생성자에서 super() 를 사용하여 부모클래스의 생성자를 먼저 실행,
    자식클래스의 생성자를 진행

상속 방법

  • class 자식클래스명 extands 부모클래스명 {

    }

package ch01_inheritance;
public class PointTriple extends Point{
	private int pz;
	public PointTriple() {
		super(); // 부모클래스 생성자 호출 // 자동생성
		System.out.println("- PointTriple() -");
	}
	public PointTriple(int px, int py, int pz) {
		super(px,py);
		System.out.println("- PointTriple(int px, int py, int pz) -");
		this.pz = pz;
	}
	// 부모클래스에서 private를 사용했기 때문에 사용하려면 getter로 불러와야함
	public void threePoint() {
		System.out.println("좌표 X : " + getPx() + " - Y : " + getPy() + " - Z : " + pz);
	}
	
}

PointTest

package ch01_inheritance;
public class PointTest {
	public static void main(String[] args) {
		Point pointA = new Point(10,20);
		pointA.twoPoint();
		
		PointTriple ptA = new PointTriple();
		// 상속받은 부모클래스 생성자 먼저 진행 후 자식클래스 생성자 진행
		// super();
		
		ptA.threePoint();
		
		PointTriple ptB = new PointTriple(11, 22, 33);
	}
}

- Point(int xp, int py) -
좌표 X : 10 - Y : 20

- Point() -
- PointTriple() -
좌표 X : 0 - Y : 0 - Z : 0

- Point(int xp, int py) -
- PointTriple(int px, int py, int pz) -
좌표 X : 11 - Y : 22 - Z : 33


Article

package ch01_inheritance;

public class Article {
	
	private int no;			// 번호
	private String title;	// 제목
	
	public Article() {}
	
	public Article(int no, String title) {
		super();
		this.no = no;
		this.title = title;
	}
	
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
}

ArticleQA extends Article

package ch01_inheritance;

public class ArticleQA extends Article{
	private String answer ;

	public String getAnswer() {
		return answer;
	}

	public void setAnswer(String answer) {
		this.answer = answer;
	}
	
	public void result() {
		System.out.println("질문/답변 [ 번호 : " + getNo()
						+ " - 질문 : " + getTitle()
						+ " - 답변 : " + answer+ " ]");
	}
}

ArticleFile extends Article

package ch01_inheritance;

public class ArticleFile extends Article{
	private String fileName; // 파일명

	public ArticleFile() {}
	public ArticleFile(int no, String title, String fileName) {
		super(no, title);
		this.fileName = fileName;
	}
	public String getFileName() {
		return fileName;
	}
	public void setFileName(String fileName) {
		this.fileName = fileName;
	}
	
	public void fileInfo() {
		System.out.println("자료실 [ No." + getNo()
						+ " - 제목 : " + getTitle()
						+ " - 파일명 : " + fileName + " ]");
	}
}

ArticleTest

package ch01_inheritance;
public class ArticleTest {
	public static void main(String[] args) {
		
		ArticleQA qa1 = new ArticleQA();
		qa1.setNo(1);
		qa1.setTitle("첫번째 질문 ?");
		qa1.setAnswer("답변입니다...");
		qa1.result();
		
		ArticleFile af = new ArticleFile(1, "상속 연습", "상속.pdf");
		af.fileInfo();
	}
}

질문/답변 [ 번호 : 1 - 질문 : 첫번째 질문 ? - 답변 : 답변입니다... ]

자료실 [ No.1 - 제목 : 상속 연습 - 파일명 : 상속.pdf ]


ch02_quiz


Product

Product class 를 정의

  • 제품명, 가격의 관리가 가능합니다
package ch02_quiz;

public class Product {
	private String name;
	private int price;
	public Product() {}
	public Product(String name, int price) {
		this.name = name;
		this.price = price;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	
	public void productInfo() {
		System.out.println("--- Product  정보 ---");
		System.out.println("제품명   :" + name);
		System.out.println("가격     :" + price);
	}
}

SmartPhone extends Product

SmartPhone class 를 정의하고, PhoneTest class 에서 테스트

  • Product class 를 상속받고, 전화번호, 통신사의 관리가 가능합니다
package ch02_quiz;

public class SmartPhone extends Product{
	private String pn;
	private String telecom;
	
	public SmartPhone() {}
	
	public SmartPhone(String name, int price, String pn, String telecom) {
		super(name, price);
		this.pn = pn;
		this.telecom = telecom;
	}
	public String getPn() {
		return pn;
	}
	public void setPn(String pn) {
		this.pn = pn;
	}
	public String getTelecom() {
		return telecom;
	}
	public void setTelecom(String agency) {
		this.telecom = agency;
	}
	
	public void phoneInfo() {
		System.out.println("--- SmartPhone  정보 ---");
		super.productInfo(); // 부모의 메서드를 사용하는 것을 알리기 위해 super.
		System.out.println("전화번호 :" + pn);
		System.out.println("통신사   :" + telecom);
	}
	
}

PhoneTest

package ch02_quiz;

public class PhoneTest {
	public static void main(String[] args) {
		SmartPhone sp1 = new SmartPhone("iPhone_Xs", 123123, "010-1234-5678", "LG_u+");
		sp1.phoneInfo();
        
		sp1.setPrice(123);
		sp1.setPn("010-4567-8910");
		sp1.setTelecom("SKT");
		sp1.phoneInfo();
		
		SmartPhone sp2 = new SmartPhone();
		sp2.phoneInfo();

		sp2.setName("asdasd");
		sp2.setPrice(333312);
		sp2.setPn("010-1111-2124");
		sp2.setTelecom("KT");
		sp2.phoneInfo();
	}
}

--- SmartPhone 정보 ---
--- Product 정보 ---
제품명 :iPhone_Xs
가격 :123123
전화번호 :010-1234-5678
통신사 :LG_u+

--- SmartPhone 정보 ---
--- Product 정보 ---
제품명 :iPhone_Xs
가격 :123
전화번호 :010-4567-8910
통신사 :SKT

--- SmartPhone 정보 ---
--- Product 정보 ---
제품명 :null
가격 :0
전화번호 :null
통신사 :null

--- SmartPhone 정보 ---
--- Product 정보 ---
제품명 :asdasd
가격 :333312
전화번호 :010-1111-2124
통신사 :KT


ch02_quiz2


Person

Person class 를 정의

  • 이름, 나이의 관리가 가능
package ch02_quiz2;

public class Person {
	private String name;
	private int age;
	
	public Person() {}
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	public void personInfo() {
		System.out.println("--- 사람 정보 ---");
		System.out.println("이름   : " + name);
		System.out.println("나이   : " + age);
	}
}

Celebrity extends Person

Celebrity class 를 정의하고, PersonTest class 에서 테스트

  • Person class 를 상속받고, 소속사의 관리가 가능
package ch02_quiz2;

public class Celebrity extends Person{
	private String agency;

	public Celebrity() {}
	public Celebrity(String name, int age, String agency) {
		super(name, age);
		this.agency = agency;
	}

	public String getAgency() {
		return agency;
	}

	public void setAgency(String agency) {
		this.agency = agency;
	}

	public void celeInfo() {
		System.out.println("- 연예인 정보 -");
		super.personInfo();
		System.out.println("소속사 : " + agency);
	}
}

Police extends Person

Police class 를 정의하고, PersonTest class 에서 테스트

  • Person class 를 상속받고, 계급의 관리가 가능
package ch02_quiz2;


public class Police extends Person{
	private String classes;
	public Police() {}
	public Police(String name, int age, String classes) {
		super(name, age);
		this.classes = classes;
	}

	public String getClasses() {
		return classes;
	}

	public void setClasses(String classes) {
		this.classes = classes;
	}
	
	public void polInfo() {
		System.out.println("--- 경찰 정보 ---");
		super.personInfo();
		System.out.println("계급   : " + classes);
	}
	
}

PersonTest

package ch02_quiz2;

public class PersonTest {
	public static void main(String[] args) {
		Person p1 = new Person();
		p1.personInfo();
		System.out.println("- 값 set -");
		p1.setName("김사람");
		p1.setAge(22);
		p1.personInfo();
		
		Person p2 = new Person("이사람", 33);
		p2.personInfo();
		
		Celebrity c1 = new Celebrity();
		c1.celeInfo();
		System.out.println("- 값 set -");
		c1.setName("박유명");
		c1.setAge(44);
		c1.setAgency("YG");
		c1.celeInfo();
		
		Celebrity c2 = new Celebrity("저유명", 45,"HIVE");
		c2.celeInfo();
		
		Police pl1 = new Police();
		pl1.polInfo();
		System.out.println("- 값 set -");
		pl1.setName("김경찰");
		pl1.setAge(32);
		pl1.setClasses("경위");
		pl1.polInfo();
		
		Police pl2 = new Police("이경찰", 34,"경장");
		pl2.polInfo();
	}
}

--- 사람 정보 ---
이름 : null
나이 : 0
- 값 set -
--- 사람 정보 ---
이름 : 김사람
나이 : 22

--- 사람 정보 ---
이름 : 이사람
나이 : 33

- 연예인 정보 -
--- 사람 정보 ---
이름 : null
나이 : 0
소속사 : null
- 값 set -
- 연예인 정보 -
--- 사람 정보 ---
이름 : 박유명
나이 : 44
소속사 : YG

- 연예인 정보 -
--- 사람 정보 ---
이름 : 저유명
나이 : 45
소속사 : HIVE

--- 경찰 정보 ---
--- 사람 정보 ---
이름 : null
나이 : 0
계급 : null
- 값 set -
--- 경찰 정보 ---
--- 사람 정보 ---
이름 : 김경찰
나이 : 32
계급 : 경위

--- 경찰 정보 ---
--- 사람 정보 ---
이름 : 이경찰
나이 : 34
계급 : 경장


ch03_override


오버라이드 ( override )

  • 상속받은 자식클래스에서 부모클래스의 메소드를 재정의 하는 것
  • 메소드의 형태는 부모클래스의 메소드와 동일해야 함
  • 접근제한자의 범위는 동일하거나 넓어져야 함
  • public는 가장 넓은 범위이므로 부모에서 썼다면 자식도 반드시 써야함
  • final 선언된 메소드는 오버라이드 불가

Point

package ch03_override;

public class Point {
	private int px;
	private int py;
	
	public Point() {
		System.out.println("- Point() -");
		this.px = this.py;
	}
	public Point(int px, int py) {
		System.out.println("- Point(int xp, int py) -");
		this.px = px;
		this.py = py;
	}
	public int getPx() {
		return px;
	}
	public void setPx(int px) {
		this.px = px;
	}
	public int getPy() {
		return py;
	}
	public void setPy(int py) {
		this.py = py;
	}
	
	public void twoPoint() {
		System.out.println("좌표 X : " + px + " - Y : " + py);
	}
	
	public void info() {
		System.out.println("좌표 X : " + px + " - Y : " + py);
	}
}

PointTriple extends Point

package ch03_override;
public class PointTriple extends Point{
	private int pz;

	public PointTriple() {
		super();
		System.out.println("- PointTriple() -");
	}
	public PointTriple(int px, int py, int pz) {
		super(px,py);
		System.out.println("- PointTriple(int px, int py, int pz) -");
		this.pz = pz;
	}
	public void threePoint() {
		System.out.println("좌표 X : " + getPx() + " - Y : " + getPy() + " - Z : " + pz);
	}
	// 상속받은 부모의 메소드를 재정의 하여 기능을 다르게 쓸 수 있음
	@Override
	public void info() {
		System.out.println("좌표 X : " + getPx() + " - Y : " + getPy() + " - Z : " + pz);
	}
	
}

PointTest

package ch03_override;

public class PointTest {
	public static void main(String[] args) {
		Point pointA = new Point(10,20);
		pointA.twoPoint();
		
		System.out.println();
		PointTriple ptA = new PointTriple();
		
		ptA.threePoint();
		System.out.println();
		
		PointTriple ptB = new PointTriple(11, 22, 33);
		ptB.threePoint();
		ptB.info(); //@override
		
	}
}

- Point(int xp, int py) -
좌표 X : 10 - Y : 20

- Point() -
- PointTriple() -
좌표 X : 0 - Y : 0 - Z : 0

- Point(int xp, int py) -
- PointTriple(int px, int py, int pz) -
좌표 X : 11 - Y : 22 - Z : 33
좌표 X : 11 - Y : 22 - Z : 33


ch04_casting


Base

package ch04_casting;

public class Base {
	private String item;

	public Base() {
		item = "기본 무기";
	}
	
	public void baseAttack() {
		System.out.println(item + " 사용");
	}
}


UnitA extends Base

package ch04_casting;

public class UnitA extends Base{
	private String unitItem;

	public UnitA() {
		unitItem = "방어막";
	}

	public void unitAttack() {
		System.out.println(unitItem + " 사용");
	}
	
}

UnitB extends Base

package ch04_casting;

public class UnitB extends Base{

}

CastingTest

instanceof 연산자

  • 참조 변수가 현재 사용중인 객체 타입을 확인할 때 사용
    타입이 같으면 true, 다르면 false
package ch04_casting;
public class CastingTest {
	public static void main(String[] args) {
		
		UnitA userA = new UnitA();
		userA.baseAttack();
		userA.unitAttack();

		// UpCasting : 자동
		Base base = userA;
		base.baseAttack();
//		base.unitAttack(); 
		// -> Error -> 업캐스팅 했기 때문에 UnitA에 있는 unitAttack 는 
		//         타입에 맞지 않아 사용 못 함
		
		
		// DownCasting : 변환 타입 지정
		// 다운캐스팅 할 때 확인해야 하는 이유
		// -> 다른 자식클래스도 부모클래스를 상속 받았을 수 있기 때문 
		if(base instanceof UnitA) { 
			userA = (UnitA)base;
			userA.baseAttack();
			userA.unitAttack();
		}
        
		// 코드작성할 때는 써짐, 하지만 실행해보면 Error
//		UnitB userB = (UnitB)base; // Error
		if(base instanceof UnitB) {
			
		}else {
			System.out.println("UnitB 타입이 아님");
		}
	
	}
}

ch05_abstract


추상 클래스

  • 상속받을 class 에서 구현 할 특성을 정의한 class
  • 객체를 생성할 수 없음

추상 메소드

  • 추상클래스 안에서 기능을 정의하지 않은 메소드
  • 상속받는 자식클래스에서 반드시 재정의(Override)
  • 기능구현은 상속받은 자식 클래스에서 override 해서 사용
  • 기본적으로 상속을 위해 사용됨
  • 자식클래스에서 override 가 강제성을 띔

abstract class Calc

package ch05_abstract;

public abstract class Calc {
	protected int dataA;
	protected int dataB;
	public abstract void showData();
	public void typeInfo() {
		System.out.println("- Calc class -");
	}
}
class Add extends Calc{
	// protected 이기 때문에 상속받은 Add class 에서 바로 사용 가능
	public Add(int a, int b) {
		dataA = a;
		dataB = b;
	}
	// 상속받은 Calc 클래스의 추상메소드를 override 하지 않으면 Error
	@Override
	public void showData() {
		System.out.println(dataA + " + " + dataB + " = " + (dataA + dataB));
	}
}
class Sub extends Calc{
	public Sub(int a, int b) {
		dataA = a;
		dataB = b;
	}
	@Override
	public void showData() {
		System.out.println(dataA + " - " + dataB + " = " + (dataA - dataB));
	}
}

CalcMain

package ch05_abstract;

import java.util.Scanner;

public class CalcMain {
	public static void main(String[] args) {
		Add add = new Add(11, 22);
		add.showData();

		Sub sub = new Sub(33, 44);
		sub.showData();

		// Error
		// -> class의 형태가 완벽하게 잡히지 않았기 때문에 객체 생성 자체가 불가
//		Calc calc = new Calc();
		// 정적 binding
		Calc calc = null; // -> 참조변수는 생성 가능
		calc = add; // 업캐스팅
		// 메소드를 override를 했다면 override 한 메소드 사용 가능
		calc.showData();

		calc = sub; // 업캐스팅
		calc.showData();
        
		// 부모의 객체하나로 자식클래스의 메서드를 모두 사용할 수 있게 됨
		// -> 다형성

		Calc run = null;
		int a = 123;
		int b = 45;
		Scanner sc = new Scanner(System.in);
		System.out.print("+ / - 입력 >> ");
		char opt = sc.next().charAt(0);

		switch (opt) {
		case '+':
			// 굳이 만들 필요가 없음
			// -> 위에서 run을 만들었기 때문에 바로 사용 가능
//			Add tmp = new Add(a,b);
//			run = tmp;
			// binding
			// 동적 : 실행중에 생성하여 결정 / 정적 : 사용할 객체가 미리 정의
			// 아래는 동적 binding
			run = new Add(a, b);
			break;
		case '-':
			run = new Sub(a, b);
			break;
		}
		if (run != null) {
			run.showData();
		}
	}
}

ch06_quiz


Military

Military class 를 상속받는 Army, Navy, AirForce class 를 정의

  • MilitaryTest class 에서 Militaty class 변수를 사용해서 다형성으로 구현한 코드를 작성
package ch06_quiz;
public abstract class Military {
	private String name; // 군대 이름(육군, 해군, 공군)

	public Military(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
		
	public abstract void attack(); // 공격
	public abstract void move(); // 공격
}

Army extends Military

package ch06_quiz;

public class Army extends Military{
	public Army(String name) {
		super(name);
	}

	@Override
	public void attack() {
		System.out.println(getName() + " 공격");
	}

	@Override
	public void move() {
		System.out.println(getName() + " 이동");
	}
}

package ch06_quiz;

public class Navy extends Military{
	public Navy(String name) {
		super(name);
	}
	
	@Override
	public void attack() {
		System.out.println(getName() + " 공격");
	}

	@Override
	public void move() {
		System.out.println(getName() + " 이동");
	}
}

AirForce extends Military

package ch06_quiz;

public class AirForce extends Military{
	public AirForce(String name) {
		super(name);
	}
	
	@Override
	public void attack() {
		System.out.println(getName() + " 공격");
	}

	@Override
	public void move() {
		System.out.println(getName() + " 이동");
	}
}

MilitaryTest

package ch06_quiz;

import java.util.Scanner;

public class MilitaryTest {
	public static void main(String[] args) {
		Military mi = null;
		Scanner sc = new Scanner(System.in);
		System.out.print("1. 육군, 2. 해군, 3. 공군 선택 >> ");
		int select = sc.nextInt();
		switch (select) {
		case 1:
			mi = new Army("육군");
			break;
		case 2:
			mi = new Navy("해군");
			break;
		case 3:
			mi = new AirForce("공군");
			break;
		default:
			System.out.println("입력 오류");
		}
		if (mi != null) {
			mi.move();
			mi.attack();
		}
	}
}
  1. 육군, 2. 해군, 3. 공군 선택 >> 1
    육군 이동
    육군 공격

  2. 육군, 2. 해군, 3. 공군 선택 >> 2
    해군 이동
    해군 공격

  3. 육군, 2. 해군, 3. 공군 선택 >> 3
    공군 이동
    공군 공격

profile
Fintech

0개의 댓글