0402 무한배열

Fifty·2025년 4월 2일

2. JAVA

목록 보기
18/33
post-thumbnail

무한배열 예제

0401에 한 MyIntArray 클래스를 활용한다.

  1. 삭제 메소드
    배열의 요소값을 삭제해본다.

인덱스 0 1 2 3 4
배열값 1 2 3 4 5

배열의 특정 인덱스(2)에 삭제가 일어나면

인덱스 0 1 2 3 4
배열값 1 2 4 5 5

즉, 삭제가 된 배열 값을 제외하고 앞으로 이동 → 뒤에 비어있다고 가정
삭제하고자하는 index=2면 delectInt(2);

index2에 index3을, index3에 index4를 저장하게 반복문으로 구현해주고,
출력은 길이 인덱스를 별도로 leng으로 선언해주어
삭제가 일어나면 -1, 추가가 일어나면 +1하면
아래와 같이 출력된다.


  1. 추가 메소드
    비어있는 자리(맨 뒤)에 추가로 받은 숫자를 넣는다.
    현재 arr[leng]은 사용하지 않는 데이터존이므로 그자리에 매개변수로 받은 값을 넣는다.
    leng으로 선언한 값도 증가
    void addInt(int n){
    }

  1. 삭제 시 에러가 나면 안된다.
    deleteInt 함수에 leng이 0일 경우 배열이 비어있음을 알린다.

  1. 배열이 5개가 다 차면 5만큼 더 큰 배열을 생성해준다.

원래 배열 arr보다 길이가 5만큼 더 큰 copyArr배열을 만들고,
copyArr에 arr값을 복사한다.
copyArr는 arr보다 5만큼 더 큰 배열이므로, 추가된 숫자를 입력해줄 수 있다.
copyArr[leng]=n;
leng+1(copyArr.length)로 재설정 해준뒤
arr 가 가리키는 배열을 copyArr로 설정해준다. → 무한 배열(+5) 생성

MyIntArray.java

package ex0401;
public class MyIntArray {
	
	// 멤버변수: 정수배열
	private int[] arr;
	private int leng;
	
	// 기본생성자를 사용해서 정수 5개를 저장할 수 있는 배열 할당
	MyIntArray(){
		this.arr = new int[5];
		this.leng = arr.length;
	}
	// 특정 인덱스의 요소를 얻어내는 getter
	public int getter(int index) {
		return arr[index];
	}
	// 특정 인덱스의 요소를 저장하는 getter
	public void setter(int index, int n) {
		arr[index]=n;
	}
	// 배열에 저장되어 있는 모든 값 출력
	public void printArray() {
		System.out.print("배열: [ ");
		for(int i=0; i<leng; i++)
			System.out.print(arr[i]+" ");
		
		System.out.print("]  길이 "+arr.length);
		System.out.println(" | leng"+leng);
	}	
	public void deleteInt(int index) {
		if(leng==0)
			System.out.println("배열이 비어있습니다.");
		else {
			for(int i=index; i<leng-1; i++) {
				arr[i] = arr[i+1];
			}
			leng--;	
		}
	}	
	public void addInt(int n) {
		if(leng==arr.length) {
			System.out.println("배열이 다찼습니다. 배열 길이를 5만큼 더 늘리겠습니다.");
			// copyArr배열 생성해서 copy
			int[] copyArr = new int[leng+5];
			// arr 배열 값을 copyArr에 복사
			for(int i=0; i<leng; i++) {
				copyArr[i]=arr[i];
			}
			copyArr[leng]=n;
			// leng을 leng+5(copyArr.length)로 증가
			leng=leng+1;
			// arr가 가리키는 지점을 copyArr로 재지정
			this.arr = copyArr;
		}
		else {
			arr[leng]=n;		
			leng++;
		}
	}	
}

  1. printLeng() 함수를 추가해주었음.
	public void printLeng() {
		System.out.println("");
		System.out.print("배열길이: "+arr.length);
		System.out.print(" | 입력 갯수: "+leng);
		System.out.println(" | 남은 공간: "+(arr.length-leng));
		System.out.println("---------------------------------------");
	}


  1. 특정한 데이터가 들어있는지 있다면 true를 반환
	public boolean searchInt(int n) {
		boolean flag=false;
		for(int i=0; i<leng; i++)
			if(arr[i]==n) {
				flag = true;
				break;
			}
		return flag;
				
	}


  1. removeAll()
	public void removeAll() {
		for(int i=0; i<leng; i++)
			arr[i]=0;
		System.out.println("배열의 모든 값을 지웠습니다..");
		leng=0;
	}


  1. 실수, 문자열을 만드는 클래스도 만들어야 한다. → 상속으로 구현하기

