[멀캠|Java] 16일차 수업
KB IT’s Your Life 4기 - Java 알고리즘 16일차
자바 복습
- OOP 개발
- 공장에서 물건 설계, 생산, 물류센터에 저장
- 판매점에서 고객들에게 판매
- 요구사항에 맞게 클래스 설계, 생성, 저장(XXXService)
- 검색, 수정, 삭제
- 자바 그림판 제작
- 관리해야할 대상: 사용자가 그린 도형(선, 원, 사각, 다각형,…)
- OOP에서의 클래스 종류
- DTO, VO : 데이터 정의 및 저장용 (명사형) ex. PersonVo, StudentVo,… 필요한만큼 많이 생성.
- Service, Manager: VO를 관리하는 클래스 (CRUD) ex. PersonService, StudentService,… add(…), find(…), update(…), delete(…), count(),…
- UI: 데이터 입력, 출력(GUI, WebUI)
- IO: 데이터 영구저장 및 전송(파일, DBMS, 네트워크를 통한 데이터의 영구저장)
자바 컴파일러가 기본으로 점검하는 내용
- extends 선언하지 않으면 extends Object 강제 추가
- 생성자에서 다른 생성자를 호출하는 코드가 없으면 super()강제 삽입
- 같은 클래스 내 다른 생성자 호출: this(…)
- 부모클래스 생성자 호출: super(…) (+) 생성자의 역할: 객체 초기화
package day_15;
/** 자바 그림판_메인 테스트 클래스 */
public class PainterExam {
public static void main(String[] args) {
// 도형 객체 생성(선, 원, 사각, 다각형)
// 선: x1, y1, x2, y2
// 원: x,y,radius
// 사각: x, y, width, height
// MyShape: 도형의 부모클래스 - 도형들의 공통 변수, 메서드를 정의 (x, y, draw())
MyLine l = new MyLine(3, 3, 5, 5); // 선 객체
System.out.println(l.draw());
System.out.println(l);
MyCircle c = new MyCircle(2, 2, 10);
System.out.println(c);
System.out.println(c.draw());
MyLine[] lines = new MyLine[100]; // 100개는 최대치
int lineCount = 0; // 저장될 위치, 개수
// 저장
lines[lineCount++] = new MyLine(0, 0, 1, 1);
lines[lineCount++] = new MyLine(3, 3, 9, 9);
lines[lineCount++] = new MyLine(6, 6, 19, 19);
lines[lineCount++] = new MyLine(9, 9, 29, 29);
// 개수
System.out.println("라인의 개수: " + lineCount);
// 검색. 시작 좌표로 검색
int findx = 3, findy = 3; // 찾으려는 대상 좌표
int findIndex = -1; // 찾으려는 대상의 위치
for(int i=0; i<lineCount; i++) {
MyLine myLine = lines[i];
//저장된 객체의 x, y가 찾으려는 좌표와 동일하면
if(myLine.getX() == findx && myLine.getY() == findy) {
findIndex = i;
break; // 찾았으니 멈춤
}
}
System.out.println((findIndex==-1)?"못찾음" : "찾음");
}
}
package day_15;
/** 선 */
public class MyLine extends MyShape{
private int x2, y2;
public MyLine() {
}
public MyLine(int x1, int y1, int x2, int y2) {
super(x1, y1);
this.x2 = x2;
this.y2 = y2;
}
public int getX2() {
return x2;
}
public void setX2(int x2) {
this.x2 = x2;
}
public int getY2() {
return y2;
}
public void setY2(int y2) {
this.y2 = y2;
}
@Override
public String toString() {
return super.toString() + ", [x2="+ x2 + ", y2=" + y2 + "]";
}
@Override
public String draw() {
return "LINE";
}
}
package day_15;
/** 도형의 부모 클래스, 공통 변수, 메서드 정의 */
public class MyShape {
// 0으로 초기화 됐다가(묵시적), 100으로 값이 들어가고(명시적), 이후 생성자(생성자 동적 초기화)가 출력되면 다시 100으로 값이 들어감.
// 따라서 3배 이상의 CPU파워가 필요함.
private int x = 100, y = 100;
//생성자메서드(기본, 모든 멤버를 매개변수로 받는 생성자)
public MyShape() {
}
public MyShape(int x, int y) {
super(); //부모 클래스의 생성자를 호출한다.
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public String draw() {
return "";
}
@Override
public String toString() {
return "MyShape [x=" + x + ", y=" + y + "]";
}
}
package day_15;
public class MyCircle extends MyShape{
private int radius;
public MyCircle() {
}
public MyCircle(int x, int y, int radius) {
super(x, y);
this.radius = radius;
}
public int getRadius() {
return radius;
}
public void setRadius(int radius) {
this.radius = radius;
}
@Override
public String toString() {
return super.toString() + ", radius=" + radius;
}
@Override
public String draw() {
return "CIRCLE";
}
}
- PrinterExam의 발전
package day_15;
import day_15.service.MyShapeService;
public class PainterServiceExam {
public static void main(String[] args) {
// 도형을 관리한 객체 생성
MyShapeService mss = new MyShapeService();
MyLine ml = new MyLine(0, 0, 3, 3);
mss.add(ml);
// mss.add(new MyLine(0,0,3,3); 이것과 같음.
ml = new MyLine(3, 3, 9, 9);
mss.add(ml);
ml = new MyLine(6, 6, 19, 19);
mss.add(ml);
ml = new MyLine(9, 9, 29, 29);
mss.add(ml);
System.out.println("저장개수: " + mss.getLineCount());
}
}
==연산자와 .equals(Object)
String s1= "abc"; // 메소드 영역
String s2 = "abc"; //메소드 영역
String s3 = new String("abc"); //힙 영역
String s4 = new String("abc"); //힙 영역
s1==s2 -> true 주소 비교
s1 == s3 -> false 주소 비교
s1.equals(s3) -> true 내용 비교
s1.equals(s4) -> true 내용 비교
수업 전체 자료
package day_15;
public class MyCircle extends MyShape{
private int radius;
public MyCircle() {
}
public MyCircle(int x, int y, int radius) {
super(x, y);
this.radius = radius;
}
public int getRadius() {
return radius;
}
public void setRadius(int radius) {
this.radius = radius;
}
@Override
public String toString() {
return super.toString() + ", radius=" + radius;
}
@Override
public String draw() {
return "CIRCLE";
}
}
package day_15;
/** 도형의 부모 클래스, 공통 변수, 메서드 정의 */
public class MyShape {
// 0으로 초기화 됐다가(묵시적), 100으로 값이 들어가고(명시적), 이후 생성자(생성자 동적 초기화)가 출력되면 다시 100으로 값이 들어감.
// 따라서 3배 이상의 CPU파워가 필요함.
private int x = 100, y = 100;
//생성자메서드(기본, 모든 멤버를 매개변수로 받는 생성자)
public MyShape() {
}
public MyShape(int x, int y) {
super(); //부모 클래스의 생성자를 호출한다.
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public String draw() {
return "";
}
@Override
public String toString() {
return "MyShape [x=" + x + ", y=" + y + "]";
}
}
package day_15;
/** 선 */
public class MyLine extends MyShape{
private int x2, y2;
public MyLine() {
}
public MyLine(int x1, int y1, int x2, int y2) {
super(x1, y1);
this.x2 = x2;
this.y2 = y2;
}
public int getX2() {
return x2;
}
public void setX2(int x2) {
this.x2 = x2;
}
public int getY2() {
return y2;
}
public void setY2(int y2) {
this.y2 = y2;
}
@Override
public String toString() {
return super.toString() + ", [x2="+ x2 + ", y2=" + y2 + "]";
}
@Override
public String draw() {
return "LINE";
}
}
package day_15;
import java.util.ArrayList;
public class MyShapeListService {
private ArrayList<MyShape> shapes = new ArrayList<MyShape>();
public void add(MyShape ms) {
shapes.add(ms);
}
public int getCount() {
return shapes.size();
}
public MyShape findByPosition(int startX, int startY) {
for (MyShape myShape : shapes) {
if (myShape.getX() == startX && myShape.getY() == startY) {
return myShape;
}
}
return null;
}
public boolean remove(MyShape findShape) {
return shapes.remove(findShape);
}
public void printAll() {
System.out.println("** 전체 출력 **");
for (MyShape myShape : shapes) {
System.out.println(myShape);
}
}
}
package day_15;
/** 자바 그림판_메인 테스트 클래스 */
public class PainterExam {
public static void main(String[] args) {
// 도형 객체 생성(선, 원, 사각, 다각형)
// 선: x1, y1, x2, y2
// 원: x,y,radius
// 사각: x, y, width, height
// MyShape: 도형의 부모클래스 - 도형들의 공통 변수, 메서드를 정의 (x, y, draw())
MyLine l = new MyLine(3, 3, 5, 5); // 선 객체
System.out.println(l.draw());
System.out.println(l);
MyCircle c = new MyCircle(2, 2, 10);
System.out.println(c);
System.out.println(c.draw());
MyLine[] lines = new MyLine[100]; // 100개는 최대치
int lineCount = 0; // 저장될 위치, 개수
// 저장
lines[lineCount++] = new MyLine(0, 0, 1, 1);
lines[lineCount++] = new MyLine(3, 3, 9, 9);
lines[lineCount++] = new MyLine(6, 6, 19, 19);
lines[lineCount++] = new MyLine(9, 9, 29, 29);
// 개수
System.out.println("라인의 개수: " + lineCount);
// 검색. 시작 좌표로 검색
int findx = 3, findy = 3; // 찾으려는 대상 좌표
int findIndex = -1; // 찾으려는 대상의 위치
for(int i=0; i<lineCount; i++) {
MyLine myLine = lines[i];
//저장된 객체의 x, y가 찾으려는 좌표와 동일하면
if(myLine.getX() == findx && myLine.getY() == findy) {
findIndex = i;
break; // 찾았으니 멈춤
}
}
System.out.println((findIndex==-1)?"못찾음" : "찾음");
}
}
package day_15;
public class PainterExam2 {
public static void main(String[] args) {
MyLine[] lines = new MyLine[100];
MyCircle[] circles = new MyCircle[100];
MyLine ml = new MyLine(0, 0, 0, 0);
lines[0] = ml;
//circles[0] = ml; 오류가 발생하는 이유는 circles의 형변환이 필요하기 때문이다.
MyShape[] msarr = new MyShape[100];
msarr[0] = ml;
msarr[1] = new MyCircle(0,0,10);
MyShape ms = new MyCircle(0,0,10);
//오버라이딩한 자식의 메서드가 호출
System.out.println(ms.draw());
}
}
package day_15;
import day_15.service.MyShapeService;
public class PainterServiceExam {
public static void main(String[] args) {
// 도형을 관리한 객체 생성
MyShapeService mss = new MyShapeService();
MyLine ml = new MyLine(0, 0, 3, 3);
mss.add(ml);
// mss.add(new MyLine(0,0,3,3); 이것과 같음.
ml = new MyLine(3, 3, 9, 9);
mss.add(ml);
ml = new MyLine(6, 6, 19, 19);
mss.add(ml);
ml = new MyLine(9, 9, 29, 29);
mss.add(ml);
System.out.println("저장개수: " + mss.getLineCount());
//검색. 시작좌표로 검색. 반환타입 -> 인덱스번호, 객체
MyShape findShape = mss.findByPositon(3,3);
if(findShape ==null) {
System.out.println("못찾음");
}else {
System.out.println("찾음: " + findShape);
}
//삭제
boolean b = mss.remove(findShape);
//전체 출력
mss.printAll();
}
}
package day_15;
import day_15.MyShapeListService;
import day_15.service.MyShapeService;
public class PainterServiceListExam {
public static void main(String[] args) {
// 도형을 관리한 객체 생성
MyShapeListService mss = new MyShapeListService();
MyLine ml = new MyLine(0, 0, 3, 3);
mss.add(ml);
// mss.add(new MyLine(0,0,3,3); 이것과 같음.
ml = new MyLine(3, 3, 9, 9);
mss.add(ml);
ml = new MyLine(6, 6, 19, 19);
mss.add(ml);
ml = new MyLine(9, 9, 29, 29);
mss.add(ml);
System.out.println("저장개수: " + mss.getCount());
//검색. 시작좌표로 검색. 반환타입 -> 인덱스번호, 객체
MyShape findShape = mss.findByPosition(30,30);
if(findShape ==null) {
System.out.println("못찾음");
}else {
System.out.println("찾음: " + findShape);
}
// 삭제
boolean b = mss.remove(findShape);
System.out.println("삭제: " + b);
//전체출력
mss.printAll();
}
}
package day_15.service;
/** MyShape 파생객체를 저장 */
import day_15.MyCircle;
import day_15.MyLine;
import day_15.MyShape;
public class MyShapeService {
private MyShape[] lines = new MyShape[100];
private int count = 0; // 저장될 위치, 저장 개수
// add는 overloading이다.
public void add(MyLine ml) {
lines[count++] = ml;
}
public void add(MyCircle ml) {
lines[count++] = ml;
}
public void add(MyShape ml) {
lines[count++] = ml;
}
public int getLineCount() {
return count;
}
public MyShape findByPositon(int startX, int startY) {
for (int i = 0; i < count; i++) {
MyShape myShape = lines[i];
if (myShape.getX() == startX && myShape.getY() == startY) {
return myShape;
}
}
return null; // 못찾으면 null 반환
}
public boolean remove(MyShape findShape) {
for (int i = 0; i < count; i++) {
MyShape myShape = lines[i];
if (myShape.equals(findShape)) {
remove(i);
return true;
}
}
return false;
}
private void remove(int i) {
for (int j = i; j < count; j++) {
lines[i] = lines[i + 1];
}
count--;
}
public void printAll() {
System.out.println("** 전체 출력 **");
for(int i=0; i<count; i++) {
MyShape myShape = lines[i];
System.out.println(myShape);
}
}
// private MyLine[] lines = new MyLine[100];
// private int lineCount = 0; //저장될 위치, 저장 개수
//
//
// public void add(MyLine ml) {
// lines[lineCount++] = ml;
// }
//
// public int getLineCount() {
// return lineCount;
// }
}