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("스타를 구현한 클래스 ");
}
}
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{
예외 발생 여부에 상관없이 수행할 내용
}
//예외처리 하지 않은 경우
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("프로그램 종료");
}
}
'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 |