Develop/JAVA

0527 JAVA 아홉번째

포페PostFace 2022. 6. 1. 22:18

추상메서드

 

abstract void draw( );

{ } 일부러 중괄호를 통해 정의를 하지않고 마치기 위해서는

미완성이라는 의미로 메서드 앞에 abstract 를 붙여준다.

클래스 또한 abstract class로 만들 수 있다.

 

미완성 메서드를 가지고 있는 추상 클래스로는

객체를 만들수 없다.

 

자식클래스가 추상클래스를 상속받기 위해선

두가지 방법이 있는데

 

첫번째는 추상 클래스를 상속받는 자식 클래스도

추상 클래스로 만들어줘야한다.

그런데 상속받은 자식 클래스로도 객체를 만들 수 없게 된다.

 

이를 해결하기 위해서는 자식 클래스에서

부모의 미완성 메서드를 정의해주면 된다.

미완성 메서드를 정의해준다면 자식클래스는

완성됐기 때문에 abstract를 지워준다.

 

굳이굳이 왜 추상클래스를 만들고

미완성 메서드를 만들어서

자식클래스에게 상속을 하는 이유는

자식 클래스가 미완성 메서드를

주요 메서드로서 기능하는것을

빼먹고 넘아가는 실수를 막기 위해서다.

 

만약 자식클래스가 상속을 받지 않고

주요 메서드중 하나를 빼고 작성하면

아무 문제 없이 돌아가긴 하겠지만

넘어가면 찾기 힘들기 때문에

그걸 미연에 방지하기 위해 만들어서 사용해주는것이다.

 

인터페이스

 

class 자리에 interface를 쓰고 클래스처럼 만들 수 있다.

인터페이스 안에는 미완성된 메서드만 넣을 수 있다.

 

인터페이스를 상속받을땐

extends가 아닌 implements라고 써야한다.

 

인터페이스 안의 미완성 메서드는

자동으로 앞에 public abstract가 붙는다.

인터페이스를 상속 받은 클래스에서

메서드를 완성시켜 주려면 메서드 앞에 public을 붙여줘야한다.

 

인터페이스는 다중상속이 가능하다.

인터페이스를 상속받는 것을 구현한다고 표현한다.

상속과 같은 역할이긴 하지만 표현이 다르다.

 

인터페이스에는 미완성된 메서드만 들어가기 때문에

객체를 만들 수 없다.

인터페이스는 생성자를 가질 수 없다.

 

인터페이스에서 설정된 멤버변수는

구현된 클래스에서 값을 바꿀수 없다.

설정된 변수 앞에 final이 자동으로 붙어있기 때문이다.

 

상속은 하나만 받을 수 있지만

인터페이스는 다중구현이 가능하다.

또한 상속과 인터페이스를 같이 받을 수 있다.

 

우리가 흔히들 쓰는 데이터타입 String은

사실 클래스였다.

자신이 만든 클래스는 아니지만

자바를 만든 개발자들이 클래스를 만든것이다.

때문에 굳이 String 클래스를 만들지 않아도

해당 클래스 안에 있는 메소드들을 사용할 수 있다.

 

클래스타입의 객체를 만들때 참조변수를 알 수 없다면

null이라도 넣어야한다.

 

NullPointerException String

 

변수에 null로 설정하고 그 변수의 .length를

도출하려하면 이러한 에러가 나온다.

 

예외처리

실행타임에 에러를 처리하기 위해 사용한다.

1.

try { 실행할 문장}

catch (에러 형태 , 변수) { 에러가 났을시 실행할 문장}

 

try {
	String str=null;
	System.out.println(str);
	System.out.println(str.length()); 
	//NullPointerException
	System.out.println("예외처리");
	 //위의 에러때문에 여기까지 도달하지 못한다.
} catch(NullPointerException e) {
	System.out.println("에러 발생");
}

위의 문장을 실행하면 예외처리는 나오지 못하고 에러 발생이 도출된다.

에러가 발생하면 갑자기 에러 객체가 만들어진다.

에러가 발생하지 않으면 catch로는 들어가지 않는다.

 

catch( ) { } 이후 finally를 쓸수도 있는데

이 경우 에러가 발생하지 않으면

catch로는 들어가지 않고 finally가 실행된다.

 

프로그램 오류는 두가지가 있는데

컴파일에러와 런타임에러가 있다.

대표적인 컴파일 에러는 작성한 코드에 오타가 나거나

자료형을 잘못 체크하는 경우 발생한다.

 

런타임 에러는 실행할때 발생하는 에러다.

(예 배열을 넘기는 경우

 

런타임에러는 에러와 예외 두 가지로 구분하는데

에러는 프로그램 코드에 의해서 수습할 수 없는

심각한 오류 (예 메모리부족 등.

예외는 코드에 의해서 수습될 수 있는

다소 미약한 오류를 말한다.

 

에러명 변수.getMessage 메소드는

왜 에러가 났는지 알려준다.

.toString은 에러명과 이유를 알려준다.

 

catch는 각각의 오류에 대응할 수 있으므로

한개의 try에 여러개의 catch를 달아줄 수 있다.

그러나 가장 처음에 생긴 에러의 catch로 가므로

두번째 에러의 catch는 도달할 수 없다.

 

Exception

 

모든 에러의 상위 클래스

에러의 타입을 알 수 없거나

굳이 에러를 따로 설정해주지 않아도 된다면

에러변수를 Exception으로 정의해준다.

단, 다른 예외처리를 해야한다면 Exception은

가장 마지막에 써야한다.

 

2. throw

 

public class Ex07_04_예외처리 {

	public static void main(String[] args) {
		try {
			sub();
		} catch(ArithmeticException e) {
			System.out.println("main에서 예외발생");
		}
	}
	static void sub() throws ArithmeticException{
		int result =10/0;// new ArithmeticException
		System.out.println(result);
				
	}

}

이와 같이 어떠한 메소드에서의 에러를

main에서 처리하고 싶다면 메서드 뒤에 throw와

예외명을 붙임으로써 메인의

메서드 호출부분으로 떠넘길 수 있다.

떠넘겨 받은 선언부는 반드시 try,catch를 통해

예외처리를 해주어야 한다.

 

어떠한 랜덤한 수의 범위 지정하는법

 

0*100<=d,1*100

0.xxx<=d<99.xxx

0+1<=d<=99+1

1<=d<=100

(int)(Math.random()* ) +

 

int e=(int)(Math.random()*51)+30;

범위의 시작수를 A 끝수를 B로 가정하여 B -A+1을 곱할 숫자에 넣고 A를 더할 숫자로 넣는다.

'Develop > JAVA' 카테고리의 다른 글

0531 JAVA 열한번째  (0) 2022.06.01
0530 JAVA 열번째!!  (0) 2022.06.01
0526 JAVA 여덟번째  (0) 2022.06.01
0525 JAVA 일곱번째  (0) 2022.06.01
0524 JAVA 여섯번째  (0) 2022.06.01