MyArray() 부모

MyIntArray() 자식1
MyFloatArray() 자식2
MyCharArray() 자식3


[예제] 떡국 먹기

Person 클래스
멤버변수: 이름 name 나이 age
멤버함수: eat떡국

  • 나이가 1살 증가
  • System.out.println(??떡국??+"을 먹었습니다.");

Ejrrnr (떡국)클래스
name="떡국"


라면 클래스
칼로리 1000

사람 클래스에 몸무게 추가
라면 먹으면 1/칼로리만큼 몸무게가 늘어난다.

	public void eatRamen(Ramen r) {
		weight+=1/r.calorie;
		System.out.println(name+"이 "+r.name+"을 먹었습니다.");
	}

eatEjrrnr 과 eat Ramen 을 하나로 합치기

	public void eat(Food f) {
		if(f instanceof Ejrrnr) {
			age++;
			System.out.println(name+"이 "+f.name+"을 먹었습니다. "+age+"살이 되었습니다.");
		}
		else if(f instanceof Ramen) {
			weight+=1/((Ramen) f).calorie;
			System.out.println(name+"이 "+f.name+"을 먹었습니다. "+weight+"kg이 되었습니다.");
		}
	}

PersonEatTest.java

package ex0402_2;

public class PersonEatTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Person p = new Person("홍길동",10,60.0f);
		Ejrrnr e = new Ejrrnr();
		Ramen r = new Ramen();
		//p.eatEjrrnr(e);
		//p.eatRamen(r);
		
		
		p.eat(e);
		p.eat(r);
		
	}
}

Person.java

package ex0402_2;

public class Person {
	String name;
	int age;
	float weight;
	Ejrrnr e;
	
	Person(String name, int age, float weight){
		this.name=name;
		this.age=age;
		this.weight=weight;
	}
	
	// eatEjrrnr, eatRamen
	/*
	public void eatEjrrnr(Ejrrnr e) {
		age++;
		System.out.println(name+"이 "+e.name+"을 먹었습니다.");
	}
	
	public void eatRamen(Ramen r) {
		weight+=1/r.calorie;
		System.out.println(name+"이 "+r.name+"을 먹었습니다.");
	}*/
	
	public void eat(Food f) {
		if(f instanceof Ejrrnr) {
			age++;
			System.out.println(name+"이 "+f.name+"을 먹었습니다. "+age+"살이 되었습니다.");
		}
		else if(f instanceof Ramen) {
			weight+=1/((Ramen) f).calorie;
			System.out.println(name+"이 "+f.name+"을 먹었습니다. "+weight+"kg이 되었습니다.");
		}
	}
}

Ramen.java

package ex0402_2;

public class Ramen extends Food{
	
	float calorie;
	
	Ramen(){
		this.name="라면";
		this.calorie=1000;
	}
}

Ejrrnr.java

package ex0402_2;

public class Ejrrnr extends Food{
	Ejrrnr(){
		this.name="떡국";
	}
}

Food.java

package ex0402_2;

public class Food {
	String name;
}

추상메소드 abstract

완성되지 않은 메서드(미완성): 블록이 없다.
인스턴스는 만들 수 없으나 상속은 가능하다.
상속받은 자식클래스에서는 반드시 구현해야한다. (!!약속!!)

0개의 댓글