상속
: (자식 클래스의) 공통된 부분을 추출하여 부모 클래스를 만드는 것
→ 공통된 필드, 메소드를 가진 클래스를 만들고 작성된 코드를 자식들이 물려 받아 사용한다.
사용이유 : 코드 길이 감소, 코드 중복제거, 재사용 증가, 자식에 대한 일관된 규칙 제공
[일반클래스] 상속
: 부모 클래스도 객체로 만들 수 있어야 되는 경우
사용예시
부모
new 부모 ()
ex)갤럭시 22 클래스
자식
new 자식 ()
ex)갤럭시 22 울트라 클래스
[추상클래스] 상속
: 연관된 클래스의 공통점을 묶어두되 부모 클래스는 객체로 만들 수 없는 경우
+ 일부 미완성 클래스 (abstract 메소드 0개 이상 포함)
→ abstract 메소드가 없어도 클래스를 객체로 못만들게 하고 싶은 경우가 있음
ex)계산기 (+,-,*,/)
기본 기능을 가지고 있지만 이 것만 가지고는 쓸 때 없음
→ abstract 로 만들어서 객체 생성 막아둠
또는 의미적으로 객체가 되면 안되는 경우
ex) Biology - 생물 객체는 어떤 생물인가 ?
ex) Animal 클래스
동물 객체는 어떤 동물인가 ? eat(), breath() 는 어떻게 수행되는가 ?
→ 알 수 없지만 동물의 공통된 기능 명은 알고 있음.
좀 더 디테일하게 공부를 해보자 !
package edu.kh.poly.ex2.model.vo;
public abstract class Animal {
//추상 클래스(abstract class)
//1. 미완성 메소드(추상메소드)를 보유하고 있는 클래스
//2. (추상메소드는 없지만) 객체로 만들면 안되는 클래스
//필드
private String type;//종, 과 구분
private String eatType;//초식 육식 잡식
//생성자
//- 추상 클래스는 new 연산자를 이용해서 직접적으로 객체 생성은 불가능하지만
// 상속 받은 객체 생성 시 부모 부분이 생성될때 사용된다.
// == super() 생성자
public Animal() {
super(); //생략 시 컴파일러가 추가
}
public Animal(String type,String eatType) {
this.type =type;
this.eatType = eatType;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getEatType() {
return eatType;
}
public void setEatType(String eatType) {
this.eatType = eatType;
}
//toString() 오버라이딩
@Override //오버라이딩 되었음을 컴파일러에게 알려주는 어노테이션
public String toString() {
return type+ "/"+eatType;
}
//동물의 공통 기능 추출 = 추상화
//-> 동물은 공통적으로 먹고, 숨쉬지만 어떤 동물이냐 따라 그 방법이 다르다.
//--> 그럼 어떡하지 ?
//미완성 상태로 두어 상속받은 자식이 해당 메소드를 정의하도록 오버라이딩을 강제화 시킨다.
//(미완성 상태로 == 추상 메소드로 작성한다. )
//먹다
public abstract void eat();
//숨쉬다
public abstract void breath();
}
위에 코드 중 아래 두개는 출력된 값이 없는 미완성된 메소드로
Animal을 상속 받은 person 클래스에 가서 오버라이딩을 강제된다 !
*[인터페이스] 상속
ㄴ interface : 접점
: 연관성이 낮거나 없는 클래스들에게 공통된 기능을 제공할 때 사용
ex) 키보드, 마우스, 스캐너, 카메라,입력센서, 기울기 센서
→ 입력 장치 (각각의 용도는 다르지만 "입력"이라는 공통된 "기능명"이 있을뿐)
+ 모든 필드가 묵시적(암묵적) public static final
ex) public static final double PI = 3.141592;
/*public static final*/ int MAX_NUM =10000; 따로 쓰지 않아도 public static final 붙여 있다.
+ 모든 메소드가 묵시적으로 public abstract(추상메소드)
ex) /*public abstact*/ void input();// "input"이라는 이름을 자식에게 제공할 뿐 상세한 기능은
자식이 알아서 오버라이딩 해라
추상메소드임으로 오버라이딩이 강제화 된다!
∴ 추상화랑 뭐가 다르지 ? 라고 생각할 수 도 있지만, 용도가 다르다라고만 생각하면 된다.
[추상클래스] 상속 - 연관된 클래스 vs [인터페이스] 상속 - 연관성이 낮거나 없는
● 특징
: 클래스와 인터페이스는 동시 상속이 가능하고 인터페이스는 다중 상속 가능하다.
//(부)클래스 = (자)클래스 상속시에는 extends 사용 (추상 클래스도 포함)
//(부)인터페이스 = (자)클래스 상속시에는 implements 사용 (추상 클래스도 포함)
(참고) 인터페이스 활용 용도
default 메소드 : 상속 받은 클래스에 공통 기능 제공
ㄴ 자바의 함수 지향 언어 사용을 위한 메소드로 사용
+람다, 스트림에 사용 (현재는 너무 어려우니 나중에 확인해라)
+ Spring AOP Proxy 사용
예외처리
프로그램 오류 : 프로그램 수행 시 치명적 상황이 발생하여 비정상 종료 상황이 발생한 것, 프로그램 에어라고도 함
오류의 종류
1. 컴파일 에러 : 프로그램의 실행을 막는 소스 코드상의 문법 에러. 소스 코드 수정으로 해결.
2. 런타임 에러 : 프로그램 실행 중 발생하는 에러.
주로 if문 사용으로 에러 처리 (ex. 배열의 인덱스 범위를 벗어났거나, 계산식의 오류)
3. 시스템 에러 : 컴퓨터 오작동으로 인한 에러, 소스 코드 수정으로 해결 불가
오류해결방법 :
소스 코드 수정으로 해결 가능한 에러를 예외(Exception)라고 하는데
이러한 예외 상황(예측 가능한 에러) 구문을 처리 하는 방법인 예외 처리를 통해 해결
1.예외(Exception) : 소스코드의 수정으로 해결 가능한 오류
① UnChecked Exception : 선택적으로 예외처리
ㄴ RuntimeException과 자식 예외 지칭함
프로그램 수행 중 개발자의 코딩 실수 또는 사용자의 잘못된 값 입력으로 흔하게 발생할 수 있는 예외
예외처리 구문이 아니라 if문 같은 단순 코드로 해결 가능하기 때문에 예외처리 구문을 반드시 작성할 필요없음
② Checked Exception : 필수적으로 예외처리
ㄴ RuntimeException과 자식 예외를 제외한 나머지 예외
if문과 같은 단순 코드로 해결이 불가능하여 반드시 예외처리 구문을 작성해야하는 예외
try - catch 예외처리
try { } : 괄호 내부에 예외가 발생할 가능성이 있는 코드를 작성한 후 시도
catch(예외){ } : try 구문에서 발생한 예외를 잡아내서 처리하여 프로그램이 비정상 종료 되지 않도록 함
ㄴ 발생하는 예외 중 일부 예외는 try - catch 구문을 사용하지 않아도 예외상황을 방지 할 수 있다.
아래 예시를 보고 이해를 하자.
ㄴ 아래 코드도 if 문으로 예외상황을 방지 할 수 있다.
if (input2 != 2) {
System.out.println("결과 : " + input1 / input2);
} else {
System.out.println("infinity");
}
private Scanner sc = new Scanner(System.in);
ystem.out.println("두 정수를 입력 받아서 나누기 한 몫을 출력");
System.out.print("정수 1 입력 : ");
int input1 = sc.nextInt();
System.out.print("정수 2 입력 :");
int input2 = sc.nextInt();
try { System.out.print("결과 : "+input1/input2);
//예외가 발생할 가능성이 있는 코드 작성
}catch(ArithmeticException e) {
//try에서 던져진 예외를 catch문 매개변수로 잡음 / e는 변수
System.out.print("infinity");//
처리 코드,0으로 나누면 무한 / 자바에서는 너 0으로 못놔눠!
}
여러가지 예외에 대한 처리 방법
public void ex3() {
try {
System.out.println("입력 1 : "); //
int num1 = sc.nextInt();
System.out.println("입력 2 : "); //
int num2 = sc.nextInt();
System.out.println("나누기 결과 :" + num1 / num2); //
String str = null;
System.out.println(str.charAt(0));
} catch (InputMismatchException e) {
System.out.println("정수가 아닌 문자열이 입력되었습니다. ");
} catch (ArithmeticException e) {
System.out.println("0으로 나눌 수 없습니다. ");
} catch (Exception e/* 부모타입 참조 변수 */) {
System.out.println("뭔지는 모르겠지만 예외가 발생해서 처리함.");
}
}
위에 예제를 보자. 위에 예제는 3개의 예외가 나왔는데.
1. InputMismatchException 타입이 맞지 않은 오류
ㄴ 정수 입력을 받아야하는데 내가 잘못해서 +를 입력한다면 타입이 맞지 않아 오류를 발생하여 이러한 오류를
InputMismatchException 라고 한다.
2. ArithmeticException 산술적 오류
ㄴ 현실세계에서는 4 / 0 을 했을때 아! 못나눠! 라고 하고 끝이지만,
컴퓨터 세계에는 4 / 0 를 했을때 나눌거야 나눌거야 나눌거야 ... 하면서 무한 반복을 한다.
이러한 오류를 ArithmeticException 라고 한다.
3. Exception 모든 예외의 최상위 부모
ㄴ 이것은 모든 예외의 최상위 부모로 뭔지는 모르겠지만 예외가 발생하면 처리 해준다라는 뜻이다.
또한 이것을 쓸때는 주의할 점이 있는데, 최상위 타입의 클래스로 catch문을 작성할때 맨위에 쓰면
다형성 업캐스팅에 의해서 모두 예외처리를 하니, 위에 예외처리를 한다면 가장 밑에 작성해야한다.
try - catch -finally 예외처리
위에 try - catch랑 같지만 finally를 추가된 형태이다.
finally : try 구문에서 예외가 발생하든 말든 무조건 마지막에 수행
try {System.out.println(4 / 0); // 0으로 나누면 ArithmeticException발생
} catch (ArithmeticException e) {
System.out.println("예외 처리됨");
System.out.println(e.getClass());
// 어떤 예외 클래스인가 알려줌 class java.lang.ArithmeticException
System.out.println(e.getMessage());
// 예외 발생 시 출력된 내용 / by zero
System.out.println(e);// e.toString();
// 출력 결과 : java.lang.ArithmeticException: / by zero
e.printStackTrace();
} finally {
System.out.println("무조건 수행됨 ");
}
위에 코드에서 printStackTrace 란 !
: 코린이라면 항상 보는 빨간 내용을 출력하는 구문으로 예외가 발생하기전까지 모든 메소드 흐름을 출력하여 어디서 어떤 에러가 발생했는지 파악할 수 있어 자주 사용한다고 한다.
throws / throw 예외처리
throws : 호출한 메소드에게 예외를 던짐
-> 호출한 메소드에게 예외를 처리하라고 위임하는 행위
ㄴ 나몰랑! 예외 너가 처리해!
throw :예외 강제 발생 구문(현재 메소드에 예외를 던짐)
ㄴ 개발자가 의도적으로 예외를 발생시키는 것이다
왜 의도적으로 예외를 발생시키는 것일까 ?
바로 예외가 발생할 수 있는 코드가 있다는 것을 알리고 예외처리하라고 강요하여 발생가능한 예외들을 한번에 처리할 수 있도록 하는 것이다!
'ON > JAVA' 카테고리의 다른 글
17일 컬렉션 _ Set계열 (1) | 2023.05.11 |
---|---|
16일_ 컬랙션 List계열 및 향상된 for문 (0) | 2023.05.10 |
14일차_객체지향 복습 및 다형성/바인딩 (0) | 2023.05.04 |
13일차_객체지향_상속 (0) | 2023.05.03 |
12일차 객체지향에 대해서 복습 및 객체 실습 문제 (0) | 2023.05.02 |