패스트캠퍼스 데브캠프 : 남궁성의 백엔드 개발 3기

MyPoint클래스, MyVector클래스 연습문제 회고 - 패스트캠퍼스 백엔드 부트캠프 3기

Tech_JINI 2025. 1. 17. 10:23

MyPoint클래스

class Point{
	int x;
	int y;

	Point() { this(1,1); }
	Point(int x, int y){
		this.x=x;
		this.y=y;
	}
	public String toString(){
		return "x: "+x+", y: "+y;
	}

	static double getDistance(Point p1, Point p2) {
		return Math.sqrt(Math.pow(p1.x-p2.x, 2)+Math.pow(p1.y-p2.y, 2));
	}
	

}

class PointTest{ //Point클래스를 테스트하기 위한 클래스
	Point p;

	PointTest(Point p){
		this.p=p;
		p.x=3;
		p.y=5;
	}
	public String toString(){
		return p.toString();
	}
}

 

Q1-6. Point클래스에 두 점 사이의 거리를 double타입의 값으로 계산해서 반환하는 getDistance(Point p)를 추가하시오.

double getDistance(Point p) {
	return Math.sqrt(Math.pow(x-p.x,2)+Math.pow(y-p.y,2));
}

매개변수 Point의 x,y와 인스턴스 Point의 x,y의 거리를 계산하는 것이다.

 

 

(4,4)와 (2,2) 사이의 거리는 2루트2의 값으로 2.8xx 값이 콘솔에 잘 출력되는 것을 볼 수 있다!

 

 

Q1-7. Point클래스의 equals()를 다음과 같은 조건으로 오버라이딩하고 테스트하시오.

- 비교하는 객체가 Point 객체가 아니면 false를 반환

- Point 객체의 x와 y의 값이 같을 때만 true를 반환

 

public boolean equals(Object o) {
		if (!(o instanceof Point)) {
			return false;
		}
		Point oP = (Point)o;
		return this.x == oP.x && this.y == oP.y;
	}

instanceof를 통해 객체인지 아닌지 구별할 수 있었다.

 

 

 

 

 

전체 코드

class Point{
	int x;
	int y;

	Point() { this(1,1); }
	Point(int x, int y){
		this.x=x;
		this.y=y;
	}
	public String toString(){
		return "x: "+x+", y: "+y;
	}

	static double getDistance(Point p1, Point p2) {
		return Math.sqrt(Math.pow(p1.x-p2.x, 2)+Math.pow(p1.y-p2.y, 2));
	}
	double getDistance(Point p) {
		return Math.sqrt(Math.pow(x-p.x,2)+Math.pow(y-p.y,2));
	}
	
	public boolean equals(Object o) {
		if (!(o instanceof Point)) {
			return false;
		}
		Point oP = (Point)o;
		return this.x == oP.x && this.y == oP.y;
	}

}

class PointTest{ //Point클래스를 테스트하기 위한 클래스
	Point p;

	PointTest(Point p){
		this.p=p;
		p.x=3;
		p.y=5;
	}
	public String toString(){
		return p.toString();
	}
}

public class Q1_MyPoint {

	public static void main(String[] args) {
		Point p = new Point(4,4);
		Point p1 = new Point(2,2);
		Point p2 = new Point(2,2);
		System.out.println(p.getDistance(p1));
		System.out.println(p.equals(p1));
		System.out.println(p1.equals(p2));

	}

}

 


MyVector클래스

 

class MyVector {
	Object[] objArr;
    int capacity;
    
    MyVector() { this(16); }
    MyVector(int capacity){
    	this.capacity = capacity;
        objArr=new Object[capacity];
    }
}

 

Q2-3. MyVector클래스에 객체배열에 저장된 객체의 개수를 저장하기 위한 인스턴스 변수 size를 추가하고, 이 변수의 값을 반환하는 size()와 배열 objArr의 길이를 반환하는 capacity(), 그리고 객체배열이 비었는지 확인하는 boolean isEmpty()를 작성하시오.

[강사님 피드백]

- null까지 저장하기

	int size;
	int size() { return size; }
	int capacity() { return objArr.length; }
	boolean isEmpty() { return size==0; }

 

Q2-4. MyVector클래스의 객체배열 objArr에 객체를 추가하는 메서드 void add(Object obj)를 작성하시오.

[강사님 피드백]

- 공간 확보 코드 추가하기

void add(Object obj) {
	if(capacity==size) {
	capacity*=2;
	objArr = Arrays.copyOf(objArr, capacity);	
	}
	objArr[size]=obj;
	size++;
}

Arrays.copyOf(복사하고 싶은 배열, 크기) 메소드를 사용하여 배열을 복사했다. 

 

