Java /day11 / 23.09.06(수) / (핀테크) Spring 및 Ai 기반 핀테크 프로젝트 구축

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

P09_inheritance


ch07_interface


interface Tools

interface

  • 100% 순수한 추상클래스
  • class 대신 interface 를 사용해서 정의
package ch07_interface;

public interface Tools {
	// interface 안의 모든 멤버필드는 자동으로 public static final 
	int A = 1; 
	public static final int B = 2;
    
	// interface는 생성자를 만들 수 없음
	// 즉, 위와 같이 멤버변수를 선언과 동시에 초기화를 해야 함
//	public Toosl() {} // Error
	
	// interface 에서 만드는 메소드는 추상메소드만 가능 
	// abstract를 쓰지 않아도 자동으로 public abstract
	public abstract void abstractMethod();
	
	// 아래와 같이 static, default는 가능
	public static void staMethod() {
		System.out.println("- static method() -");
	}
	public default void defMethod() {
		System.out.println("- default method() -");
	}
	
}

class ToolsImpl implements Tools

package ch07_interface;

public class ToolsImpl implements Tools{
	@Override
	public void abstractMethod() {
	}
}

class InheritanceWay

package ch07_interface;

class TestA {}

interface InterA {}

class TestB extends TestA {}

class TestZ extends TestB {}

class TestC implements InterA {}

class TestD {}

//class TestE extends TestA, TestD{} // Error 자바는 class의 다중상속 불가

class TestE extends TestA implements InterA {}

//interface가 interface를 상속 받을 때는 extends 써야함!
interface InterB extends InterA {} 

interface InterC {}
// interface는 한 번에 여러개를 구현 가능
class TestF implements InterA, InterB, InterC {}

public class InheritanceWay {
	
}

ch08_interface


interface Power

package ch08_interface;
public interface Power {
	public void on();
	public void off();
}

interface Volume

package ch08_interface;
public interface Volume {
	public void up();
	public void down();
}

class Player implements Power, Volume

package ch08_interface;

public class Player implements Power, Volume{
	public void on() {
		System.out.println("- 전원 ON -");
	}
	public void off() {
		System.out.println("- 전원 OFF -");
	}
	public void up() {
		System.out.println("- 소리를 높여요 -");
	}
	public void down() {
		System.out.println("- 소리를 낮춰요 -");
	}
}

ch09_quiz


Shape

Shape interface 를 상속받은 Rectangle(사각형), Circle(원) class 를 정의하고,
ShapeTest class 에서 Shape 변수를 사용해서 다형성을 구현한 코드를 작성하세요

package ch09_quiz;
public interface Shape {
	public double area(); // 도형 넓이 계산
	public void drawing(); // 도형 그리기
}

class Rectangle implements Shape

package ch09_quiz;
public class Rectangle implements Shape{
	private double width;
	private double height;
	public Rectangle(double width, double height) {
		this.width = width;
		this.height = height;
	}
	public double area() {
		return this.width * this.height;
	}
	public void drawing() {
		System.out.println("-- Shape --");
		System.out.println("ㅁㅁㅁㅁㅁ");
		System.out.println("ㅁ      ㅁ");
		System.out.println("ㅁ      ㅁ");
		System.out.println("ㅁ      ㅁ");
		System.out.println("ㅁㅁㅁㅁㅁ");
	}
}

class Circle implements Shape

package ch09_quiz;
public class Circle implements Shape{
	private double radius;
	private final double PI = 3.141592;
	public Circle(double radius) {
		this.radius = radius;
	}
	public double area() {
		return radius*radius*PI;
	}
	public void drawing() {
		System.out.println("---- Shape ----");
		System.out.println("    ㅁㅁㅁ    ");
		System.out.println("  ㅁ      ㅁ  ");
		System.out.println("ㅁ          ㅁ");
		System.out.println("ㅁ    😀    ㅁ");
		System.out.println("ㅁ          ㅁ");
		System.out.println("  ㅁ      ㅁ  ");
		System.out.println("    ㅁㅁㅁ    ");
	}
}

