본문 바로가기
study_java/java_수강정리(~10.29)

[JAVA]17일차

by developer_j 2020. 6. 2.
728x90
반응형

< 17일차 수업 >

 

어제 수업에 이어서, 인터페이스와 비슷한 추상클래스를 배웠다.

먼저 예제를 연습하다가 발견 한 것들

0. Exception in thread "main" java.lang.ArrayStoreException

배열과 맞지 않는 데이터를 저장하려고 하면 이 에러가 발생 ㅡ 예를 들어 자료형이 맞지 않거나, 상속하는 클래스가 아닌 다른 객체를 저장하려고 하면 이 오류가 뜬다.

0-1. public String toString()

자바의 조상격 클래스인 Object의 함수는 오버라이딩 할 때 접근제어자 범위를 축소할 수 없다. Object 객체에서 접근 제어자를 public으로 지정해줬기때문에 (전체 공개를 원칙으로 하기때문에) 바꾸는 것을 허용하지 않는다. 


1. 추상클래스

 

추상클래스는 일반 클래스와 비슷하지만, 추상메소드를 선언해줄 수 있는 클래스이다. 추상 클래스는 상속을 통해 접근 및 사용을 할 수 있으며, 상속 역시 일반 상속처럼 extends 키워드를 이용한다. 추상 클래스는 추상 메소드가 없어도 에러가 발생하지 않지만, 추상 메소드가 포함되어 있는 클래스는 추상 클래스화가 되지 않으면(abstract 키워드가 붙지 않으면) 에러가 발생한다. 음.. 추상 메소드가 없는데 왜 추상 클래스로 선언해줄까? 

프로그램을 구성하다 보면, 단순 분류를 표시하는 것이 필요하기도 하다. 추상클래스나 인터페이스는 인스턴스를 생성할 수 없으니 이러한 목적에 부합하다 볼 수 있다. 


2. 인터페이스와 추상클래스의 차이

 

언뜻 보기에, 인터페이스와 추상클래스는 자식클래스에게 추상 메소드를 구현하도록 한다는 점에서 비슷해보인다. 또한 무엇보다 둘 다 미완성 클래스이기때문에 인스턴스를 생성할 수는 없지만 참조변수의 자료형으로는 사용할 수 있다.

그러나, 이 두가지는 생성하는 "목적"이 다르다는 것이 중요하다.

추상 클래스는 일반적인 클래스와 목적이 같다. 단지 자식 클래스 별로 따로 정의할 함수가 있을 경우에 추상메소드를 선언하여 사용할 뿐이다. 일반 클래스처럼 인스턴스 변수와 메소드를 가지고, 추가로 추상 메소드를 선언해준다. 즉, 사용 목적이 좀더 클래스 구성에 가까우면 추상 클래스로 선언해주는 것이 맞다.

한편 인터페이스는 상수, 추상메소드, default 메소드, static 메소드로 이루어진다. 객체 생성보다는 자손들한테 반 강제로 구현하게끔 시키는게 인터페이스다. "강제"라는 점이 중요하다. 

+) 인터페이스는 추상클래스보다 개발 속도를 더 높여줄 수 있다. 추상클래스는 클래스 내용을 다 알고 제대로 파악해야 나머지 추상메소드의 목적에 따라 구현을 해볼 수 있겠지만 인터페이스는 그냥 추상메소드 정보만 있으므로 개발자가 알아서 구현 메소드 이름만 다시 사용해서 코드를 구성하면 되기 때문이다. 

 

//인터페이스 - 상수/추상메소드/static메소드/default메소드
interface IFCls{
	//추상 메소드
	void print();
	
	
	//static메소드
	static int methodIF1() {
		return 0;
	}
	
	
	//디폴트 메소드
	default int methodIF2() {
		return 0;
	}
}

//추상 클래스 - 인스턴스 변수/인스턴스 메소드/추상메소드
abstract class AbstCls{
	//인스턴스 변수
	int num = 10;

	
	//인스턴스 메소드
	int methodAbst() {
		return 0;
	}
	
	
	//추상 메소드
	abstract void smethod();
	
}

class Test00 extends AbstCls implements IFCls{
	//extends AbstCls implements IFCls 쓰자마자 Test00 에러
	//이유1 - The type Test00 must implement the inherited abstract method IFCls.print()
	//즉, 인터페이스의 함수를 빨랑 구현해라!
	//이유2 - The type Test00 must implement the inherited abstract method AbstCls.smethod()
	//즉, 추상클래스에 추상 메소드가 존재하므로 해당 함수를 빨랑 구현해라!(추상 메소드가 없으면 이 에러가 뜨지 않음)
	
	
	//인터페이스의 print 함수
	@Override
	public void print() {
		System.out.println("interface - IFCls 의 print 함수 오버라이딩");
	}

	@Override
	void smethod() {
		System.out.println("abstract - AbstCls 의 smethod 함수 오버라이딩");
		
	}
}

 

테스트 결과 :

1. 추상 클래스에 생성자가 있더라도 인스턴스 생성이 불가능하다.
   오류 : Cannot instantiate the type AbstCls = 추상클래스형은 인스턴스화 할 수 없습니다.
2. 추상클래스의 멤버들은 상속으로만 접근 및 사용할 수 있다.
3. 추상 메소드가 없더라도 추상클래스는 인스턴스 생성이 불가능. 


결론 : 클래스가 abstract 붙으면 무조건 인스턴스화 불가능

 

728x90
반응형

'study_java > java_수강정리(~10.29)' 카테고리의 다른 글

[JAVA]18일차  (0) 2020.06.03
[JAVA]16일차  (0) 2020.06.01
[JAVA]15일차(2)  (0) 2020.05.31
[JAVA]15일차  (0) 2020.05.31
[JAVA]14일차  (1) 2020.05.31