IT/JAVA (17.12.18~)

11일차 JAVA(11)

만두토끼 2018. 1. 3. 11:23

1. Interface 

=> 추상 메소드와 final 상수 만을 소유한 개체

=> 스스로의 객체를 생성할 수 없음(추상 클래스와 공통점)

=> 추상 클래스와 다른점은 추상 클래스는 일반메소드와 인스턴스 변수를 가질 수 있음

=> 메소드 앞에 abstract 를 기재하지 않아도 추상메소드 

=>변수 앞에 final 을 기재하지 않아도 final 상수

=> 메뉴판이라고 생각, implements 한 클래스를 음식 이라고 생각

=> 메뉴판은 고객이 보는것, 음식은 주방장이 보는 것 


생성

calss 대신 interface


구현

상속 구문 위치에 implements 




2. 인터페이스 문법

1) 인터페이스로 추상클래스처럼 변수 선언 가능

2) 인터페이스로 선언한 변수에 인터페이스를 구현한 클래스의 객체 주소를 대입할 수 있습니다.

3) 인터페이스는 하나의 클래스에 여러개 구현할 수 있습니다. (다중상속X)

4) 인터페이스까지 상속가능 - extends 키워드 이용 


* 관습: 사용자가 만든 인터페이스를 implements 한 클래스 이름은 '인터페이스이름Imp'로 설정 


* final 클래스

 1) final 클래스

=> 상속을 할 수 없는 클래스

=> 시스템과 관련된 클래스

2) final 메소드

=> 오버라이딩을 할 수 없는 메소드

3) final 변수 

=> 값을 변경할 수 없는 변수

=> 변수의 상수화 

=> 관례상 이름은 모두 대문자


** 클래스를 상속할 때, 에러가 나는 경우

1) final 클래스를 상속받으려고 할때

2) 생성자가 private인 클래스를 상속 받으려고 했을때 document에 constructor가 없는 경우 입니다

3) 클래스나 인터페이스를 상속했는데 추상 메소드를 재정의하지 않은 경우, 추상 메소드 재정의 해주기

4) 상위 클래스에 default constructor가 존재하지 않는 경우: 생성자를 직접 만들어서 super()를 이용해서 생성자를 호출해주면 됩니다. 


package interfacetest;

public interface Star {

//abstract를 붙이지 않아도 추상 메소드

public void attack(); 

//fianl을 붙이지 않아도 변수는 fianl 변수 

//대문자를 쓰는게 관례 

public int AGE = 27; 

}


package interfacetest;

public class StarImpl implements Star {

  public StarImpl() {

// TODO Auto-generated constructor stub

}


@Override

public void attack() {

System.out.println("스타를 구현한 클래스 ");

}

}


package interfacetest;
public class Main1 {
public static void main(String[] args) {
//Start star = new Star(); 불가능 
Star star = new StarImpl();
star.attack();
System.out.println(star.AGE);
}
}




3.

1) Class: 동일한 목적을 위해 모인 메소드와 변수의 집합, 사용자 정의 자료형

2) Instance(객체): 클래스를 자료형으로 해서 메모리를 할당 받는 것

3) Method: 클래스 앞에 코드로 static 영역에 존재

4) Variable: 지역변수(메소드 안에 만들어지는 변수)

                클래스변수(클래스 영역에 생성), 

                Instance 변수( Heap 영역에 각자 만들어지는 변수)

5) Stack: 메소드를 호출할때 1M씩 별도로 할당받고 수행이 종료되면 소멸 




4. 내부(Inner) 클래스

=> 클래스 안에 존재하는 클래스

1) 종류

- 일반 

- static

- local 

- anonymous class(익명)

2) 일반 Inner 클래스

=> 클래스 안에 존재하는 클래스

=> 외부에서는 사용 못하는 클래스

=> 안드로이드의 이벤트 처리에서 이용 

3) static inner 클래스 

=> 내부 클래스에 static 변수가 있으면 일반 inner class 로 생성 못함

=> 그때는 inner class 앞에 static 추가 

4) local inner class

=> 메소드안에서 만든 클래스

=> 메소드 안에서만 사용할 수 있는 클래스 

5) anonymous class (익명 클래스)

=> 클래스나 인터페이스를 상속해서 사용해야하는 경우에 변도의 클래스를 만들지 않고 객체만 만들어서 사용


방법

new 클래스이름이나 인터페이스이름 ( ){

메소드 재정의

}

=> 상속받은 클래스를 만들고 객체를 생성한 것 


ex)

public abstract class T{

public abstract void call( );

}