class ShapeTest

package ch09_quiz;
import java.util.Scanner;
public class ShapeTest {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("1. 사각형   2. 원    선택 >> ");
		int select = sc.nextInt();
		Shape s = null;
		switch (select) {
		case 1:
			System.out.println("--- 사각형 ---");
			System.out.print("사각형의 가로, 세로 입력 >> ");
			double w = sc.nextDouble();
			double l = sc.nextDouble();
			s = new Rectangle(w, l);
			break;
		case 2:
			System.out.println("--- 원 ---");
			System.out.print("원의 반지름 입력 >> ");
			double r = sc.nextDouble();
			s = new Circle(r);
			break;
		default:
			System.out.println("도형 선택 오류~");
		}
		if (s != null) {
			s.drawing();
			System.out.println("넓이 " + s.area());
		}
	}
}


ch10_interface


interface Print

package ch10_interface;
public interface Print {
	int START = 1;
	int CANCEL = 2;
	public void printStart();
	public void printCancel();
}

class Printer implements Print

package ch10_interface;
public class Printer implements Print{
	public void printStart() {
		System.out.println("- 프린터 출력 시작 -");
	}
	public void printCancel() {
		System.out.println("- 프린터 출력 취소 -");
	}
}

class Scan implements Print

package ch10_interface;

public class Scan implements Print {
	public void printStart() {
		System.out.println("- 스캔 시작 -");
	}
	
	public void printCancel() {
		System.out.println("- 스캔 취소 -");
	}
}

class PrintMachine

package ch10_interface;
import java.util.Scanner;
public class PrintMachine {
	private Print current; 	// 현재 사용중인 장치
	private int device; 	// 1. 프린터  2. 스캐너
	private Printer printer;
	private Scan scan;
	private Scanner scanner;
	public PrintMachine() {
		printer = new Printer();
		scan = new Scan();
		device = 1;
		current = printer;
		scanner = new Scanner(System.in);
	}
	// 메뉴
	public boolean modeSelect() {
		System.out.print("1. 장치 선택  2. 인쇄/취소 >> ");
		int mode = scanner.nextInt();
		switch(mode) {
		case 1: // 장치 선택
			selectDevice();
			break;
		case 2: // 인쇄, 취소
			printRun();
			break;
		case 0:
			return false;
		}
		System.out.println();
		return true;
	}
	// 장치 선택 메소드
	public void selectDevice() {
		System.out.print("1. 프린터   2. 스캐너");
		device = scanner.nextInt();
		
		if(device ==1) current = printer;
		else if(device ==2) current = scan;
	}
	// 인쇄, 취소 메소드
	public void printRun() {
		System.out.print("1. 시작  2. 취소 >> ");
		int select = scanner.nextInt();
		
		switch(select) {
		case Print.START:
			current.printStart();
			break;
		case Print.CANCEL:
			current.printCancel();
		}
	}
}

class PrintMain

package ch10_interface;
public class PrintMain {
	public static void main(String[] args) {
		PrintMachine pm = new PrintMachine();
		
		boolean run = true;
		while(run) {
			run = pm.modeSelect(); // while 진행여부 선택
			System.out.println();
		}
		System.out.println("- Power OFF -");
	}
}
  1. 장치 선택 2. 인쇄/취소 >> 1
  2. 프린터 2. 스캐너1
  1. 장치 선택 2. 인쇄/취소 >> 2
  2. 시작 2. 취소 >> 1
    - 프린터 출력 시작 -
  1. 장치 선택 2. 인쇄/취소 >> 2
  2. 시작 2. 취소 >> 2
    - 프린터 출력 취소 -
  1. 장치 선택 2. 인쇄/취소 >> 1
  2. 프린터 2. 스캐너2
  1. 장치 선택 2. 인쇄/취소 >> 2
  2. 시작 2. 취소 >> 1
    - 스캔 시작 -
  1. 장치 선택 2. 인쇄/취소 >> 2
  2. 시작 2. 취소 >> 2
    - 스캔 취소 -
  1. 장치 선택 2. 인쇄/취소 >> 0

