3. 1) 개괄내용(1)
1 상속
Inheritance 부모클래스의 멤버를 자식클래스에 물려줌
클래스 상속 class 자식클래스 extends 부모클래스{;}
상속제한 1개의 부모클래스만 상속할 수 있다.
부모생성자호출 public DmbCellPhone(){super();}
매소드 재정의
(OverRiding)
상속된 메소드를 자식클래스에서
수정하는 메소드 오버라이딩 기능.
메소드 오버라이딩
주의점
부모 메소드와 동일 시그니쳐로 재정의.
접근제한을 더 강하게 오버라이딩 불가.
새로운 예외를 throws불가.
부모메소드호출 super.method();
final클래스 상속불가한클래스(자식클래스확장불가)
final메소드 오버라이딩이 불가한 메소드
4. 2) 개괄내용(2)
1 상속
Protected 접근 제한자
부모클래스의protected멤버는
자식생성자의 super()키워드로 호출가능.
자동타입변환
(Promotion)
부모클래스 변수 = 자식클래스타입;
다형성 부모클래스의 타입변환 허용으로 구현
필드의 다형성 각객체가 다른객체로교체될수있도록지원
매개변수의다형성
매개변수에 자식타입객체를 지정하여구현.
Vehicle veh=bus;
강제 타입 변환(Casting) 자식클래스 변수=(자식클래스)부모클래스타입;
강제타입변환 응용
자식타입이 부모타입으로 자동변환되면 부모타입의 필드와 메
소드만 사용가능.
자식타입 선언 필드와 메소드가 필요하면 강제 타입변환으로
자식타입으로 재변환하여
자식 메소드와 필드를 사용.
객체타입확인(instanceof)
객체확인을위해 사용.
Boolean result=객체instanceof타입;
5. 3) 추상클래스
1 상속
개요 abstract는 클래스의 공통 특징을 추출한 클래스
용도
실체 클래스의 공통된 필드/메소드이름 통일.
실체 클래스 작성 시간 절약.
선언 public abstarct class AbtractClass{;}
실체클래스상속 public class RealClass extends AbClass{;}
7. 5) 인터페이스(2)
1 상속
정적메소드
자바8부터 작성가능,
디폴트 메소드와 달리 객체없이
인터페이스만으로 호출 가능.
상수필드선언
public static final int val=1;
public interface RemoteControl{
public int MAX=10; public int MIN=0;}
추상메소드선언 public abstract int remoteMethod(int a);
디폴트메소드선언 public default int defualtMethod(int a);
정적메소드선언 public static int staticMethod(int a);
인터페이스 구현
객체는 인터페이스에서 정의된 추상메소드와
동일한 시그니쳐의 메소드를 가져야함.
이를 인터페이스의 구현(implement)객체라
하며, 구현객체를 생성하는 클래스를 구현
클래스라고 함.
구현클래스
public class 구현클래스 implements InterfaceClass{
//실체메소드선언;}
메소드제한 인터페이스의 모든 메소드는 public접근제한
8. 6) 인터페이스(3)
1 상속
익명구현객체
자바소스파일작성없이 구현객체를 만들수있음
인터페이스 변수 = new 인터페이스(){
//인터페이스 선언된 추상메소드의 실제 메소드 선언;}
다중인터페이스
구현 클래스
객체는 다수의 인터페이스 타입으로 사용할 수 있다.
인터페이스A와 B가 메소드를 호출할 수 있으려면 두
인터페이스를 모두 구현되어야 하며, 다음과 같이 작성되어야함.
Public class 구현클래스명 implements
인터페이스A, 인터페이스B{
//인터페이스A와 B에 선언된 추상메소드의 실체 메소드 선언}
인터페이스사용
RemoteControl rc;//rc는 인터페이스
rc=new TV();
rc=new Audio();
추상메소드사용
RemoteControl rc;//rc는 인터페이스
rc=new TV();
rc.turnOff();//TV의 turnOff()실행
디폴트메소드사용
RemoteControl rc;//rc는 인터페이스
rc=new TV();
rc.setMute(true);
9. 7) 인터페이스(4)
1 상속
정적메소드사용 RemoteControl.changeBattery();
자동타입변환(예) 인터페이스 변수=구현객체
필드의다형성(예) Tire[] tires={ new Htire(), new Htire()};
강제타입변환
상속관계의 부모/자식클래스간 자동타입변환과
같은 맥락으로, 구현클래스로 강제타입변환을
함으로써 구현클래스의 필드와 메소드를
사용할 수 있다.
구현클래스 변수=(구현클래스)인터페이스변수;
객체타입확인
(instanceof)
if(vehicle instanceof Bus)
{Bus bus=(bus)vehicle;}
상속 예시
(다중상속가능)
public interface 하위인터페이스 extends
상위인터페이스1, 상위인터페이스2{;}
디폴트메소드
필요성
기존인터페이스 확장 및 기능 추가.
디폴트메소드를
가진 인터페이스
상속 방법
디폴트 메소드를 단순 상속.
디폴트 메소드를 재정의.
디폴트 메소드를 추상메소드로 재선언.
11. 2 Memory II
1)RDA[Runtime Data Areas](1)
개요
JVM이 프로그램을 수행하기 위해 OS로부터 할당 받은 메모리 공간
구성(5가지)
thread별로 존재 - PC Registers, JVM-Stacks,
NativeMethod Stacks
모든 thread가 공유(동기화이슈) - Method Area, Heap
PC Register
Thread가 생성될때마다 생성.
Thread가 어떤명령을 실행하게 될지를 기록.
JVM-Stack의 Operand를 저장.
Method
Area
클래스 사용시에 클래스 저장.
클래스 변수(인스턴스변수)도 Method Area에 함께 생성.
new연산자로 클래스생성 후 메소드 실행시에 클래스 저장.
Type정보, Runtime Constant Pool, 필드정보, 메소드정보, 클래스 변수(static 변수) 저장
12. 2 Memory II
2)RDA[Runtime Data Areas](2)
Heap
인스턴스가 생성되는 공간.
객체를 동적 생성하면 인스턴스가 Heap에 할당 됨.
레퍼런스 변수는 Heap에 포인터가 저장됨.
GC의 대상이 되는 영역.
JVM-Stacks
Thread제어를 위해 사용되는 공간.
Thread마다 하나씩 생성됨.
단일 Thread마다 method가 호출될때 메모리 할당(push).
Method가 종료되면 메모리 반환(pop).
Method가 호출되면 method와 method정보가 stack에 적재.
Method호출이 종료되면 stack point에서 제거됨.
Method정보는 매개변수/지역변수/임시변수/어드레스 등을 포함.
각 스레드는 각각의 스택을 가지나, Heap은 공유.
때문에, Heap은thread-unsafe.
Native
Method
Stacks
자바 외 언어에서 제공하는 method나 lib(DLL, conf등)파일을 저장.
JNI를 통해 표준과 가까운 방식으로 구현 가능.
13. 2 Memory II
3) 동적로딩
개요
java구동시 모든 코드가 JVM에 링크됨.
클래스는 참조되는 순간 동적으로 JVM에 링크되고
메모리에 로딩됨.
ClassLoader
동적 클래스 로딩은 ClassLoader를 통해 이루어짐.
기본 클래스 로더는 java.lang.ClassLoader
JVM이 구동되면, 부트스트랩 클래스 로더가 생성됨.
로드타임
동적 로딩
하나의 클래스를 로딩하는 과정에서 동적으로 필요한 클래스를 로딩.
(load-time dynamic loading)
런타임
동적 로딩
클래스를 로딩할 때가 아닌 코드를 실행하는 순간에 클래스를 로딩.
(run-time dynamic loading)
14. 2 Memory II
4) 중첩클래스, 중첩인터페이스
개요 특정클래스와 관계를 맺는 관게클래스를 내부에 선언
장점
두 클래스의 멤버를 서로 쉽게접근, 외부에는 관계클래스를 감춰서
코드 복잡도를 낮춤.
인스턴스
멤버클래스
class A{ class B{ ; } }
//A객체생성해야 사용가능한 B중첩클래스
정적
멤버클래스
class A{ static class B{ ; } }
//A클래스로 바로 접근 할 수 있는 B 중첩 클래스
로컬클래스
class A{ void method() { class B ; } }
//method()가 실행할때만 사용할 수 있는 B중첩 클래스
형태
멤버클래스 : A$B.class
로컬클래스 : A$1B.class
접근제한
인스턴스멤버클래스 - 바깥클래스 인스턴스 필드초기값/메소드생성:O
정적필드 초기값/정적메소드 객체생성 :X
바깥클래스의 모든메소드/필드접근 :O
정적멤버클래스 - 모든 필드 초기값/정적메소드 객체 생성 :O
바깥클래스 정적필드/메소드 접근 :O
인스턴스 필드/메소드 접근 :X
로컬클래스 - final의 매개변수와 로컬변수만 사용
바깥클래스참조얻기
중첩클래스 내부에서 바깥클래스참조는 바깥클래스.this.필드||메소드();
중첩클래스 내부에서 중첩클래스 참조는 this.필드||메소드();
15. 2 Memory II
5) 프로세스와 스레드(1)
프로세스 실행중인 프로그램,자원,스레드로 구성
쓰레드
프로세스 내에서 실제 작업 수행. 모든 프로세스는 하나 이상의
쓰레드를 가지고 있음.
싱글쓰레드 프로세스: 자원+쓰레드, 하나의 쓰레드가 2개이상 작업처리
멀티쓰레드 프로세스=자원+n개의 쓰레드, 쓰레드와 작업이 1:1
- 단순히 CPU만 사용하는 연산작읍은 작업전환에 시간이 걸리지 않는
싱글쓰레드가 효율적.
- CPU이외의 자원을 사용하는 작업의 경우 멀티쓰레드 프로세스가
더 효율적
멀티쓰레딩
하나의 프로세스내에서 여러 쓰레드가 동시작업.
CPU사용율 향상
효율적 자원사용
사용자 응답성 향상
작업분리
동기화/교착상태 이슈
각 쓰레드가 균등한 부하를 갖도록 지향해야 함.
쓰레드 그룹
서로 관련된 쓰레드를 그룹으로 묶어서 제어.
쓰레드 그룹에 다른 쓰레드 그룹 포함 가능.
자신이 속한 쓰레드 그룹과 하위 쓰레드 그룹은 변경가능. 그외 불가.
모든 쓰레드는 반드시 하나의 쓰레드 그룹에 포함.
쓰레드 그룹을 지정하지 않고 생성된 쓰레드는 메인쓰레드 그룹에포함
쓰레드를 쓰레드 그룹에 포함시키려면 thread 생성자 사용.
16. 2 Memory II
6) 프로세스와 스레드(2)
데몬 쓰레드
non-daemon 쓰레드(일반쓰레드)의 작업을 돕는 보조역할.
일반 쓰레드가 종료되면 자동 종료.
GC, 워드 프로세서의 자동저장, 자동 화면갱신등에 사용.
무한루프와 조건문으로 실행 후 대기하다가 특정 조건이 만족되면
작업수행하고 다시 대기하도록 작성됨.
boolean isDaemon():쓰레드가 데몬인지 확인.
void setDaemon(boolean on)스레드를 데몬쓰레드로 또는 사용자 쓰레드로 변경. 매개변수
가 true이면 데몬쓰레드로 변경.
setDaemon()은 반드시 start()호출 전 실행되어야 함.
쓰레드
생명주기
17. 2 Memory II
7) 프로세스와 스레드(3)
반환형 메소드 설명
void interrupt()
sleep()이나 join()에 의해 일시정지
상태인 쓰레드를 실행 대기 상태로
만든다.
해당 쓰레드에서는 InterruptedException이 발생함
으로써
일시정지상태를 벗어나게 된다.
void join()
지정된 시간동안 쓰레드가 실행되도록 한다.
지정된 시간이 지나거나 작업이 종료되면 join()을
호출한 쓰레드로 다시 돌아와 실행을 계속한다.
void join(long millis)
void join(long millis, int nanos)
void resume()
suspend()에 의해 일시정지상태에
있는 쓰레드를 실행대기상태로 만든다.
18. 2 Memory II
8) 프로세스와 스레드(4)
static void sleep(long millis) 지정된 시간(천분의 일초 단위)동안
쓰레드를 일시정지시킨다.
지정한 시간이 지나고 나면,
자동적으로 다시 실행대기상태가 된다.static void sleep(long millis, int nanos)
void stop()
쓰레드를 즉시 종료시킨다.
교착상태(dead-lock)에 빠지기 쉽기
때문에 deprecated 되었다.
void suspend()
쓰레드를 일시 정지시킨다.
resume()을 호출하면 재개된다
static void void yield()
실행 중에 다른 쓰레드에게
양보(yield)하고 실행대기상태가 된다.
반환형 메소드 설명
19. 2 Memory II
9) 프로세스와 스레드(5)
상태 설명
NEW 쓰레드가 생성되고 아직 start()가 호출되지 않은 상태
RUNNABLE 실행 중 또는 실행 가능한 상태
BLOCKED
동기화블럭에 의해서 일시정지된 상태
(LOCK이 풀릴 때 까지 기다리는 상태)
WAITING,
TIMED_
WAITING
쓰레드의 작업이 종료되지는 않았지만 실행가능하지 않은(unrunnable)
일시 정지상태, TIMED_WAITING은 일시정지시간이 지정된 경우를 의미
TERMINATED 쓰레드의 작업이 종료된 상태
wait(), notify()
- 동기화의 효율을 높이기 위해 사용한다.
- Object 클래스의 정의되어 있으므로, 모든 객체에서 호출이 가능하다.
- 동기화 블록내에서만 사용할 수 있다.
- wait() : 객체의 lock을 풀고 해당 객체의 쓰레드를 대기상태로 둔다.
- notify() : 대기중인 쓰레드 중의 하나를 깨운다.
- notifyAll() : 대기중인 모든 쓰레드를 깨운다. 호출된 객체의 대기 중인 쓰레드만 해당 된다.
출처 http://gangzzang.tistory.com/m/post/75
21. 3 Exception
1) 예외
종류 일반(Exception) / 실행예외(Runtime Exception)
예외클래스
java.lang.Exception클래스를 상속받는 모든 클래스(java.lang.[ClassNotFound|Interrupted|Runt
ime|...]Exception)
실행예외 실행예외는 컴파일러가 체크하지 않음. 개발자가 예외처리코드를 삽입해서 처리.
NullPointer
Exception
java.lang.NullPointerException, 객체참조가 없는(null값을 갖는) 상태의 참조변수로 객체 접근
연산자를(.)을 사용시 발생
ArrayIndexOut
BoundsException
java.lang.ArrayIndexOutOfBoundsException, 배열 인덱스 범위 초과 사용시 발생
NumberFromat
Exception
java.lang.NumberFormatException, 문자열 등의 데이터를 숫자로 변경할때 발생.
Integet.parseInt(String s); Double.parseDouble(String s)를 사용해서 문자열을 정수와 실수로
변환하여 오류 수정.
ClassCastException
타입변환(Casting)은 상/하위 클래스 또는 구현클래스/인터페이스 간에 발생. 이 관계 외의 경
우에서 캐스팅 시 발생.
22. 3 Exception
2) 예외처리코드
형태 try-catch-finally
작성방법
try{
예외발생코드;
}catch ( 예외클래스 e){
예외처리;
}finally{
항상 실행되는 코드;
}
23. 3 Exception
3) 예외종류별 처리코드
다중catch try{;}catch(예외1 e){;}catch(예외2 e){;}finally{;}
catch순서 하위 예외 클래스부터 상위 예외 클래스 순서로 작성
멀티catch catch(예외1 e || 예외2 e){;}
자동 리소스 닫기
try-with-resources사용. close() 메소드로 안전하게 리소스를 종료
try{;}catch(예외 e){;}
finally{
if(fis!=null){
try{
fis.close();
}catch(예외 e){ ; } } }
예외 떠넘기기
예외발생시 메소드를 호출한 곳으로 예외를 넘김.
public int method2() throws ClassNotFoundException{ ; }//catch문에서처리
사용자정의 예외/예외발생 사용자 정의 예외 클래스 선언 ->예외 발생
사용자정의
예외클래스선언
예시
public class BalanceInsufficientException extends Exception{
public BalanceInsufficientException(){}
public BalanceInsufficientException(String msg){ super(msg);}
}
예외발생
throw new XXXException();
throw new XXXException("msg");
예외정보얻기
getMessage(), printStackTrace()를 이용.
catch(예외 e){
String msg = e.getMessage();
e.printStackTrace();}
25. 4 Wrapper Class
1) Wrapper(포장)클래스(1)
개요 기본타입의 값을 갖는 객체를 생성(기본타입값을 내부에 두고 포장)
박싱/언박싱 기본타입값을 포장객체로 만드는것을 박싱, 그 역을 언박싱이라고함.
기본타입 포장클래스 언박싱메소드
byte Byte num=obj.byteValue();
char Character ch=obj.charValue();
short Short num=obj.shortValue();
int Integet num=obj.intValue();
long Long num=obj.longValue();
float Float num=obj.floatValue();
double Double num=obj.doubleValue();
boolean Boolean bool=obj.booleanValue();
자동박싱 포장클래스타입에 기본값 대입될 경우 발생. Integer o=100;
자동언박싱 기본타입에 포장객체가 대입될 때 발생. int val1=Integer o=new Integer(1);
26. 4 Wrapper Class
2) Wrapper(포장)클래스(2)
기본타입 문자열을 기본타입 값으로 변환하는 메소드
byte num=Byte.parseByte("10");
short num=Short.parseShort("10");
int num=Integer.parseInteger("10");
long num=Long.parseLong("10");
float num=Float.parseFloat("10.0F");
double num=Double.parseDouble("10.0");
boolean bool=Boolean.parseBoolean("true");
포장값 비교
언박싱하여 비교하거나 equals()메소드를 사용하면 내부값을 비교하도록
오버라이딩 되어있음.