티스토리 뷰

Chapter 8. 추상 클래스와 인터페이스 내부 클래스

 

▶ 학습 목표

: 추상이 무엇인지 이해할 수 있다. 인터페이스가 무엇인지 알고 추상과의 차이를 알고 사용한다.

 

 

 

 

8-2. 인터페이스

 

인터페이스는 상속과 비슷한 개념으로 클래스의 변수와 함수를 가져오는 것이다.

하지만 상속과 인터페이스의 차이점으로는 인터페이스는 강제성을 띄는 특성을 가졌다.

인터페이스는 기본적인 양식, 틀을 제공하는 것으로 안의 함수가 비어있다.

그러므로 안의 함수를 무조건 작성을 해야한다.

또한, 이름을 변경할 수 없다.

하지만 상속은 이미 클래스 안의 함수는 작성되어 있기 때문에 따로 작성을 하지 않아도 되고 작성을 해도 된다.

 

 

 

* 다형성

 

: 참조변수의 데이터타입을 부모 클래스로 사용하는 것

참조변수 하나만을 사용하여 자식 클래스 여러개를 스왑하여 사용할 수 있다.

만약 다형성을 사용하지 않으면 자식 클래스를 담을 참조변수를 각각 생성해주어야한다.

(하나의 객체에 하나의 변수만 사용 가능 / 같이 사용하면 덮어씀)

(변수는 변수의 데이터타입(클래스,int,float 등)에 해당되는 데이터만 담을 수 있음)

 

부모클래스명 참조변수 = new 자식클래스();

 

* 다른 클래스로부터 파라미터 값을 가져올때, 다형성을 쓰지않으면 오버로딩을 사용하여 파라미터 값마다 각각의 메서드를 생성 다형성을 사용하면 데이터타입 변경 필요없으므로 하나의 메서드만 생성 작성할 코드가 줄어든다.

 

 

 

 

- 인터페이스와 다형성

 

 

인터페이스명 참조변수이름 = new 클래스명();

 

 

ex) 인터페이스에서 다형성을 사용한 예시

 

package chapter8;

interface Camera   //phone2
{
	void photo();
}
interface Call   //phone3
{
	void calling();
}
interface Memo   //phone4
{
	void write();
}
interface Clock  //phone5
{
	void clock();
}

class Mycellphone implements Camera,Call,Memo,Clock  //phone1
{

	@Override
	public void clock() 
	{
		
	}

	@Override
	public void write() 
	{
		
	}

	@Override
	public void calling() 
	{
		
	}

	@Override
	public void photo() 
	{
		
	}
	
}

class Phoneuser
{
	void call(Call c) 
	{
		System.out.println("전화를 걸었습니다.");
	}
}

public class interface4 
{

	public static void main(String[] args) 
	{
		Mycellphone phone1 = new Mycellphone();
		Camera phone2 = new Mycellphone();
		Call phone3 = new Mycellphone();
		Memo phone4 = new Mycellphone();
		Clock phone5 = new Mycellphone();
		
		Phoneuser user1 = new Phoneuser();
		
		user1.call(phone3);  //phone3의 값을 파라미터로 갖는 user1의 call메서드 실행
		user1.call(phone1);  //phone1의 값을 파라미터로 갖는 user1의 call메서드 실행

	}

}

 

 

 

 

8-3. 내부 클래스

 

: 내부 클래스는 중첩 클래스라고 부른다.

클래스 안에 클래스가 존재하는 것을 의미한다.

클래스 내부에 클래스가 생성된다.

 

 

내부 클래스는 객체생성시 바꿔준다.

생성자() {  } 와 같이 중괄호가 열려 있으면 안의 내용을 바꿔준다.

생정자(파라미터 값) 와 같이 파라미터 값이 입력되어 있으면 파라미터 값을 생성자를 이용하여 보낸다.

 

class OuterClass
{//외부클래스
    class InnerClass
    {//내부클래스
    }
 }

 

내부 클래스를 사용하면 코드를 간결하게 만들 수 있다.

하나의 클래스 내부에 존재하며 클래스를 감추어 캡슐화할 수 있다.

 

 

 

 

- 내부 클래스의 종류

: 내부 클래스의 종류로는 인스턴스, 스태틱, 지역, 익명 4가지가 있다.

인스턴스와 스태틱은 클래스 안에 위치하고 지역, 익명은 함수 안에 위치한다.

 

 

 

인스턴스 클래스

 

class OuterClass{
	class Innerstance{}
}

 

 