T obj = new T( ){

@Override

public void call( ){

System.out.println("아이폰에서 전화걸기");

}

}

obj.call( ); 


=> 여러번 사용할 필요가 없고 한번 만 사용하기에 용의, 사용 후 바로 메모리에서 사라진다. 




5. 클래스 확인 

1) 사용하고자 하는 클래스를 찾으면 상속관계를 확인

=> 상위 클래스의 참조형변수에 하위 클래스 객체에 대입할 수 있습니다.


2) 클래스 앞에 final이 있는지 확인

=> 상속할 수 없는 클래스


3) abstract 가 있는지 확인

=> 상속을 받아야만 사용할 수 있는 클래스

=>객체 생성을 못합니다. ( new 를 할 수 없다,)


4) interface 인지 확인

=> implements 해서 사용

=> 객체를 생성 못함 


5) Filed Summary

=> static 변수: 클래스 이름으로 호출할 수 있는 변수 


6) Constructor Summary : 생성자

=> 객체를 생성할 때 new와 함께 호출하는 것

=> 생성자의 방법만큼 객체 생성 방법을 제공

=> 이 항복이 없는 클래스 

- abstract class or interface : 객체 생성 불가능하기 때문에

- 모든 method가 static 이 붙은 경우 : 객체 생성을 할 필요가 없기 때문에 

- 위 2가지 경우가 아닌 경우는 아래 method summary의 static 메소드 중에서 

        자신의 타입과 동일한 타입을 리턴하는 메소드를 이용해서 객체를 생성


7) Method Summary : 호출할 수 있는 메소드 목록

- static 이 있는지 없는지 확인

- static이 붙어있으면 클래스 이름으로 호출하고 static이 붙어있지 않으면 객체를 생성한 후 객체를 가지고    호출 

- 매개변수 확인 : 메소드를 호출할 때 매개변수를 확인해서 매개변수에 값을 정확하게 대입해야 호출

- 리턴타입(결과형): void 이면 아무런 동작도 할 필요가 없고 void가 아니면 결과를 변수에 저장한 후 이용 

8) 클래스 이름은 패키지 이름을 포함해서 호출해야 합니다.

    단 java.lang 패키지에 있는 클래스는 클래스 이름만으로 호출이 가능

    패키지 이름을 생략하고자 할 때는 import를 해야 합니다.

- 하나의 클래스만 import

   import 패키지이름.클래스이름

- 패키지의 모든 클래스를 import

   import 패키지이름.*




6. 오류와 예외

1) Error (오류) 

- 물리적오류 : 문법에 맞지 않아서 프로그램이 실행되지 않는 것 (반드시 수정)

- 논리적오류 : 문법에 문제는 없어서 실행이 되지만 결과가 이상 (디버깅을 통해서 수정)

* 디버깅 : 로그를 확인 or 테스트 프로그램 이용


**로그를 출력

=>어떤 값을 모니터나 파일에 출력하라는 의미입니다.

=>논리적인 오류나 예외를 찾을 때는 보통 모니터에 출력하고 운영중에 발생하는 예외는 파일에 기록합니다.


**이클립스에서 디버깅(메모리의 값 확인) 하기

=>확인하고자 하는 코드의 왼쪽 거터 부분에 브레이크 포인트를 설정합니다.

=>run 이 아니라 debug로 실행하면 됩니다.


2) Exception (예외)

- 문법적인 오류는 아니어서 프로그램이 실행은 되지만 특정 상황이 발생하면 프로그램이 중단되는 현상

- 예외의 종류

* 프로그래머가 어쩔 수 없는 예외: 메모리 부족, 하드웨어 고장...

* 프로그래머가 수정할 수 있는 예외: 0으로 나누기, NULLPointerException 등은 프로그래머가 예외처리를 이용해서 해결이 가능합니다.


3) Assert (단언)

- 특정 조건을 만족하지 않으면 프로그램을 중단시키는 것 




7. Java에서의 예외

=>Java에서는 예외도 하나의 객체로 취급

=>예외의 최상위 클래스는 Throwable이고 여기서 다시 Error 와 Exception으로 분할

=>Error는 프로그램을 중단시킬 수 있는 심각한 오류

=>Exeption은 Error 보다는 덜 심각한 오류입니다.

=>대다수 예외는 Exception의 하위 클래스로 표현합니다.


1) 자주 발생하는 예외

NullPointerException: 참조형 변수에 객체의 주소가 저장되어 있지 않은 상태에서 멤버를 호출하는 경우

ArrayIndexOutOfBoundsException: 컬렉션에서 없는 인덱스를 사용하는 경우