- Power OFF -


P10_nestedClass


Ex01General

일반 중첩 클래스

class OuterG {
	public static int a;
	private int b;
	static {
		a = 1;
	}

	public OuterG() {
		b = 2;
	}

	public void outerGinfo() {
		System.out.println("- outerGinfo() -");
		System.out.println("a : " + a);
		System.out.println("b : " + b);
	}

	// 중첩클래스 : 클래스 안에 클래스
	// 자주쓰는 클래스다 > 클래스 안에 집어넣어 버림
	class InnerG {
//		public static int c; // Error
		private int d;

		public InnerG() {
			d = 4;
		}

		public void innerGinfo() {
			System.out.println("- innerGinfo() -");
			System.out.println("a : " + a);
			System.out.println("b : " + b);
			System.out.println("d : " + d);
		}
	}
}

public class Ex01General {
	public static void main(String[] args) {
		OuterG outer = new OuterG();
		outer.outerGinfo();

		System.out.println();

		// 바로 못 만듬
		// inner class를 만드려면 outer class 객체를 통해 만들어야 한다
		// 그렇기 때문에 내부클레스에 static 멤버를 생성할 수 없음
		// inner class 내에 멤버를 생성할 때는 outer class 의 객체를 통해 만들어야 함
		// static 멤버는 외부클래스를 거치지 않기 때문에 inner class 에선 사용 불가
//		InnerG inner = new InnerG(); // Error
		OuterG.InnerG oi = outer.new InnerG();
		oi.innerGinfo();
	}
}

- outerGinfo() -
a : 1
b : 2

- innerGinfo() -
a : 1
b : 2
d : 4


Ex02Static

정적 중첩 클래스

class OuterS{
	public static int a;
	private int b;
	static {
		a = 1;
	}

	public OuterS() {
		b = 2;
	}

	public void outerGinfo() {
		System.out.println("- outerGinfo() -");
		System.out.println("a : " + a);
		System.out.println("b : " + b);
	}
	static class InnerS{
		public static int c;
		private int d;
		
		static { c = 3; }
		
		public InnerS() { d = 4;}
		
		public void innerSinfo() {
			System.out.println("- innerSinfo() -");
			System.out.println("a : " + a);
			// outter class 에 있는 일반 멤버를 사용할 수 없음
			// outer 객체의 멤버를 외부에서 사용 할 수 없음
//			System.out.println("b : " + b);
			System.out.println("c : " + c);
			System.out.println("d : " + d);
		}
	}
}

// 객체를 생성하지 않고 쓸 수 있음
class MySystem {
	
	static final class Inner {
		public void println(String message) {
			System.out.println(message);
		}
	}
	static final Inner out = new Inner();
}

public class Ex02Static {
	public static void main(String[] args) {
		OuterS.InnerS oi = new OuterS.InnerS();
		
		MySystem.out.println("안녕 나는 마이시스템 프린트 메소드야");
	}
}

안녕 나는 마이시스템 프린트 메소드야


Ex03Local

지역 중첩 클래스

  • method 안에 class 를 정의
class OuterL{
	private int a;
	
	public OuterL() { a=1;}
	
	public void info() {

		class Local{
			private int b;
			
			public Local() { b = 2; }
			
			public void localInfo() {
				System.out.println("a : " + a);
				System.out.println("b : " + b);
			}
			
		}// class Local
		Local li = new Local();
		li.localInfo();
			
	} // info()
	
}

public class Ex03Local {
	public static void main(String[] args) {
		OuterL ol = new OuterL();
		ol.info();
	}
}