스태틱 클래스

 

class OuterClass{
	class Innerstance{}
}

 

 

 

지역 클래스

 

class OuterClass
{
    void A()
    {
   	 class InnerLocal{}

    }
}

 

 

 

 

 

 

- 내부 클래스의 접근성

 

스태틱 -> 인스턴스 X

스태틱 -> 스태틱 O

인스턴스 -> 인스턴스 O

인스턴스 -> 스태틱 O

 

 

class A
{
    static classStaticInner{}
    class InstanceInner{}
    //스태틱 멤버간 접근 가능
    StaticInner st1 = new StaticInner();
    //인스턴스 멤버간 접근 가능
    InstanceInner ii1 = new InstanceInner();

    static void StaticMethod()
    {    //스태틱 멤버가 스태틱 내부 클래스에 접근 가능
        StaticInner st2 = new StaticInner();
        //스태틱 멤버는 인스턴스 멤버에 접근 불가
        //InstanceInner ii2 = new InstanceInner(); 에러발생
		//스태틱 메서드가 각각의 내부 클래스를 호출하는데 
        //스태틱 멤버가 인스턴스 멤버를 호출하는 것은 불가능하다.
    }
    void InstanceMethod(){
        StaticInner st3 = new StaticInner();
        InstanceInner ii3 = new InstanceInner();
    }
}

 

 

 

 

 

package chapter8;

class Outerclass
{
	int a = 3;
	static int b = 4;
	
	class inner
	{
		int c = 5;
		
		public void innerMethod() 
		{
			System.out.println("<Inner Class>");
		}
	}
	static class staticinner 
	{
		int d =6;
		static int stat = 10;
		
		public static void staticMethod() 
		{
			System.out.println("<Static Inner>");  //클래스 안의 스태틱메소드는 변수라고 본다.
			//클래스 안에 있으면 무조건 변수 함수. 
		}
	}
} //클래스 안의 객체 4개 (인스턴스2개 스태틱2개)

public class inner4 
{

	public static void main(String[] args) 
	{
		Outerclass oc = new Outerclass();
		System.out.println("Outerclass의 a값 : "+oc.a);
		System.out.println("Outerclass의 b값 : "+Outerclass.b);
		
		System.out.println("\n==inner 클래스 접근하기==");
		Outerclass oc2 = new Outerclass();
		Outerclass.inner i = oc2.new inner();
		System.out.println("Inner의 cc의 값 = " +i.c);
		i.innerMethod();
		
		Outerclass.staticinner si = new Outerclass.staticinner();
		System.out.println("staticinner의 d값 = " +si.d);
		
		si.staticMethod();  //일반적인 스태틱호출
		Outerclass.staticinner.staticMethod();  
        //Outer 클래스 안의 staticinner 안에 staticMethod(); 호출

	}

}

 

Outerclass의 a값 : 3
Outerclass의 b값 : 4

==inner 클래스 접근하기==
Inner의 cc의 값 = 5
<Inner Class>
staticinner의 d값 = 6
<Static Inner>
<Static Inner>

 

 

클래스 안에 있으면 변수라고 본다.

생성시 Outerclass.inner i = oc2.new.inner(); 처럼 사용하면

oc2 클래스 안의 inner 클래스를 객체 생성한다는 뜻이다.

 

 

 

 

 

 

 

- 익명 클래스

 

: 이름이 없는 클래스를 말한다.

기존의 클래스를 이용하지만 오버라이딩을 한다.

인스턴스를 생성할 때 블록 안에서 클래스의 내용이 새롭게 재정의된다.

블록의 마지막 끝나는 중괄호 뒤에 세미콜론을 붙여야한다.

 

 

 

package chapter8;
class Outerclass1
{
	void a() 
	{
		System.out.println("method a");
	}
	void b() {}
}

public class anonymous2 
{

	public static void main(String[] args) 
	{
		Outerclass1 o = new Outerclass1() 
		{
			void a() 
			{
				System.out.println("새롭게 정의한 익명 클래스의 메서드입니다.");
			}
		};  //익명 클래스는 반드시 마지막에 세미콜론을 붙여야한다.
		
		o.a();//익명 클래스로 오버라이딩한 메서드 출력
		Outerclass1 ok = new Outerclass1();
		ok.a();  //익명 클래스는 일회용이므로 다시 기존의 메서드 출력
	}

}

 

새롭게 정의한 익명 클래스의 메서드입니다.
method a

 

 

 

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday