🦁멋쟁이 사자처럼 15기/3월달 수업 내용 정리

멋쟁이 사자처럼 11회차 ( 03 / 12 )

코딩하는 하마 2025. 3. 12. 16:42

 

[ 학습목표 ]

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) {}
		
	}
}