a : 1
b : 2


Ex04Anonymous

익명 중첩 클래스

객체를 생성하면서 내부에 있는 메소드의 기능을 바꿀 수 있음
오버라이드와 같은 기능?

class  Anony{
	public void info() {
		System.out.println("- annoy info() -");
	}
}

public class Ex04Anonymous {
	public static void main(String[] args) {
		
		// 아래와 같이 객체를 생성하는 것과 같이 작성 후
		// ;(세미콜론) 이 아니라 {}를 쓰고 내부에 메소드를 재정의 한 후 
		// 중괄호를 닫고 ;(세미콜론) 을 찍어준다
		// 아래와 같이 작성하면 클래스가 만들어짐
		// -> bin 폴더에 클래스명에 $가 추가된 파일이 추가된다
		// 상속 없이 메소드의 기능을 바꿔야할 때 사용
		Anony anony = new Anony() {
			public void info() {
				System.out.println("즐거운 하루");
			}
		};
		
		anony.info();
	}
}

즐거운 하루


P11_API


API.txt

< API.txt >

API ( Application Programming Interface )

  • Java 프로그램 개발에 사용되는 class, interface 의 모음

  • Java 에서 기본적으로 제공되는 라이브러리이고, class 는 모두 package 에 들어 있다.

  • http://docs.oracle.com/javase/11/docs/api/index.html

  • // 11 은 JDK 버젼

  • 위의 URL을 타고 들어가 모르는 것을 찾아볼 수 있음

  • 기본적으로 쓰는 것들은 java.base 모듈에 있음

  • 들어가 보면 package 항목들이 나열됨

  • 8버젼 스타일이 편할 수 있으므로 11->8로 바꾸면 됨


ch01_Object


ExObject

Object

  • Object class 는 Java 의 최상위 클래스이다
  • Java의 모든 class는 이 Object class 를 무조건 상속받음
package ch01_Object;
//이 패키지는 임포트하지 않아도 자동으로 임포트 되도록 되어 있음
import java.lang.*; 

// - public class ExObject extends Object{
public class ExObject {
	public static void main(String[] args) {
		Object objA = new Object();
		Object objB = new Object();
		
		// getClass() : class type 를 return
		System.out.println("objA.getClass() : "+objA.getClass());
		System.out.println();
		
		// hashCode() : 객체 고유번호 / 10진수
		// 이 hashCode 는 절대 중복 될 수 없음 
		System.out.println("objA.hashCode() : " + objA.hashCode());
		System.out.println("objB.hashCode() : " + objB.hashCode());
		
		// toString() : getClass(), hashCode() 조합
		// 일반 hashCode 는 10진수
		// toString 의 hashCode는 16진수로 변환되어 나옴 0 ~ 9 - a ~ f
		System.out.println("objA.toString() : "+ objA.toString());
		System.out.println("objA : " + objA); // reference
		System.out.println("objB.toString() : "+ objB.toString());
		
		// equals() : 동일한 객체인지 확인
		System.out.println("objA.equals(objB) : " + objA.equals(objB));
	}
}

objA.getClass() : class java.lang.Object

objA.hashCode() : 366712642
objB.hashCode() : 1829164700

objA.toString() : java.lang.Object@15db9742
objA : java.lang.Object@15db9742
objB.toString() : java.lang.Object@6d06d69c
objA.equals(objB) : false


Product

package ch01_Object;

public class Product {
	
	private String serial;	// 제품 고유 번호
	private int value;
	
	public Product(String serial) {
		this.serial = serial;
	}
	// 변수명으로 해서 객체정보를 얻을 때
	@Override
	public String toString() {
		return "제품번호 - " + serial;
	}
	
	public void showSerial() {
		System.out.println("제품번호 - " + serial);
	}

	@Override
	public int hashCode() {
		return serial.hashCode() + value;
	}
	
	// 매개변수가 Object 면 편리한 점 
	// Object class 가 최상위 클래스이기 때문에 모든 객체를 받을 수 있음
	// 이런식으로 추가할 수 있음
	// 객체안의 객체를 비교할 때
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Product) { // 같은 타입인지 확인
			Product tmp = (Product)obj; // 원래 타입으로 변환
			if(this.serial.equals(tmp.serial)) { // 내용물이 같은지 확인
				return true;
			}
			if(this.value == tmp.value) { // 내용물이 같은지 확인
				return true;
			}
		} 
		return false;
	}
}

ProductMain

package ch01_Object;

public class ProductMain {
	public static void main(String[] args) {
		Product proA = new Product("001");
		Product proB = new Product("002");
		Product proC = new Product("001");
		
		proA.showSerial();
		proB.showSerial();
		proC.showSerial();
        
		System.out.println(proA.equals(proB));
		System.out.println(proA.equals(proC));
		
		System.out.println(proA.equals(proB));
		System.out.println(proA.equals(proC));
        
		System.out.println(proA);
		System.out.println(proB);
		System.out.println(proC);
	}
}

제품번호 - 001
제품번호 - 002
제품번호 - 001

true
true

true
true

제품번호 - 001
제품번호 - 002
제품번호 - 001


Car / 내 코드

Car class 를 정의하고, CarMain class 에서 테스트

  • 제조회사, 모델명의 관리가 가능
  • 제조회사, 모델명이 같으면 동일한 차량으로 판단
  • 변수명을 사용해서 차량 정보를 확인 가능
package ch01_Object;
public class Car {
	private String company;
	private String model;
	
	public Car(String company, String model) {
		this.company = company;
		this.model = model;
	}
	
	public String toString() {
		return "제조회사 : " + company + " - 모델명 : " + model;
	}
	
	public int hashCode() {
		return company.hashCode() + model.hashCode();
	}
	public boolean equals(Object obj) {
		if(obj instanceof Car) {
			Car tmp = (Car)obj;
			// 비교 할 것이 너무 많아지면 가로로 길어져서 보기에 나쁨
			// 강사님의 코드처럼 if 문 만 추가하면 됨
			// 가로로 길때의 단점 : Error가 발생했을 때 찾기 힘듬
			if(this.company.equals(tmp.company)&&this.model.equals(tmp.model)) {
				return true;
			}
		}
		return false;
	}
}

CarMain

package ch01_Object;

public class CarMain {
	public static void main(String[] args) {
		Car avang1 = new Car("현대", "avente");
		Car avang2 = new Car("현대", "avente");
		Car avang3 = new Car("현대", "aventeN");

		Object obj = new Car("asdasd", "asd");
		
		System.out.println(avang1);
		System.out.println(avang2);
		System.out.println(avang3);
		
		System.out.println();
		
		System.out.println(avang1.hashCode());
		System.out.println(avang2.hashCode());
		System.out.println(avang3.hashCode());
		
		System.out.println();
		
		System.out.println(avang1.toString());
		System.out.println(avang2.toString());
		System.out.println(avang3.toString());
		
		System.out.println();
		
		System.out.println(avang1.equals(avang2));
		System.out.println(avang1.equals(avang3));
		System.out.println(avang2.equals(avang3));
		
	}
}

제조회사 : 현대 - 모델명 : avente
제조회사 : 현대 - 모델명 : avente
제조회사 : 현대 - 모델명 : aventeN

-1404101621
-1404101621
-629804773

제조회사 : 현대 - 모델명 : avente
제조회사 : 현대 - 모델명 : avente
제조회사 : 현대 - 모델명 : aventeN

true
false
false


ch01_ObjectQuizT


Car / 강사님 코드

package ch01_ObjectQuizT;

public class Car {
	private String company; // 제조회사
	private String model; // 모델명

	public Car(String company, String model) {
		this.company = company;
		this.model = model;
	}

	public int hashCode() {
		return company.hashCode() + model.hashCode();
	}

	public boolean equals(Object obj) {
		if (obj instanceof Car) {
			Car tmp = (Car) obj;
			// 이런식으로 작성했을 때 if문이 순차적으로 돌아가다가 
			// 하나라도 다른게 나오면 return false; 하기 때문에 바로 false 반환
			if (!company.equals(tmp.company))
				return false;
			if (!model.equals(tmp.model))
				return false;
			return true;
		}
		return false;
	}

	public String toString() {
		return "제조회사 : " + company + " - 모델명 : " + model;
	}
}

CarMain

package ch01_ObjectQuizT;

public class CarMain {
	public static void main(String[] args) {

		Car carA = new Car("kia", "ev6");
		Car carB = new Car("kia", "ev9");
		Car carC = new Car("kia", "ev6");

		System.out.println(carA.equals(carB));
		System.out.println(carA.equals(carC));

		System.out.println();

		System.out.println(carA);
		System.out.println(carB);

	}
}

false
true

제조회사 : kia - 모델명 : ev6
제조회사 : kia - 모델명 : ev9


ch02_String


ExString

package ch02_String;

public class ExString {
	public static void main(String[] args) {
		String stnA = "Java";
		String stnB = new String("Java");
		String stnC = "java";

		// String 클래스에서는 Override가 되어있기 때문에
		// 변수명만 출력하면 변수에 담겨있는 문자열이 출력되도록 재정의
		System.out.println(stnA);
		System.out.println(stnB);
		System.out.println(stnC);

		System.out.println();
		// 문자열이 hashCode로 변환되어 있기 때문에 같은 문자열이면 같은 int 값 나옴
		System.out.println(stnA.hashCode());
		System.out.println(stnB.hashCode());
		System.out.println(stnC.hashCode());

		System.out.println();

		// equals() : 같은 문자열인지 확인
		// String 에서 Override가 되어 문자열이 같은지 비교함
		System.out.println(stnA.equals(stnB));
		System.out.println(stnA.equals(stnC));

		System.out.println();

		String title = "자바 program";
		System.out.println("title : " + title);
		System.out.println("title 문자수 : " + title.length());

		System.out.println();

		// 특정 문자열이 청므으로 나타는 위치
		int title_pos = title.indexOf("p");
		System.out.println("p 위치 : " + title_pos);

		// 특정 문자열이 마지막으로 나타나는 위치
		int title_lastPos = title.lastIndexOf("r");
		System.out.println("r 마지막 위치 : " + title_lastPos);

		System.out.println();

		// 특정 문자열 변경
		String new_title = title.replace("자바", "Java");
		System.out.println("new_title : " + new_title);

		System.out.println();

		String phone = "010-1234-5678";
		System.out.println("phone : " + phone);

		// 문자열 자르기
		// (시작위치, 마지막 위치)

		String pa = phone.substring(4, 8); // 시작 index ~ (마지막 index -1)
		String pb = phone.substring(9); // 시작 index ~ 끝까지
		System.out.println("앞 4자리 : " + pa);
		System.out.println("뒤 4자리 : " + pb);

		System.out.println();

		String email = "test@abc.com";
		System.out.println("E-mail : " + email);

		// @ 위치
		int at = email.indexOf("@");
		System.out.println("@ 위치 : " + at);

		// ID
		String id = email.substring(0, at);
		System.out.println("ID : " + id);

		// Domain
		String domain = email.substring(at + 1);
		System.out.println("Domain : " + domain);

		System.out.println();

		// 문자열 내 특정 문자열을 기준으로 잘라서 배열에 넣기
		String[] ar = phone.split("-");
		for (int i = 0; i < ar.length; i++) {
			System.out.println(ar[i]);
		}
	}
}
profile
Fintech

0개의 댓글