추상클래스(abstract class), 익명클래스(anonymous class)

2020. 3. 12. 10:34자바 Java/자바 공부 java study

반응형

 

추상클래스는 “미완성 설계도”에 비유할 수 있다. 클래스가 미완성이라는 거은 멤버의 개수에 관계된 것이 아니라 단지 미완성 메서드(추상 메서드)를 포함하고 있다는 의미이다. 중요한 점은 추상클래스는 인스턴스를 생설할 수 없다. 또한 상속을 통해서 자식클래스에 의해서만 완성(구현)될 수 있다. 이렇게 함으로써 이 클래스를 사용할 때는 상속을 받아 구현을 해주어야 된다는 의미이다.

-추상클래스에는 하나 이상의 추상메소드가 있어야 한다. 추상메소드 앞에는 abstract 키워드를 붙여준다 

-클래스에 하나라도 추상 메소드가 포함되었다면 클래스도 추상 클래스이므로 클래스명 앞에도 ‘abstract’키워드를 붙여야 한다.

 

추상메서드는 구현부가 없으므로 괄호{}대신 문장의 끝을 알리는 ';'을 적어준다. 상속받은 추상메서드 중 하나라도 구현하지 않는다면, 자식클래스 역시 추상클래스로 지정해 주어야 한다. 기본적으로 추상클래스를 작성할때는 우선 클래스 구조를 잡은 뒤 공통적으로 사용하는 메서드가 있을 경우 추출하여 부모클래스로 생성하는 것이 기본작성방식이다.

추상화 - 클래스간의 공통점을 찾아내서 공통의 부모클래스를 만드는 작업
구체화 - 상속을 통해 클래스를 구현 확장하는 작업

 



추상 클래스는 추상 메서드를 포함하고 객체화 할 수 없다는 점만 제외하고 일반 클래스와 다르지 않으며 생성자, 멤버변수와 일반 메서드도 가질 수 있다. 추상 클래스 자체로는 클래스로의 역할을 하지 못하며 객체를 생성할 수 없지만 새로운 클래스를 작성하는데 있어서 부모 클래스로서 중요한 역할을 갖는다.

메소드 오버라이드(override)와 유사해서 혼동하기 쉬우나 오버라이드는 안해도 상관없지만 추상 메소드는 자식 클래스에게 그 구현을 강요하는 기능을 한다.


 

1. 추상클래스는 실체클래스의 공통적인 부분(변수,메서드)를 추출해서 선언한 클래스

부모클래스의 메소드인데, 어짜피 자식에서 오버라이딩을 통해 그대로 쓰지않고 메소드를 재정의 할경우 부모 클래스의 메소드를 쓰면서 메모리를 낭비할 필요가 없으니 추상클래스로 만들어주며 본체가 없이 만들어 준다. 그리고 자식 클래스에서 반드시 사용하게 하는 것이다.

 

2. 추상클래스는 객체를 생성할 수 없다! 하지만 익명 클래스를 이용하면 만들수 있다. 

 

 

public abstract class Animal { // 얘도 추상 클래스로 만들어 줘야한다 추상메소드 갖고있으니깐 추상 클래스 : 추상메소드를 하나이상 갖고있는 클래스 abstract키워드사용
	 // 추상 클래스를 상속 받으면 추상 메소드를 반드시 구현해야만 하는 의무를 갖게됨.

	protected String name;

	public abstract void bark(); // 추상 메소드 : 몸통이 없는 메소드 추상이라는 의미로 abstract 붙여준다.
	// 추상 메소드를 하나라도 갖고 있으면 클래스도 추상 클래스가 되어야만 한다.

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

 

 

public class AnimalTest {
	public static void main(String[] args) {
		
		
		//6행부터 17행까지가 익명클래스(anonymous class) 이다 .
		Animal a=new Animal(){
			String 성별 = "여";
			String 크기 = "큼";
			String 품종 ="모름";
			public void bark() {
				System.out.println("짖어용");// 객체를 생성하면서 클래스를 정의하는 방법 ( 1회성 클래스를 구현) 
			}
		
			public String toString() {
				return super.toString();
			}	
		};    
   	}
}

 

 

 

 

 

추상 클래스 문법 

 

클래스 앞에 abstract 키워드를 붙이면 추상클래스이다.

public abstract class 클래스명{

  //필드

  //생성자

  //메소드

  //추상메서드

}

 

추상메서드도 메서드 리턴타입 앞에 abstract 키워드를 붙이면 된다.

[ public | protected ] abstract 리턴타입 메소드명(매개변수1, 매개변수2, ... );

 

 

 

 

 

익명클래스 (anonymous class) : 클래스 몸체는 정의 되지만 이름이 없는 클래스 

특이하게도 다른 내부 클래스들과는 달리 이름이 없다. 생성자도 가질 수 없으며 오로지 단 하나의 클래스를 상속받거나 단 하나의 인터페이스만을 구현할 수 있다. 

 

-> 1회용성 클래스   

 

익명클래스의 형식 

부모클래스 인스턴스 = new 부모클래스() {

};

상속받은 클래스가 재사용되면 모를까, 그냥 한번 쓰고 버려진다면 굳이 클래스 파일을 만들 필요는 없다. 이럴 경우에 바로 익명 클래스를 사용하면 된다.

 

부모클래스의 인스턴스를 생성하면서 중괄호{}를 넣고 그 안에 처리구문을 넣어주면 된다. 이때 부모클래스의 메소드를 오버라이드 해주면 된다. 그러면 해당 인스턴스는 익명클래스의 인스턴스가 되어 오바라이드된 메소드를 실행하게 된다. 이렇게 하면 일회성의 자식클래스를 매번 파일로 만들 필요없이 바로 사용하고 버리면 된다.

하지만 주의 사항이 있다. 익명클래스에 생성된 메소드나 필드는 익명클래스 밖에선 접근할 수가 없다.

반응형