[필기정리]Day21 - 문제 step1

SW/Java

2020. 7. 8. 13:16

밑에 있는 문제는 각각 새로운 소스코드에 작성한다.

 

문제1. Orange 클래스를 만들고 인스턴스 변수로는 당도를 둔다.(sugarContent)

         그리고 당도를 출력하는 메소드를 둔다.(showSugarContent) 

        Orange 하나를 저장할 수 있는 OrangeBox를 만든다.

        (배열이 아닌 하나를 저장할 수 있게끔 한다.)

        Orange를 저장하고 꺼내는 메소드를 만든다.(store, pullOut)

        메인메소드에서 Orange의 당도가 10OrangeOrangeBox에 저장한다.

        저장되어 있는 Orange를 꺼내서 당도를 확인한다.

 

        Apple 클래스를 만들고 인스턴스 변수로는 무게를 둔다.(weight)

        그리고 무게를 출력하는 메소드를 둔다.(showAppleWeight)

        Apple 하나를 저장할 수 있는 AppleBox를 만든다.

       (배열이 아닌 하나를 저장할 수 있게끔 한다.)

       Apple를 저장하고 꺼내는 메소드를 만든다.(store, pullOut)

       메인메소드에서 Apple의 무게가 200AppleAppleBox에 저장한다.

       저장되어 있는 Apple를 꺼내서 무게를 확인한다.

A.

class Orange
{
	int sugarContent;	// 당분 함량
	public Orange(int sugar) { sugarContent=sugar; }
	public void showSugarContent()
	{ 
		System.out.println("당도 "+sugarContent);
	}
}

class Apple
{
	int weight;	// 사과의 무게
	public Apple(int weight) { this.weight=weight; }
	public void showAppleWeight()
	{ 
		System.out.println("무게 "+weight);
	}	
}
class OrangeBox
{
	Orange item;
	public void store(Orange item) { this.item=item; }
	public Orange pullOut() { return item; }
}

class AppleBox
{
	Apple item;
	public void store(Apple item) { this.item=item; }
	public Apple pullOut() { return item; }
}

class OrangeAppleMain
{	
	public static void main(String[] args)
	{
		OrangeBox oBox=new OrangeBox();
		oBox.store(new Orange(10));
		Orange org1=oBox.pullOut();
		org1.showSugarContent();
		
		AppleBox aBox=new AppleBox();
		aBox.store(new Apple(200));
		Apple app=aBox.pullOut();
		app.showAppleWeight();
	}
}

 

문제2. 문제1의 소스코드 OrangeBoxAppleBox

         어떤 과일도 받을 수 있는 FruitBox로 바꾸어 본다.

         즉, 두 개의 클래스를 하나로 합친다.

         (제네릭 클래스를 사용하지 않는다.)

         메인메소드에서 Orange의 당도가 10OrangeFruitBox에 저장한다.

         저장되어 있는 Orange를 꺼내서 당도를 확인한다.

         메인메소드에서 Apple의 무게가 200AppleFruitBox에 저장한다.

         저장되어 있는 Apple를 꺼내서 무게를 확인한다.

A.

class Orange
{
	int sugarContent;	// 당분 함량
	public Orange(int sugar) { sugarContent=sugar; }
	public void showSugarContent()
	{ 
		System.out.println("당도 "+sugarContent);
	}
}

class Apple
{
	int weight;	// 사과의 무게
	public Apple(int weight) { this.weight=weight; }
	public void showAppleWeight()
	{ 
		System.out.println("무게 "+weight);
	}	
}
class FruitBox
{
	Object item;
	public void store(Object item) { this.item=item; }
	public Object pullOut() { return item; }
}

class FruitBoxMain
{	
	public static void main(String[] args)
	{
		FruitBox fBox1=new FruitBox();
		fBox1.store(new Orange(10));
		Orange org1=(Orange)fBox1.pullOut();
		org1.showSugarContent();
		
		FruitBox fBox2=new FruitBox();
		fBox2.store(new Apple(200));
		Apple app=(Apple)fBox2.pullOut();
		app.showAppleWeight();
	}
}

 

