[ 학습목표 ]
1. 클래스와 상속을 활용하여 코드 재사용성을 높이고 , 다형성을 적용하여 유연한 프로그램 구조를 설계할 수 있다. 2. 추상 클래스와 인터페이스의 개념과 차이를 이해하고, 각각의 용도와 특징을 설명할 수 있다. 3.프로그램 실행 중 발생하는 예외를 try-catch-finally 블록을 활용하여 효과적으로 관리할 수 있다. |
추상화
추상 메소드가 없어도 추상 클래스를 만들 수 있다.
추상 메소드가 있든 없은 객체를 생성하지 않겠다는 의미임 ( new My() 객체 생성 안함 ) -> 후손이 클래스 메모리를 할당해주길 부탁
부모 클래스는 abstract를 하던가 재정의를 하던가 , 자식 클래스도 abstract를 하던가 재정의를 해야함
1) 추상 클래스를 상속 받은 후손 클래스는 추상 클래스의 추상 메소드를 반드시 정의해야 함
2) 재정의 하지 않으면 추상 클래스가 된다 -> new 객체 생성 불가능
ex01)
abstract class My { // 추상 메소드가 있든 없든 객체를 생성하지 않겠다는 의미임 , new My()
public void prn() {
System.out.println("나 추상의 멤버얌 My's Prn ");
}
public abstract void disp(); // 추상 메소드, { }가 없는 선언만 되어 있는 추상 메소드
}
class myTest extends My {
@Override
public void disp() {
System.out.println(" 그래 난 강제로 정의한 myTest's disp");
}
}
public class AbsTest {
public static void main(String[] args) {
// My m=new My(); -> 추상 클래스는 new 객체 생성 불가능
myTest m = new myTest(); // My() , myTest()
m.prn();
m.disp();
My res = new myTest(); // My() , myTest()
res.disp();
res.prn();
}
}
My 클래스에서 자손 클래스인 myTest에 무조건 disp() 메소드를 명시하도록 public abstract void disp();로 강제해 놓았다.
ex02 )
위 그림의 메소드 호출하는 방법
1)
ABC a = new XX();
a.prn();
a.disp();
2)
ABC b = new YY();
b.prn();
b.disp();
3)
XX c = new XX();
c.prn();
c.disp();
4)
YY d = new YY();
d.prn();
d.disp();
5)
public clas MTest{
public static void view( ABC obj )
{
// 하나의 부모타입을 XHDOG 여러 자식 객체를 참조할 수 있도록 하는 개념
//메소드를 오버라이딩 해서 실행 시점에서 객체의 실제 타입에 따라 적절한 메소드가 실행되도록 한다 [동적바인딩]]
//-> “:return”을 붙여놓은 것
obj.disp();
obj.prn();
}
public static void main(String[] args) {
ABC a = new XX(); //
a.prn();
a.disp();
ABC b = new YY();
b.prn();
b.disp();
view (a);
view(b);
}
}
6)
public class MTest {
public static void view ( ABC obj) {
switch (obj) {
case XX xx-> {
xx.disp();
xx.prn();
}
case YY yy-> {
yy.disp();
yy.prn();
}
default -> System.out.println("알 수 없는 타입이야");
}
}
public static void main(String[] args) {
ABC a = new XX();
ABC b = new YY();
view (a);
view(b);
}
}
인터페이스
static final = 상수 , abstract 메소드 , default , static 메소드
interface -> 생성자가 없다 , new 할 수 없다. , 다중 구현한다.
ex)
public interface IAA {
//static final 상수
int a = 10; //반드시 초기값을 주어야 함 -> public static final int a = 10;
public static final int b = 20;
//abstract 메소드
void prn();
public abstract void disp();
default void view() { //재정의 가능
System.out.println(a);
}
static void view02() { //한 번만 호출 가능
System.out.println(a);
}
}
다형성
여러 개의 클래스가 같은 메소드에 대해 서로 다른 방식으로 작동할 수 있도록 설계함
하나의 데이터 유형 변수를 여러 유형의 객체 참조 가능
오버로딩과 오버라이딩을 통해 구현 가능
- 오버로딩 : 메소드명은 같지만 매개 변수 , 매개변수 타입 등이 다른 것
- 오버라이딩 : 상속이 일어나야함 사용되는 것
예외 처리
예외처리 -> 어떤 경우에 의해 실행 시 발생하는 프로그램 중단을 강제종료하지 않도록 처리하는 것
1) try ~ catch : 예외를 직접 처리하는 구문
2) finally : 예외 발생 유무와 관계 없이 실행됨 -> 무조건 실행되는 코드를 작성 / close() : 파일닫기, 리소스 객체닫기, 자 동 로그아웃
3) throws : 메소드 뒤에 선언되며 호출하는 곳으로 예외처리 위임
4) throw : 예외 클래스를 명시 실행
5) try ~ witch ~ resources (jdk7+) : finally 없이 자동 리소스 해제
case 1:
try {
예외가 발생될 코드
} catch(Exception e) { }
case 2:
try{
} //후손 -> 선조로 차례대로 호출하기
catch(ArithmeticException name ) {
} catch(RunTimeException name ) {
} catch (Exception name ) {
}
case 3:
try{
} finally { }
case 4:
try{
} catch(ArithmeticException name ) {
} catch(RunTimeException name ) {
} catch (Exception name ) {
} finally {
try{
} finally { }
}
case 5:
java.lang.AutoCloseable
java.io.Closeable
try(FileReader fr = new FileReader(path)) {
}
======================
FileReader fr = null;
try {
fr = new FileReader(path);
} catch( Exception name) {
} finally {
fr.close();
}
ex) try ~ catch ~finally
public class a_Test {
public static void main(String[] args) {
int a = 100;
int b =0;
int res = 0;
try {
res = a / b;
}catch(ArithmeticException e) { // new java.lang.ArithmeticException("/ by zero");
b = 2;
System.out.println("예외처리 완료 : "+e.getMessage());
} catch ( RuntimeException r) {
System.out.println("또 다른 경우 RuntimeException");
} catch ( Exception ec) {
System.out.println("또 다른 경우 Exception");
} finally {
System.out.println("반드시 수행해야 할 구문");
}
System.out.println(res);
}
}
ex ) throws
public class b_Test {
public static void prn() throws ArithmeticException {
//코드 만줄 작성
throw new ArithmeticException(); //명시로 예외 발생
}
public static void prn01() throws ArithmeticException {
prn();
}
public static void prn02() throws ArithmeticException{
prn01();
}
public static void main(String[] args) {
try {
prn02();
}catch(ArithmeticException e) {}
}
}
'🦁멋쟁이 사자처럼 15기 > 3월달 수업 내용 정리' 카테고리의 다른 글
멋쟁이 사자처럼 12회차 ( 03 / 14 ) (0) | 2025.03.14 |
---|---|
멋쟁이 사자처럼 12회 ( 03 / 13 ) (0) | 2025.03.13 |
멋쟁이 사자처럼 10회차 ( 03 / 11 ) (0) | 2025.03.11 |
멋쟁이 사자처럼 9회차 ( 03 / 10 ) (0) | 2025.03.10 |
멋쟁이 사자처럼 8회차 ( 03 / 07 ) (0) | 2025.03.07 |