[필기정리]Day21 - 문제 step2

SW/Java

2020. 7. 8. 13:16

문제1. AAA 클래스에 매개변수가 한개인 제네릭 메소드를 정의하고

        main 메소드가 있는 Test 클래스에서 호출해 보자.

A.

class AAA
{
	public <T> void show(T inst)
	{
		System.out.println(inst);
	}
}

class CCC
{
	public String toString()
	{
		return "CCC class";
	}
}

public class Test 
{
	public static void main(String[] args) 
    {
		AAA aaa = new AAA();
		aaa.<CCC>show(new CCC());
		aaa.show(new CCC());
	}
}

 

문제2. 둘 이상의 매개변수를 받는 제네릭 메소드를 정의하고 호출해 보자.

A.

class AAA
{
	public String toString()
	{
		return "Class AAA";
	}
}

class BBB
{
	public String toString()
	{
		return "Class BBB";
	}
}

class InstanceTypeShower2
{
	public <T, U> void showInstType(T inst1, U inst2)
	{
		System.out.println(inst1);
		System.out.println(inst2);
	}
}

class IntroGenericMethod2
{	
	public static void main(String[] args)
	{
		AAA aaa=new AAA();
		BBB bbb=new BBB();
		
		InstanceTypeShower2 shower=new InstanceTypeShower2();
		shower.<AAA, BBB>showInstType(aaa, bbb);
		shower.showInstType(aaa, bbb);
	}
}

 

문제3. 둘 이상의 인스턴스 변수 기반의 제네릭 클래스를 정의해 보자.

A.

class GenericTwoParam<T, U>
{
	T item1;
	U item2;

	public void setItem1(T item)
	{
		item1 = item;
	}
	public void setItem2(U item)
	{
		item2 = item;
	}
}

 

문제4. 아래에 정의된 클래스는 컴파일 시 에러가 발생한다.

         여러분이 직접 컴파일을 해서 문제점이 무엇인지 확인하고, 문제점의 원인을 유추하기 바란다.

class MyClass
{
	public <T> void simpleMethod(T param)
	{
		param.showData();
		System.out.println(param);
	}
}

A.

class MyClass
{
	public <T> void simpleMethod(T param)
	{
		param.showData();
		System.out.println(param);
	}
}

제네릭 기반의 클래스 또는 메소드는 어떠한 자료형을 기반으로라도(물론 기본 자료형은 제외이다)

실행이 가능하도록 정의가 되어야 컴파일 에러가 발생하지 않는다.

매개변수 param을 이용해서 showData 메소드를 호출하는 부분이 있다.

이는 매개변수 param이 참조하는 인스턴스에 showData라는 메소드가 존재해야만 실행 가능한 문장이다.

즉, 모든 자료형을 기반으로 실행 가능한 문장이 아니기 때문에 컴파일 에러가 발생한다.

제네릭 메소드 내에서는

제네릭으로 선언된 참조변수를 통해서 Object 클래스에 정의된 메소드만 호출이 가능하다.

이는 모든 자료형을 기반으로 실행이 가능하도록 하기 위함이다.

 

문제5. 아래의 소스코드는 컴파일시 에러가 발생한다.

         이 것을 에러가 없게 수정하자.

         Generic 부분은 수정하지 않고 메소드의 몸통만 수정해서 에러가 없게 하자.

         (showInstanceAncestor, showInstanceName 메소드의 내용부분)

interface SimpleInterface
{
	public void showYourName();
}

class UpperClass
{
	public void showYourAncestor()
	{
		System.out.println("UpperClass");
	}
}

class AAA extends UpperClass implements SimpleInterface
{
	public void showYourName()
	{
		System.out.println("Class AAA");
	}
}

class BBB extends UpperClass implements SimpleInterface
{
	public void showYourName()
	{
		System.out.println("Class BBB");
	}
}

class BoundedTypeParam
{
	public static <T> void showInstanceAncestor(T param)
	{
		param.showYourName();
	}

	public static <T> void showInstanceName(T param)
	{
		param.showYourAncestor();
	}

	public static void main(String[] args)
	{
		AAA aaa=new AAA();
		BBB bbb=new BBB();

		showInstanceAncestor(aaa);
		showInstanceName(aaa);
		showInstanceAncestor(bbb);
		showInstanceName(bbb);
	}
}

A.

interface SimpleInterface
{
	public void showYourName();
}

class UpperClass
{
	public void showYourAncestor()
	{
		System.out.println("UpperClass");
	}
}

class AAA extends UpperClass implements SimpleInterface
{
	public void showYourName()
	{
		System.out.println("Class AAA");
	}
}

class BBB  extends UpperClass implements SimpleInterface
{
	public void showYourName() 
	{
		System.out.println("Class BBB");
	}
}

class BoundedTypeParam
{	
	public static <T> void showInstanceAncestor(T param)
	{
		((SimpleInterface)param).showYourName();
	}
	
	public static <T> void showInstanceName(T param)
	{
		((UpperClass)param).showYourAncestor();
	}
	
	public static void main(String[] args)
	{
		AAA aaa=new AAA();
		BBB bbb=new BBB();
		
		showInstanceAncestor(aaa);
		showInstanceName(aaa);
		showInstanceAncestor(bbb);
		showInstanceName(bbb);
	}
}

 

