프로그래밍/Java 정리

Java 11일차 -익명 클래스, 예외처리

윤도ri 2021. 11. 30. 17:17

>익명 클래스(anonymous inner class)
이름이 없는 클래스 

 

클래스 객체명 = new 클래스() {   };   <------ 익명 클래스:

 *노란색부분이 그대로 객체를 의미하기 때문에 부모 클래스에 자식 객체를 담는다는 의미

 

-익명 클래스는 앞에 있는 생성자의 클래스를 상속받고 있는 이름없는 자식 클래스이다. 또한 그 앞에 있는 생성자를 통해 만드는 객체 딱 하나만을 위한 클래스이다. 그래서 일회용 클래스이다. 

(오버라이딩이 가능하다는것은 상속관계에서만 가능하다는것을 의미한다)

-이 때 만들어지는 객체는 익명클래스 안에서 구현한 메소드 내용을 가지게 되고 이렇게 만들어지는 객체는

익명구현객체 라고 한다.

:만약 또한 안에있는 메소드를 쓰고 싶으면 또 다시 mycar2 식으로 다시 만들어주어야 한다. 

-자식 객체에 새로생긴 메소드는 담을 수는 있지만 사용할 수는 없다.

why? 자식객체를 부모클래스에 넣다= 업캐스팅 했다! 라는 의미

(업캐스팅하면 부모클래스에 있는 것과 오버라이딩된 메소드를 제외하고는 쓸 수 없다) 

---> 그러면 형변환해서 사용할 수 있지않나..?!!! 

but, 형변환할때 클래스의 이름이 필요하다. 근데 익명클래스는 이름이 없다. 그러므로 다운캐스팅이 

불가능하다. 

 

1.익명메소드의 예 

car 클래스 생성
보통은 car클래스를 생성후 ferrari로 클래스 또 생성해서 상속시켜준 후 오버라이딩 시켜야했다. 그런데 익명클래스가 있으면 따로 클래스 생성없이 중괄호 안에 오버라이딩될 메소드를 적어서 사용할 수 있다. car타입으로 mycar만들껀데 이름은 페라리이고 터치로 시동켜는 메소드를 갖고있는 객체이다라는 의미.

 

2.익명클래스로 인터페이스를 호출하는 방법

1.Cafe는 추상클래스로 상수와 추상메소드를 넣어둔다

 

2.바나프레소라는 카페에 메소드를 만든다. 이 때 매개변수를 cafe 타입의 c를 입력해줬다 가정하고 만들어야 한다.
여기서 호출할껀데 일단 바나프레소 클래스 타입으로 역삼 객체를 만들것이다 그러므로 생성자호출후 메소드를 써주면 되는데 문제는 Cafe c는 인터페이스인데 어떻게 받아올것인가?  일단 인터페이스이므로 구현을 해야한다. 그러므로 오버라이딩 해야하는데 객체를 전달해야하는데 어떻게 전달하지? 3. 정답은 익명클래스를 쓰는것이다. 여기서 오버라이딩 해준다.4. new Cafe(){} 이부분은 객체 그자체이기 때문에 그대로 안에 넘겨주면 된다.

 

--------------------------------------------------------------------------------------------------------------------------------->예외처리

 에러 : 심각한 오류  
 예외 : 덜 심각한 오류, 개발자들이 일부러 발생시키는 예외이다. 

 

syso(10/0)  출력하면 어떻게 나올까? 무한대?? 아니다.. 출력후 결과는 아래와 같다.

연산예외라는 뜻(0으로 나눴을때 예외 발생)

 컴퓨터는 인간이 시키는대로 수행하기 때문에 원래였으면 무한대로 계속 나누었을것이다. 근데 개발자는 이것을 막기위해 이 경우의 수를 예외로 지정한 것이다. 예외를 처리한다는것은 이 예외를 해결하는 것이 아니라 서비스 측면에서 사용자에게 정보(ex)0으로 나눌수 없습니다)를  주려고 만들어진 것이다. 

 

>예외처리문(try ~ catch ~finally)

try   {
      예외가 발생할 수 있는 문장
          ...
          }
catch(예외클래스 객체명){
       예외 발생시 실행할 문장

         }
        ...
finally  {
        예외 발생 여부에 상관없이 실행할 문장
          }

 

>Exception 클래스
:모든 예외들의 부모클래스 

예외는 보통 어디서 발생하는지 모름. 하지만 어떤 예외클래스를 제외하고싶은지를 알면 잡을 수 있음. 예를들어 고객이 10을 0으로 나누니 빨간줄이 생기네요 그러면 이제 아~ 이건 ArithmetricException 이라는 예외타입이구나. 오키  그러면 이 타입인 경우 나는 잡아서 0으로 나누지 못함을 알려줄것이야. finally는 예외발생 상관없이 함께 출력되게 된다.

