KB IT’s Your Life 4기 - Java 알고리즘 16일차


자바 복습

  • OOP 개발
  • 공장에서 물건 설계, 생산, 물류센터에 저장
  • 판매점에서 고객들에게 판매

  • 요구사항에 맞게 클래스 설계, 생성, 저장(XXXService)
  • 검색, 수정, 삭제

  • 자바 그림판 제작
  • 관리해야할 대상: 사용자가 그린 도형(선, 원, 사각, 다각형,…)

  • OOP에서의 클래스 종류
    1. DTO, VO : 데이터 정의 및 저장용 (명사형) ex. PersonVo, StudentVo,… 필요한만큼 많이 생성.
    2. Service, Manager: VO를 관리하는 클래스 (CRUD) ex. PersonService, StudentService,… add(…), find(…), update(…), delete(…), count(),…
    3. UI: 데이터 입력, 출력(GUI, WebUI)
    4. 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;
//	}
}