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--; 코드를 추가시켰더니, 위의 문제가 해결되었다.
최종 코드
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());
}
}
'패스트캠퍼스 데브캠프 : 남궁성의 백엔드 개발 3기' 카테고리의 다른 글
비기너반 강의 복습 2 | 구현 vs 개발, 소프트웨어 개발 프로세스, 소프트웨어 공학 설계, TDD, 변수, 객체 지향이란, 객체와 클래스 (1) | 2025.01.18 |
---|---|
비기너반 강의 복습 1 | 인터프리터 vs 컴파일러, JDK vs JRE, 라이브러리 vs 프레임워크, JVM, 운영체제 (1) | 2025.01.17 |
자바 목차 테스트 (2) | 2025.01.15 |
자바의 정석 챕터6, 7 연습문제 회고 - 패스트캠퍼스 백엔드 부트캠프 3기 (2) | 2025.01.10 |
자바의 정석 챕터1~5 연습문제 회고 - 패스트캠퍼스 백엔드 부트캠프 3기 (0) | 2025.01.06 |