문제3. 문제1과 문제2를 이상없이 풀었다는 과정하에

        문제2에 있는 FruitBox에 문자열 "오렌지"를 저장하도록 하고 컴파일 해보자.

        (새로운 소스코드를 작성해서 직접 실행해 본다.)

        어떤 현상이 벌어지는가?

        예를 들어 소스파일 이름이 FruitBoxMain.java라고 하면

        javac FruitBoxMain.java 라고 컴파일을 실행하면 컴파일 시에는 오류가 발생하지 않는다.

       하지만 java FruitBoxMain 하고서 프로그램을 실행시키게 되면 ClassCastException이 발생한다.

 

      이렇듯 컴파일 과정에서 발견되는 오류는 매우 쉽게 해결이 가능하다.

      반면 위에서 만든 예제와 같이 실행과정에서 발생하는 오류는 찾기가 쉽지 않다.

      언뜻 보기에는 별 차이가 없어 보이지만,

      프로그램의 규모가 크면 클수록 이 둘의 차이는 매우 극명하게 드러난다.

- 실행과정에서 발견되는 오류를 컴파일 과정에서 발견되도록

   코드를 작성하는 것은 매우 의미 있는 일이다.

- 자료형에 대한 안전성이 보장된다.

A.

class Orange
{
	int sugarContent;	// 당분 함량
	public Orange(int sugar) { sugarContent=sugar; }
	public void showSugarContent()
	{ 
		System.out.println("당도 "+sugarContent);
	}
}

class Apple
{
	int weight;	// 사과의 무게
	public Apple(int weight) { this.weight=weight; }
	public void showAppleWeight()
	{ 
		System.out.println("무게 "+weight);
	}	
}
class FruitBox
{
	Object item;
	public void store(Object item) { this.item=item; }
	public Object pullOut() { return item; }
}

class FruitBoxMain
{	
	public static void main(String[] args)
	{
		FruitBox fBox1=new FruitBox();
		fBox1.store("오렌지");
		Orange org1=(Orange)fBox1.pullOut();
		org1.showSugarContent();
		
		FruitBox fBox2=new FruitBox();
		fBox2.store(new Apple(200));
		Apple app=(Apple)fBox2.pullOut();
		app.showAppleWeight();
	}
}

 

문제4. 문제1과 문제2를 이상없이 풀었다는 과정하에

         문제1OrangeBox에 문자열 "오렌지"를 저장하도록하고 컴파일해보자.

         (새로운 소스코드를 작성해서 직접 실행해 본다.)

         어떤 현상이 벌어지는가?

         예를 들어 소스파일 이름이 OrangeAppleMain.java라고 하면 

         javac OrangeAppleMain.java를 컴파일하면 컴파일 과정에서 오류가 난다.

        자료형에 대한 안전성이 보장이 되지만 과일의 종류별로 상자 클래스를 만들어 주어야 하므로

        소스코드의 양이 늘어나게 되고 유지보수가 어려워 진다.

A.

class Orange
{
	int sugarContent;	// 당분 함량
	public Orange(int sugar) { sugarContent=sugar; }
	public void showSugarContent()
	{ 
		System.out.println("당도 "+sugarContent);
	}
}

class Apple
{
	int weight;	// 사과의 무게
	public Apple(int weight) { this.weight=weight; }
	public void showAppleWeight()
	{ 
		System.out.println("무게 "+weight);
	}	
}
class OrangeBox
{
	Orange item;
	public void store(Orange item) { this.item=item; }
	public Orange pullOut() { return item; }
}

class AppleBox
{
	Apple item;
	public void store(Apple item) { this.item=item; }
	public Apple pullOut() { return item; }
}

class OrangeAppleMain
{	
	public static void main(String[] args)
	{
		OrangeBox oBox=new OrangeBox();
		oBox.store("오렌지");
		Orange org1=oBox.pullOut();
		org1.showSugarContent();
		
		AppleBox aBox=new AppleBox();
		aBox.store(new Apple(200));
		Apple app=aBox.pullOut();
		app.showAppleWeight();
	}
}

 

문제5. 문제2를 제네릭 클래스로 바꾼다.

A.