Q2-5. MyVector클래스의 객체배열 objArr에 저장된 객체를 반환하는 Object get(index)를 작성하시오.

Object get(int index) { return objArr[index]; }

 

Q2-6. MyVector클래스의 객체배열 objArr에 저장된 모든 객체를 문자열로 이어서 반환하도록 toString()을 오버라이딩하시오.

[강사님 피드백]

- 코드 간결하게 쓰기

public String toString() {
	String a = "";
	for(int i=0; i<size; i++) a+= objArr[i]+" ";
	return a;
}

if(objArr[j]!=null) a+= objArr[j]; 의 코드를 a+= objA[i]+" ";로 간략하게 코드를 줄였다.

 

Q2-7. MyVector클래스의 객체배열 objArr에서 지정된 객체가 저장되어 있는 위치(index)를 반환하는 int indexOf(Object obj)를 작성하시오.

[강사님 피드백]

- null 조건도 추가하기

int indexOf(Object obj) {
	for(int j=0; j<objArr.length; j++) {
		if(objArr[j]==obj) return j;
		if(objArr[j].equals(obj)) return j;
	}
	return -1;
}

'=='은 null을 포함해 비교할 수 있다. (메모리 주소를 비교/ 객체의 참조가 동일한지 확인)

'equals()' 객체비교가 가능하다. (내용(값)을 비교/ 객체의 내용이 동일한지 확인)

Q2-8. MyVector클래스의 객체배열 objArr에서 지정된 객체를 삭제하는 boolean remove(Object obj)를 작성하시오.

- indexof()를 이용할 것

 

[강사님 피드백]

- 객체 삭제 후 한 칸씩 이동하는 코드 추가하기

	boolean remove(Object obj) {
		
		int num = Arrays.asList(objArr).indexOf(obj);

		if (num == -1) return false;
		else { 
			List<Object> list = new ArrayList<>(Arrays.asList(objArr));
			list.remove(num);
			for(int i=num+1;i<size;i++) {
				objArr[i-1]=objArr[i];
				if(i==size) objArr[size]=null;
			}
			size--;
			this.objArr=list.toArray();
		}

		return true;
	}

'size--;'코드가 없을 때 toString()으로 배열을 출력시켰더니 null까지 출력되었다.

또 요소값을 추가로 생성시켰을 때 null 다음에 삽입되는 문제가 있었다.

size--; 코드를 추가시켰더니, 위의 문제가 해결되었다. 

 

 

왼: 'size--;'코드 없을 때의 출력창 / 오: 'size--;'코드 있을 때의 출력창

 

 

최종 코드

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

class MyVector {
	Object[] objArr;
	int capacity;
	
	MyVector(){
		this(16);
	}
	MyVector(int capacity){
		this.capacity=capacity;
		objArr = new Object[capacity];
	}
	
	int size;
	int size() { return size; }
	int capacity() { return capacity; }
	boolean isEmpty() { return size==0; }
	
	void add(Object obj) {
		if(capacity==size) {
			capacity*=2;
			objArr = Arrays.copyOf(objArr, capacity);
			
		}
		objArr[size]=obj;
		size++;
	}
	
	Object get(int index) {
		
		return objArr[index];
	}
	public String toString() {
		String a = "";
		for(int i=0; i<size; i++) a+= objArr[i]+" ";
		return a;
	}
	int indexOf(Object obj) {
		for(int j=0; j<objArr.length; j++) {
			if(objArr[j]==obj) return j;
			if(objArr[j].equals(obj)) return j;
		}
		return -1;
	}
	boolean remove(Object obj) {
		
		int num = Arrays.asList(objArr).indexOf(obj);

		if (num == -1) return false;
		else { 
			List<Object> list = new ArrayList<>(Arrays.asList(objArr));
			list.remove(num);
			for(int i=num+1;i<size;i++) {
				objArr[i-1]=objArr[i];
				if(i==size) objArr[size]=null;
			}
			size--;
			this.objArr=list.toArray();
		}

		return true;
	}
}


public class Q_MyVector {

	public static void main(String[] args) {

		MyVector v = new MyVector(3);
		v.add(1);
		v.add(2);
		v.add(3);
		v.add('a');
		System.out.println(v.capacity);
		System.out.println(v.size);
		System.out.println(v.toString());
		System.out.println(v.indexOf('a'));
		System.out.println(v.indexOf(3));
		System.out.println(v.indexOf(null));
		System.out.println(v.remove('b'));
		System.out.println(v.remove(3));
		System.out.println(v.toString());
		v.add('c');
		System.out.println(v.toString());
		
	}

}