NumberFormatException: 숫자가 아닌 문자열을 숫자로 변경하려고 하는 경우

ClassCastException: 대입이 불가능한 객체의 주소를 변수에 대입하는 경우

ArithmeticException: 산술 연산 오류


2) 예외 클래스의 멤버

String getMessage(): 예외의 내용을 문자열로 리턴

void printStackTrace(): 예외가 발생하기 까지의 과정을 콘솔에 출력


3) 예외처리 방법

- 예외가 발생한 곳에서 처리

- 호출한 곳으로 예외를 넘겨서 처리


4) 예외처리를 하는 이유

- 문제가 발생한 곳을 찾아서 수정하거나 예외 내용을 기록하기 위해서

- 예외가 발생하더라도 프로그램을 계속해서 수행하기 위해서


5) 기본적인 예외처리 구문

try{

예외 발생 가능성이 있는 문장

}

catch(예외클래스 변수명){

try 절에서 예외 클래스에 해당하는 예외가 발생했을 때 처리할

내용

}

finally{

예외 발생 여부에 상관없이 수행할 내용

}

=>catch 나 finally는 생략가능한데 둘 다 생략할 수는 없습니다.
=>catch 구문은 예외클래스 이름이 다르다면 여러 개 작성 가능합니다.

6) catch 구문은 예외 클래스 종류 별로 여러 번 사용 가능하지만 상위 클래스 예외를 먼저 처리하면 안됩니다.
상위 클래스의 참조형 변수에 하위 클래스 객체의 주소를 대입할 수 있기 때문에 상위 클래스의 예외를 먼저 처리하면 하위 클래스 예외를 처리하는 부분은 도달할 수 없는 코드가 됩니다.

7) 예외의 강제 발생
throw new 예외클래스이름(메시지)

8) 예외의 처리를 호출한 메서드에게 전달해서 처리
메서드의 매개변수 다음에 throws 예외클래스이름
=>위처럼 메서드를 생성하면 예외클래스이름에 해당하는 예외가 발생하면 호출한 곳에서 처리해야 합니다.

Thread 클래스의 sleep(밀리초)이라는 메서드는 밀리초 동안 현재 프로세스를 중지시키는 역할을 해주는 메서드 입니다.

public static void sleep(long millis)
                  throws InterruptedException

=>이 메서드를 사용하는 곳에서 InterruptedException을 처리해 주어야 한다.


9) 프로그램에서 반드시 예외처리를 해야 하는 경우
- 입출력
- 데이터베이스 프로그래밍
- 네트워크 프로그래밍
=>위 3가지 프로그래밍은 외부 자원을 사용하는 프로그래밍이라서 외부 자원이 없을 수도 있기 때문에 예외 처리를 강제합니다.

10) try - catch - finally는 별도의 블럭으로 간주하기 때문에 각 블럭에서 생성한 변수를 다른 블럭에서 사용할 수는 없습니다.
이런 이유로 finally에서 사용할 변수의 선언은 try 구문 바깥에서 합니다.


//예외처리 하지 않은 경우

package exception;

public class Main1 {


public static void main(String[] args) {

// 10+30 * 2 + 50 

int r = 10+30;

r = r*2;

r = r+50;

System.out.println("r: "+r);

}

}


//예외처리 적용

package exception;

public class Main2 {

public static void main(String[] args) {

try {

int a = 10;

int b = 0;

int r = a/b;

System.out.println("r: "+r);

}

catch(ArithmeticException e) {

//얘는 코드 순서가 Exception 아래에 쓰지 못한다. 

                        //왜냐면 Exception이 상위클래스이기 때문에 

}

catch(Exception e) {

System.out.println("예외발생: "+e.getMessage());

}

finally {

System.out.println("예외 발생 여부에 상관없이 무조건 수행");

}

System.out.println("프로그램 종료");

}

}


//다른 예외처리 예시
package exception;
public class Main3 {

public static void main (String[] args) throws InterruptedException
{
System.out.println("안녕하세요");
//3초간 중지
int a = 0;
try {
a=10;
Thread.sleep(3000);
}catch(InterruptedException e) {
System.out.println("예외발생: "+e.getMessage());
e.printStackTrace();
}
finally {
System.out.println(a);
}
System.out.println("프로그램 종료");
}
}


'IT > JAVA (17.12.18~)' 카테고리의 다른 글

13일차 JAVA(13)  (0) 2018.01.05
12일차 JAVA(12)  (0) 2018.01.04
10일차 JAVA(10)  (0) 2018.01.02
9일차 JAVA(9)  (0) 2017.12.29
8일차 JAVA(8)  (0) 2017.12.28