1. 사용자에게 정수 2개 입력받아서 예외발생할 경우 처리하는 방법

 

1) Scanner 호출하고 num1,num2 받아준다

2) try로 묶는다 

3) 각각 오류클래스에 따라 catch로 받아주고 입력내용을 쓴다

4) 위의 오류를 제외하고 모든 오류를 포함하는 exception클래스가 있다(부모) 이곳에 알수없는 오류가 발생됨을 

   알려주기

5)오류클래스를 알고싶으면 사용자가 입력한 값을 물어본 후 출력해본다. 그러면 어떤 예외메소드인지 나온다. 

 ex) 10이랑 0 넣는데 오류가 발생했어요ㅠㅠ 

  --> 오 그렇군요 syso(e) 하면 java.lang.ArithmeticException  이라고 뜰것이다. 아 이 오류때문에 그런거구나!! 

  --> catch문을 만들어서 0으로는 나눌 수 없습니다 라고 써준다. 다시 알수없는 오류발생은 출력되게 해준다

       (사용자가 오류를 만날때마다 이 문장이 뜨면 우리가 또 다시 입력값 물어봐서 출력하고 예외메소드 찾고

      catch로 돌려주고 무한반복..)

6)한번 정수를 입력하면 끝나기 때문에 while문을 돌려준다.

7)while문은 try문을 감싼다.

8)그런데 여기서 이대로 끝내면 무한반복을 하게된다.

 why? 입력한 값이 그대로 유지되어 오류메소드 안의 내용이 계속 반복적으로 출력되기 때문이다 .그러므로 처음으로 돌아갈 필요가 있다. 

9)sc라는 객체가 생성되기 위해서는 스캐너를 안쪽에 써주거나 밖으로 빼준다.

 

>throws 

:메소드 선언부 내부에서 발생하는 예외를 무시하고 호출하는 곳으로 떠넘기는 문법
호출하는 곳에서 예외가 발생할 수 있기 때문에 try~catch로 잡아주어야 한다.

 


           리턴타입 메소드명() throws 예외1, 예외2,...{
                                     예외1,예외2, ... 무시하는 구역
                                        }

when?: 매번 try catch로 묶기 귀찮을 때, 예외처리를 다른곳에서 해줄 때 

     (거의 대부분 이미 throw를 넣어둔 메소드를 우리가 사용하는 것이기 때문에 throw자체를 쓰는것은 아니고 

      호출할때 try~catch로 잡아준다고 생각하면 된다)

 

예제1.throw 

 이해를 하기 어렵긴 하지만 throw가 왜 생겼는지 먼저 생각을 해보자. 먼저 나눗셈 메소드를 만들데 div(int num1, num2)를 쓰고 예외처리를 위해 if 문을 써준다. 0이면 ArithmeticException 메소드를 호출한것을 데려오고 

1이면 FileNotFoundException 을 호출하게 한다. 만약에 이 메소드안에서 오류를 처리하게 되면 애매해진다. 왜냐하면 보통 이 메소드를 우리가 호출해서 사용하는데 우리가 어떤 오류가 발생했을때 다른 내용을 쓰고 싶을 수 있다. 뭐 예를 들어 'ArithmeticException이 뜨면 0이 나오는구려 라고 하고 싶은데 메소드안에서 다 처리해버리면  불가능하다. 

그러므로 이 메소드를 던져(throw) 메인 메소드에서 잡는다(try catch)

 

 

----------------------------------------------------------------------------------------------------------------------------------

>API(Application Programming Interface)
-자바 시스템을 제어하기 위해서 자바에서 제공하는 명령어들을 의미한다. 선배 개발자들이 java에서 코딩을 쉽게 할 수 있도록 미리 만들어 놓은것들
-API의 종류는 굉장히 많고 다양하기 때문에 모두 외우는 것은 절대 불가능하다. 그렇기 때문에 처음 보는 API라도 설명과 이름, 매개변수 등을 잘 읽고 맞는 목적으로 잘 사용하는 방법을 알아야 한다. 

 

*API 이클립스로 가져오는 방법

1.API 다운받은것을 잘라내기 한 후에 resource 폴더에 넣어준다.

2.넣으려는 java project에 우클릭하여 build path > configure build path > libraries >external jars > 추가하고 확인 

3.이제 이 안에 있는 클래스 사용가능함. 클래스들 다 import 해주고 api 특성에 맞게 코드를 작성해준다. 끗!