문제6. 문제6에 있는 소스코드를 컴파일 해보면 컴파일 시에는 에러가 발생하지 않지만

         (javac BoundedTypeParam.java) 런타임시에는 오류가 발생한다.

         (java BoundedTypeParam).

         이유는 Step1에서 설명했다.

interface SimpleInterface
{
	public void showYourName();
}

class UpperClass
{
	public void showYourAncestor()
	{
		System.out.println("UpperClass");
	}
}

class AAA extends UpperClass
{
}

class BBB implements SimpleInterface
{
	public void showYourName() 
	{
		System.out.println("Class BBB");
	}
}

class BoundedTypeParam
{	
	public static <T> void showInstanceAncestor(T param)
	{
		((SimpleInterface)param).showYourName();
	}
	
	public static <T> void showInstanceName(T param)
	{
		((UpperClass)param).showYourAncestor();
	}
	
	public static void main(String[] args)
	{
		AAA aaa=new AAA();
		BBB bbb=new BBB();
		
		showInstanceAncestor(aaa);
		showInstanceName(bbb);
	}
}

A.

interface SimpleInterface
{
	public void showYourName();
}

class UpperClass
{
	public void showYourAncestor()
	{
		System.out.println("UpperClass");
	}
}

class AAA extends UpperClass
{
}

class BBB implements SimpleInterface
{
	public void showYourName() 
	{
		System.out.println("Class BBB");
	}
}

class BoundedTypeParam
{	
	public static <T> void showInstanceAncestor(T param)
	{
		((SimpleInterface)param).showYourName();
	}
	
	public static <T> void showInstanceName(T param)
	{
		((UpperClass)param).showYourAncestor();
	}
	
	public static void main(String[] args)
	{
		AAA aaa=new AAA();
		BBB bbb=new BBB();
		
		showInstanceAncestor(bbb);
		showInstanceName(aaa);
	}
}

 

문제7. 문제5를 안정성있는 형태로 바꾸어 보자.

A.

interface SimpleInterface
{
	public void showYourName();
}

class UpperClass
{
	public void showYourAncestor()
	{
		System.out.println("UpperClass");
	}
}

class AAA implements SimpleInterface
{
	public void showYourName() 
	{
		System.out.println("Class BBB");
	}
}

class BBB extends UpperClass
{
}

class BoundedTypeParam
{	
	public static <T extends UpperClass> void showInstanceAncestor(T param)
	{
		param.showYourAncestor();
	}
	
	public static <T extends SimpleInterface> void showInstanceName(T param)
	{
		param.showYourName();
	}
	
	public static void main(String[] args)
	{
		AAA aaa=new AAA();
		BBB bbb=new BBB();
		
		showInstanceAncestor(bbb);
		showInstanceName(aaa);
	}
}

 

문제8. 문제6을 아래와 같이 안정성있는 형태로 바꾸었는데 컴파일 해보면(javac BoundedTypeParam.java)

         이제는 컴파일 시에 에러가 나오는 것을 볼 수가 있다.

         자료형에 대한 안정성이 보장되었다.

interface SimpleInterface
{
	public void showYourName();
}

class UpperClass
{
	public void showYourAncestor()
	{
		System.out.println("UpperClass");
	}
}

class AAA extends UpperClass
{
}

class BBB implements SimpleInterface
{
	public void showYourName() 
	{
		System.out.println("Class BBB");
	}
}

class BoundedTypeParam
{	
	public static <T> void showInstanceAncestor(T param)
	{
		((SimpleInterface)param).showYourName();
	}
	
	public static <T> void showInstanceName(T param)
	{
		((UpperClass)param).showYourAncestor();
	}
	
	public static void main(String[] args)
	{
		AAA aaa=new AAA();
		BBB bbb=new BBB();
		
		showInstanceAncestor(aaa);
		showInstanceName(bbb);
	}
}

A.

interface SimpleInterface
{
	public void showYourName();
}
 
class UpperClass
{
	public void showYourAncestor()
	{
		System.out.println("UpperClass");
	}
}
 
class AAA extends UpperClass implements SimpleInterface
{
	public void showYourName()
	{
		System.out.println("Class AAA");
	}
}
 
class BBB  extends UpperClass implements SimpleInterface 
{
	public void showYourName() 
	{
		System.out.println("Class BBB");
	}
}
 
class BoundedTypeParam2
{	
	public static <T extends SimpleInterface> void showInstanceAncestor(T param) // extends로 구현받는 것까지로 한정짓고 있다 
	{
		param.showYourName();
	}
	
	public static <T extends UpperClass> void showInstanceName(T param) // extends로 상속받은 것까지로 한정짓고 있다
	{
		param.showYourAncestor();
	}
	
	public static void main(String[] args)
	{
		AAA aaa=new AAA();
		BBB bbb=new BBB();
		
		showInstanceAncestor(aaa); // 결과 : Class AAA
		showInstanceName(aaa); // 결과 : UpperClass
		showInstanceAncestor(bbb); // 결과 : Class BBB
		showInstanceName(bbb); // 결과 : UpperClass
	}
}
728x90