class Orange
{
	int sugarContent;	// 당분 함량
	public Orange(int sugar) { sugarContent=sugar; }
	public void showSugarContent()
	{ 
		System.out.println("당도 "+sugarContent);
	}
}

class Apple
{
	int weight;	// 사과의 무게
	public Apple(int weight) { this.weight=weight; }
	public void showAppleWeight()
	{ 
		System.out.println("무게 "+weight);
	}	
}
class FruitBox<T>
{
	T item;
	public void store(T item) { this.item=item; }
	public T pullOut() { return item; }
}

class FruitBoxMain
{	
	public static void main(String[] args)
	{
		FruitBox<Orange> fBox1=new FruitBox<Orange>();
		fBox1.store(new Orange(10));
		Orange org1=fBox1.pullOut();
		org1.showSugarContent();
		
		FruitBox<Apple> fBox2=new FruitBox<Apple>();
		fBox2.store(new Apple(200));
		Apple app=fBox2.pullOut();
		app.showAppleWeight();
	}
}

 

문제6. 문제5를 이상없이 풀었다는 가정하에

         FruitBox에 문자열 "오렌지"를 저장하도록하고 컴파일해보자.

         (새로운 소스코드를 작성해서 직접 실행해 본다.)

        어떤 현상이 벌어지는가?

        예를 들어 소스파일 이름이 FruitBoxMain.java라고 하면

        javac FruitBoxMain.java를 컴파일하면 컴파일 과정에서 오류가 난다.

        자료형에 안정성도 보장이 되면서 어떤 과일도 저장할 수 있는 상자가 만들어 졌다.

A.

class Orange
{
	int sugarContent;	// 당분 함량
	public Orange(int sugar) { sugarContent=sugar; }
	public void showSugarContent()
	{ 
		System.out.println("당도 "+sugarContent);
	}
}

class Apple
{
	int weight;	// 사과의 무게
	public Apple(int weight) { this.weight=weight; }
	public void showAppleWeight()
	{ 
		System.out.println("무게 "+weight);
	}	
}
class FruitBox<T>
{
	T item;
	public void store(T item) { this.item=item; }
	public T pullOut() { return item; }
}

class FruitBoxMain
{	
	public static void main(String[] args)
	{
		FruitBox<Orange> fBox1=new FruitBox<Orange>();
		fBox1.store("오렌지");
		Orange org1=fBox1.pullOut();
		org1.showSugarContent();
		
		FruitBox<Apple> fBox2=new FruitBox<Apple>();
		fBox2.store(new Apple(200));
		Apple app=fBox2.pullOut();
		app.showAppleWeight();
	}
}

 

문제7. 예제 GenericBaseFruitBox.javaFruitBox<T> 클래스에 생성자를 추가하여,

         다음의 main 메소드가 컴파일 및 실행됨을 확인해보자.

class GenericBaseFruitBox
{
	public static void main(String[] args)
	{

		FruitBox<Orange> orBox=new FruitBox<Orange>(new Orange(10));
		Orange org=orBox.pullOut();
		org.showSugarContent();

		FruitBox<Apple> apBox=new FruitBox<Apple>(new Apple(20));
		Apple app=apBox.pullOut();
		app.showAppleWeight();
	}
}

A.

class Orange
{
	int sugarContent;	// 당분 함량
	public Orange(int sugar) { sugarContent=sugar; }
	public void showSugarContent()
	{ 
		System.out.println("당도 "+sugarContent);
	}
}

class Apple
{
	int weight;	// 사과의 무게
	public Apple(int weight) { this.weight=weight; }
	public void showAppleWeight()
	{ 
		System.out.println("무게 "+weight);
	}	
}

class FruitBox<T>
{
	T item;
	FruitBox(T item)
	{
		this.item = item;
	}
	public void store(T item) { this.item=item; }
	public T pullOut() { return item; }
}

class GenericBaseFruitBox
{	
	public static void main(String[] args)
	{
		FruitBox<Orange> orBox=new FruitBox<Orange>(new Orange(10));
		Orange org=orBox.pullOut();
		org.showSugarContent();
		
		FruitBox<Apple> apBox=new FruitBox<Apple>(new Apple(200));
		Apple app=apBox.pullOut();
		app.showAppleWeight();
	}
}
728x90