java 강의자료 ed11

47

Click here to load reader

Upload: hungrok

Post on 19-Jul-2015

221 views

Category:

Software


3 download

TRANSCRIPT

Page 1: Java 강의자료 ed11

February 2015 ED1.1

HR Kwon ([email protected] )

IT 강의자료 Java 기본개념 (Basic Concepts)

Page 2: Java 강의자료 ed11

1

개정이력

ED 1.0 , January 2015

ED 1.1 , February 2015, 일부 내용 추가 명기 (Blue word)

Page 3: Java 강의자료 ed11

2

소개

소개

1) 객체 지향적 이며, Machine code dependency 가 없는 Programing Language 이다

Virtual Machine (JVM) 에 의하여 Machine code 로 변환이 되어진다.

2) 기본 Package + 확장 Package 로 구성

. Package 란 해당 Class 의 집합물 로서 각 기능 들을 크게 분류하여 일컫는 용어이다 (java.lang, java.util, java.net, java.math,,)

. 기본 Package 란 JVM Provider (SUN-Oracle) 가 제공하는 Package 이다

. 확장 Package 는 예를 들어, 방송용으로 사용하는 OCAP (MHP) 혹은 스마트폰 에서 사용되는 Android Package 를 의미한다

실행절차

Source (a.java)

Compiler (javac)

Byte Code (a.class)

ByteCode Verifier

Memory

Class Loader

Inter preter

CPU

JVM

Page 4: Java 강의자료 ed11

3

개발환경

JDK(Java Development Kit) 와 JRE (Java Runtime Environment)

. JRE 는 사전에 해당 Machine 에 Installed 되어야 한다, 설치는 http://java.com/ko/download/” 에서 진행한다

. JDK는 일반적으로 Eclipse IDE 를 사용한다 ( 사용하는 JRE 지정은 Window – Preferences – Java – Installed JRE’s)

. JRE Edition

SE : Standard Edition

ME : Micro Edition (CVM , KVM)

EE : Enterprise Edition

CDC : Connected Device Configuration (FP & PBP )

JDK

JRE

Target OS & Machine

. 기본 Packages

. JVM

. Library

. Editor

. Java Compiler

. Java Executor , Debugger

. Linux / Window

. ARM / MIPS / Intel

Page 5: Java 강의자료 ed11

4

JAVA 특징

객체 지향적 특징

. 상속 (Inheritance) : Class 간 단일상속 (Sub class 는 단 하나의 Super class 만 가진다)

. 다형 성 (Polymorphism) : Method 에 대한 Overloading 및 Overriding 적 특징

. Capsulation : 객체 의 Property 와 메소드 는 Class 내에 숨어있고, Getter 와 Setter 로서 객체는 통제된다.

일반적 특징

. Multi Thread 를 지원한다

. 자원 해제는 App 이 하는 것 이 아닌, JVM 이 지닌 Garbage Collector 에 의하여 해제된다

. Native Interface 를 지원한다

Language 적 특징

. 엄격한 Type Check 를 적용한다 (static type checking)

. Security 를 위하여 Pointer 사용이 안 된다

. 예외 (Exception) 처리 구문이 있다 : try{} catch {}

. Method overloading : 같은 Method 가 다양한 인자 를 지닐 수 있도록 다양화

. Class 사용 Pattern : Anonymous Class, Inner Class, Inner Method

C++ 비교

. C++ 보다는 사용하기 편하고, 완전한 객체지향 이다

. C++ 는 다중상속 가능

Page 6: Java 강의자료 ed11

5

객체 지향적

객체 정의

. 이름이 있는 여러 개의 데이터와 그 데이터 조작을 위한 Method 가 하나로 묶인 구조

. 실 세계 영역에 있는 유형적인 것 (정보,물건,사물,개체 ) 과 무형적인 것 (개념,방법) 을 표현한다

객체 지향적 (C++,Java Script)

. 비 객체 지향적 : 논리를 기반으로 동작을 중시 한다 - Button 을 예로 들면, 사용자의 요청에 의하여 형상 (모양,크기 및 색상) 을 그릴 수 있는 함수 (Function) 가 있다. 해당 함수는 호출되어 지면 그래픽으로 표현되어 보이지만, 눈으로 보이는 것일 뿐 실체적인 것은 없다

. 객체 지향적 : 자료를 기반으로 객체를 중시 한다 - 자료를 모델링 하고 이들 관계를 정의하는 모형 틀 을 지닌다 (class) - Button 이라는 Instance 객체가 만들어지고, 객체의 Property 를 통하여 형상을 정의 시키고, 객체의 method 를 통하여 형상을 그래픽으로 표현시키고, 객체에 대한 사용자 이벤트를 처리할 수 있다.

App

동작 (Function)

결과

drawButton (type,color,size,text)

test1

App

Instance 객체 (Button)

결과

. new Button

. Properties : type,color,size,text

. Method : draw(), clear()

. Event

test2

Class Button (객체모형)

Page 7: Java 강의자료 ed11

6

Class

정의

. Java 언어의 기본 구조(단위) 로서, 객체를 만들 수 있는 Type (형) 으로서 원형 틀 (원형객체) 역할을 한다

. class 자체 로서는 객체는 아니다.

. new 와 extend 를 통하여 원형객체는 Instance 객체 화 되어지거나 상속 화 되어진다

Class 의 용도 별 구분

(1) Application 일반용 : Java 로 작성된 일반적인 Application 용도, main() 을 지닌다

(2) Application Applet 용 : Web (HTML) 과 연결되어 실행되는 Application 용도 (ByteCode 가 서버에 존재한다)

(3) 서버용 Servlet : 통상 Web Server 에서 실행된다

(4) TV 방송용 App (Xlet) : MHP, OCAP 표준에 사용되는 Application

(5) 내부 Package 구성용 : Package 업체가 제공하는 JRE 내의 Package 용도

< Application 일반용 > public class HelloApp { public static void main(String[] args) { System.out.println(“Hello World “) ; } }

< Applet 용 > import java.applet.Applet ; public class HelloApp extends Applet { public static void main(String[] args) { System.out.println(“Hello World “) ; } }

Page 8: Java 강의자료 ed11

7

Class

Semantics

. [접근지정자] [final 속성] {class 종류} {class명} [implements] [extends]

. 접근지정자 는 2가지 가 있다 : public 과 비지정 이며, 비지정 은 default 를 의미한다

하나의 java 파일에 한 개 이상의 public class 가 불가능 하다 (Inner class 제외), default class 는 복수 로 가능하다

. final 속성은 상속이 불가능한 최종 구현체 class 임을 의미한다

. Class 종류는 3가지 가 있다 : class, interface, abstract class

. Class 이름은 고유 하여야 한다

. Implements 는 특정 interface 에 대한 구현체 class 임을 명기한다

. Extends 는 동일 종류간 상속 관계를 명기한다 (누가 super class 인가를 지정한다)

(1) Class 간은 단일상속 만이 가능하다

(2) Interface 간은 다중상속 이 가능하다

. 예

public class myClass1

public final class myClass2

public final class myClass3 extends A implements B

public interface myClass4 implements C

public abstract class cmyClass5 extends D

Page 9: Java 강의자료 ed11

8

Class 내부구성

Class 의 내부구성

. 4가지 로 분류되며, 선언 시 가장 앞서 접근 지정자 를 지닌다

. Class 멤버 (변수 및 메소드) 는 모든 Instance 객체가 공동으로 사용한다. . 객체멤버변수 와 멤버 Method 들이 Instance 객체와 상속의 대상이 된다 . 내부구성 예

package a.b.c ; // org.dvb.media import a.x.y.Test1 ; // 사용 (new) 대상 class , 같은 package 에서는 import 할 필요가 없다 public class Car implement InterfaceCar { // 1. Class멤버 변수 및 메소드 public static final int classvar1 ; // 상수변수 (상수필드 - static final) , 값은 변경할 수 없다 (ONEDAY = 24) public static int classvar2 ; // 정적변수 (정적필드 - static ) , 값을 변경할 수 있다 public static int MemberMethod5() {} ; // Static Method // 2. 객체 멤버변수 public int instvar1 ; private int instvar2 ; protected int instvar3 ; default int instvar4 ; default final int instvar5 ; // final 멤버변수 // 3. Constructor Method , Instance 객체 생성시 자동으로 호출되는 메소드 이다 , return type 이 없어야 하며, 없어도 가능하다 public Car() {} ; // 일반적인 constructor private Car() {} ; // 객체생성 (new instance ) 불가 from 다른 class // 4. 멤버 Method : Method 내부에 Static 변수를 지닐 수 없다 public void MemberMethod1() {} ; private void MemberMethod2() {} ; protected void MemberMethod3() {} ; default void MemberMethod4() {} ; }

Page 10: Java 강의자료 ed11

9

Class 내부구성

Class 의 메모리 공간

. Class 로드, 객체의 생성 에 따라 JVM Heap 공간에 위치한다

. 비 객체 영역을 static area 로 칭하며, static 의미는

전 객체가 공유하는 단 하나의 전역 영역 이며 객체화 대상이 아니고 GC 대상이 아님을 의미한다 (new 없이 Static Method 호출 가능하다)

. 객체영역을 GC area 로 칭하며, 객체의 사용이 완료되면, JVM 에서 소멸을 진행한다

. Method 내부의 지역변수는 Thread stack 영역에 위치한다

Stack 영역이란 지역변수, 매개인자, return 값, return PC (program count) 등 이 위치하는 휘발성 영역이다

public class Test { // Class (Static) 멤버 public static final KKK=10 ; public static abc = 20 ; public static method1() {} // 멤버 변수 public int ab1 ; public int ab2 ; // 멤버 메소드 public void method2(){ // } public void method3() { int local1 ; // 지역변수 A obj1 = new A ; } }

JVM Heap 비 객체 영역 (static area)

(PermGen 영역)

JVM Heap 객체 영역 (GC area)

1) 상수필드, 정적필드 ; Class 로드 시 2) Static Method ByteCode ; Class 로드 시 3) 일반 Method ByteCode ; Method 실행 시

생성된 객체 (객체의 멤버변수)

Access 가능 Access 불가

Thread Stack 영역

Method 내부(지역) 변수

Page 11: Java 강의자료 ed11

10

Class 내부구성

final, static 속성 정리

적용 설명

Final Class . public final class String extends Objects . 상속이 불가하다 (Sub class 를 지닐 수 없다, final class 를 extends 하면 ERROR) . java.lang 이 제공하는 내장 Class 는 대부분 final 속성을 지닌다

Method . public final String prn() . Final method 는 overriding 불가하다, 완전한 구현 Method 임을 암시한다

Variable . public final int abc =10; . 필드 (상수, 정적) 가 아닌 멤버변수 이다 . 선언 시에 한번만 대입 (assignment) 가능하다 . 멤버변수 이나 상수변수 (constant) 개념 이다

Static

Class . public static InnerClassA . Inner class 에서 static / non-static 속성을 나타낸다 static : Class 멤버 (메소드, 변수) 중에 static 이 있을때 반드시 사용, Static heap 사용 일반 static 메소드 처럼 new 없이 사용 가능하다 non-static : 일반 class 처럼 사용되어 진다. Outer 객체를 생성후에 Inner 객체를 생성한다

Method . public static int method1() . Class 멤버이다

. Class 로드 시 heap 에 탑재됨으로, new 없이 호출가능 하다

. 멤버변수 나 멤버 Method 를 access 할 수 없다

. 주로 멤버객체변수를 이용하지 않고 단순계산을 지니는 메소드 에 적용된다

Variable . public static int abc =10 ; . Class 멤버이다 1) 상수변수 (상수필드) : static , 변경 불가능 2) 정적변수 (정적필드) : static final , 변경 가능 . Class 로드 시 heap 에 탑재됨으로, Access 가능하다: myClass.NAME

Page 12: Java 강의자료 ed11

11

Class 객체화

객체화 방법

Class 에 대한 객체 생성 방법은 아래와 같은 세가지 방법이 있다

1) new (keyword) 를 통하여 객체생성 : Car mycar1 = new Car(“abc”) ;

2) Literal 적인 방법으로 객체생성 : String mycar2 = “xyz” ;

Literal 적인 방법은 일반적인 Class 는 안되고 (의문임 ?), Primitive data type (String,Integer,Character,Object,,) 들만 가능 하다

3) Class 를 동적으로 Loading 하여 객체 생성방법

. 해당 class 가 local machine 에 존재하지 않고, 서버에 존재하는 경우 이를 불러와 로딩하는 경우

. Class 이름을 모르는 경우 (이름을 어느 객체 로 부터 run-time 에 획득하여)

. Reflect 내장 class 를 이용하여 가능하며, 자세 내용은 Reflect 를 참고 한다

(1) Constructor 가 없는 경우 : Class 객체를 이용한다

(2) Constructor 가 있는 경우 : Class 객체 와 Constructor Reflect class 를 이용한다

public static void DynamicClassLoadTest(){ // Constructor 가 없는 경우 Class obj1 = Class.forName("a.b.c.NoConstructorClass") ; NoConstructorClass obj2 = (NoConstructorClass) obj1.newInstance() ; obj2.method1() ; // Constructor 가 있는 경우 Class obj3 = Class.forName("a.b.c.ConstructorClass") ; Constructor obj4 = obj3.getConstructor(String.class) ; // Arg.가 String 임으로 이리 지정한다 (하나만 있다고 가정) ConstructorClass obj5 = (ConstructorClass) obj4.newInstance("Korea") ; obj5.method1() ; }

Page 13: Java 강의자료 ed11

12

Class 객체화

객체화 new

. extend 는 Class 간 상속관계를 형성 시키며 (Super vs Sub) , 최종적으로 new 를 통하여 객체화 되어진다

. Extend – New Pattern

1) 단일 Class

2) Super Class : 일반

3) Super Class : Abstract

. Extend 와 객체화 를 통하여 Class 의 구성요소는 아래와 같이 공유 및 Instance 된다

Class 구성요소 객체생성 (new) Class 상속(extend)

상수필드, 정적필드 전 객체간 공유 (단 하나) 공유 및 확대 (추가)

객체 멤버 변수 Instance (독립된 멤버변수) 공유 및 확대 (추가)

멤버 메소드 전 객체간 공유 (단 하나) 공유, 확대 및 Overriding (대체)

Class A Instance 객체

Y

Y = new A

Abstract Class D

Class E

Instance 객체 Z

Z = new E extend D

Class 구성요소 (1) Class 멤버변수 (필드) (2) 객체 멤버변수 (3) Constructor (4) Method

Class B

Class C

Instance 객체 K

K = new C extend B

Page 14: Java 강의자료 ed11

13

Class 객체화

객체화 Literal 적 방법

. new 를 사용하지 않고 선언 및 초기값을 지정하면 JVM Heap 공간에 잡히는 Instance 객체는 만들어 진다

. new 와 차이점은 동일한 초기값을 지니면 기존의 객체를 동일하게 사용한다

(s7 는 reference 로는 존재하나, 새로운 객체가 아닌 s6 에서 만들어진 객체가 사용된다)

String 객체에 대하여 new 및 Literal 적용으로 생성 된 객체모습

public class MyApp1 { public static void main(String[] args) { String s1 = "AAA"; // Literal String s2 ; String s3 = new String("AAA"); String s4 = new String("AAA"); String s5 = s4 ; // 별도객체 아님 String s6 = “BBB” ; // Literal String s7 = “BBB” ; // 별도객체 아님 } }

Object os1

Object os3

Object os4

Object os5

JVM Heap

Reference Value

s1 * os1

s2 Null

s3 * os3

s4 * os4

s5 * os4

s6 * os5

s7 * os5

public final class String{ }

Thread Stack

Page 15: Java 강의자료 ed11

14

Class 유형

Class 유형 및 semantics

Class 는 아래 세가지 유형으로 구분 할 수 있다

(1) class ; 접근지정자 class class이름 extends A, implement B

(2) abstract class ; 접근지정자 abstract class class이름 extends A, implement B

(3) interface ; 접근지정자 interface 인터페이스이름 extends 상위인터페이스

. extends 는 같은 유형 간 (class 와 class, interface 와 interface 간) 상속 을 의미한다

. implement 는 class 가 적용하는 interface 를 의미한다

Class 유형별 세부특징 비교

구분 Class Abstract Interface 비고

Instance 객체화 (new) O X X new interface(){} 는 익명 Class Pattern 이지 Interface 에 대한 객체화 의미는 아니다

다중상속 (extend) X X O Interface 가 여러 Interface 를 상속 가능하다 Class 간에는 단일 만 가능하다

Static final (상수변수) O O O

정적변수 O O X

멤버변수 O O X

일반 메소드 O O X

추상 메소드 X O O

Page 16: Java 강의자료 ed11

15

Class 유형

접근 지정자

. Class 및 멤버변수 및 멤버 메소드 에 대한 접근속성 (접근 가능여부) 을 가져간다, 특정한 지정이 없으면 default 속성을 지닌다 . 접근 지정자 사용 예

지정자 Same class Same package Universe Sub class 정리

public Yes Yes Yes Yes 어느 class 에서라도 접근이 허용된다

protected Yes Yes No Yes 상속을 하면 동일 Package 가 아니더라도 접근이 허용된다

default Yes Yes No No 동일한 Package 내부 에서만 접근이 허용된다

private Yes No No No 동일한 class 내부 에서만 접근이 허용된다

Constructor 에 이것을 이용하여 객체생성 (new) 불가토록 한다

package a.b.c ; public class Test1(){ public int var1=1 ; protected int var2=1 ; default int var3=1 ; private int var4=1 ; }

// 다른 Package 에서 접근 package a.b.k ; import a.b.c.Test1 ; public class Test3{ void method1(){ var1 = 10 ; var2 = 10 ; // ERRROR var3 = 10 ; // ERROR var4 = 10 ; // ERROR } }

// Sub Class 에서 접근 package a.b.k ; import a.b.c.Test1 ; public class Test4 extends Test1{ void method1(){ var1 = 10 ; var2 = 10 ; var3 = 10 ; // ERROR var4 = 10 ; // ERROR } }

// 동일 Package 에서 접근 package a.b.c ; import a.b.c.Test1 ; public class Test2{ void method1(){ var1 = 10 ; var2 = 10 ; var3 = 10 ; var4 = 10 ; // ERROR } }

Page 17: Java 강의자료 ed11

16

Class 유형

Abstract class

. 참고 하는 디자인 혹은 모델 개념이다 (추상화)

. 직접 객체를 발생 시킬 필요가 없고, 단지 상속에 의해서 하위 class 만 제어할 목적이다.

. abstract class 내 에서 추상 method 는 반드시 존재 하여야 하며, 상속받는 class 에서 구현 되어야 한다.

. 즉, 공통 부 는 Abstract class 가 선언한 것을 사용하며, 가변 부 (abstract method) 만 sub class 에서 구현하여

class 의 완성을 가져가는 개념이며, 완성된 class 만 Instance 객체화 가 가능하다

Abstract Class Car

extends Car

Class Truck

Class Sedan

new Truck

new Car // 불가 객체 X

객체 Y

Super Class

Sub Class

Page 18: Java 강의자료 ed11

17

Class 유형

Abstract class , Override

. Override 란 OOP 가 지향하는 다형 성 의 특징으로, sub class 가 super class 의 메소드 를 대체 하는 것 이다

. Final 로 지정된 속성을 지니는 method 는 override 불가능 하다

. Override 예

public void method1 {} ; Public void method2 {} ;

Class C

Abstract Class B

Abstract Class A

extends A extends B

public void method1 {} ; // Override method public void method3 {} ; // 추가된 method

public void method2 {} ; // Override method public void method3 {} ; // Override method public void method4 {} ; // 추가된 method

Page 19: Java 강의자료 ed11

18

Class 유형

Abstract class

. Template Code

package a.b.c; public abstract class AbstractClass { public static final int var1 = 20 ; protected int var2 ; public int var3 ; private int var4 ; public abstract void method1() ; public void method2(){} }

package a.b.c; public class AbstractExtendsClass extends AbstractClass{ public void method1(){ // Abstract method 의 실제 구현부 } public void method2(){ // Override Method } public void method3(){ // Add method in this class } }

package a.b.c; public class Main{ public static void AbstarctClassTest(){

/* Can't instance as Abstract class AbstractClass obj1 = new AbstarctClass() ; */ AbstractExtendsClass obj2 = new AbstractExtendsClass() ; obj2.method1(); obj2.method2(); obj2.method3(); } }

Page 20: Java 강의자료 ed11

19

Class 유형

Interface

. 상수필드 와 abstract method 만을 지니며, 실제 구현은 Implement 를 선언한 class 가 적용한다

. 사용 측 (App) 과 구현 측 (기본 Package) 의 약속된 규정 역할을 하는 단순 Interface 이다

. Interface 간 다중상속 이 가능하다

. 특별한 선언이 없어도 Interface 내의 모든 메소드 는 abstract 메소드 이며 모든 변수가 static 상수이다

. Java8 부터 추가된 default keyword : Interface 내의 메소드 를 실제구현 – Interface 는 다중상속이 됨으로, 단일상속 에 대한 확장개념

. 주로 Interface 는 아래와 같이 Handler 와 Listener 용도로 사용된다

. Interface 사용 Pattern

Interface A

Interface B

Interface C

extend A,B

Class D

implement B,C

Abstract Class E

Implement C

Interface 의 다중상속 Pattern 일반적인 Interface 의 적용 (하나 이상을 implement 할 수 있다) Abstract class 도 Interface 를 적용 할 수 있다

Interface C

App Interface (Handler)

Class

Interface (Listener)

App

Notify Event / Data

Page 21: Java 강의자료 ed11

20

Class 유형

Interface Class

. 선언에 상관없이 모든 변수 는 static final 이며, 모든 method 는 abstract 이다

. Template code

package a.b.c; public interface InterfaceClass { public static final int KKA = 20 ; public static int KKB = 20 ; // this is also static final public int KKC = 20 ; // this is also static final public abstract void method1() ; public void method2() ; // this is also abstract }

package a.b.c; public class InterfaceImplementClass implements InterfaceClass { public int var1 ; public int var2 ; public void method1(){ // 실제구현 method } public void method2(){ /* can’t access as static final KKA = 10 ; KKB = 10 ; KKC = 10 ; */ } }

Page 22: Java 강의자료 ed11

21

Class 유형

Abstract interface

stackoverflow.com 에서 찾은 내용은 아래 와 같이 두 가지로 정의된다

1) Every interface is implicitly abstract. This modifier is obsolete and should not be used in new programs.

2) Be aware that in Spring it has non academic meaning.

The abstract interface is a warning to the developer not to use it for @Autowired.

I hope that spring/eclipse @Autowired will look at this attribute and warn/fail about usages of such.

A real example: @Service proxy under @Transnational to a @Repository need to use same basic methods however they should use different interfaces that extends this abstract interface due to @Autowired. (I call this XXXSpec interface)

Page 23: Java 강의자료 ed11

22

Class 유형

Abstract class , Override

. Override 란 sub class 가 super class 의 메소드 를 대체 하는 것 이다

객체의 지칭 자 : this , super

. This : Instance 객체 자신을 지칭한다

. Super : extend 시 Super class 의 멤버 변수 혹은 멤버 method 를 지칭한다

생성자 (Constructor) 에서 super 를 호출하면 Super class 의 생성자 를 호출함

public void method1 {} ; Public void method2 {} ;

Class C

Abstract Class B

Abstract Class A

extends A extends B

public void method1 {} ; public void method3 {} ;

public void method2 {} ; public void method4 {} ;

method2 를 대체한다 method1 을 대체한다

Public public void method1 {} ; Public void method2 {} ;

Class B

Abstract Class A

extends A

public void method1 {} ; public void method3 { method1() ; // Class B 의 mthod1() 이 호출 this.method1() ; // Class B 의 mthod1() 이 호출 super.method1() ; // Class A 의 mthod1() 이 호출 }

method1 을 대체한다

Page 24: Java 강의자료 ed11

23

Class 사용 Pattern

현실구현 일반적 모습

// Notify Event at Class K public void postEvent(Object listener, Object evt) { if( evt instanceof ServiceContextEvent ) { ((ServiceContextListener)listener).receiveServiceContextEvent((ServiceContextEvent)evt); } }

App Class Main()

Interface A (Handler)

Class K

Interface B (Listener)

Notify Event Implement A

Class B

Abstract Class A

JNI

Import B // for new B Import C // for new C

Extends A

Action (gfx, file, socket)

Implement B

k = new K k.addListener() k.Method()

Class C

Event

Native

Page 25: Java 강의자료 ed11

24

Class 사용 Pattern

사용 Pattern

(1) 하나 이상의 Class

(2) Inner Class

(3) 지역 (Local) Class : Method 내부의 Class 로서, Method 내부의 지역변수 와 동일한 성격을 지닌다

(4) 익명 (Anonymous) Class : Method 내부의 Class 이지만 익명을 지닌다

하나 이상의 Class

. 일반적으로 Java 파일 하나에 하나의 Public class 를 지닌다

. 하나의 Public class 와 여러 개의 default class 를 지니는 것도 가능하지만, 이를 대체 하는것이 Inner class 이다

Class 간 멤버접근이 불가능 한 특징이며, 이를 보완 하는것이 Inner class 사용 방법 이다

package a.b.c; public class OuterClass { public int vara = 10 ; private int varb = 10 ; // varx = 20 ; // can't access } /* only one public class should be exist public class OuterClass2 { } * / class OuterClass3{ public int varx = 10 ; private int vary = 10 ; // vara = 20 ; // can't access }

Page 26: Java 강의자료 ed11

25

Class 사용 Pattern

Inner Class

. Class 내부에 Class 를 두는 경우를 의미한다

. 목적은 편의성 과 단순성 을 위함이다 : 간단한 class 를 여러 파일에 두지 않고 Code 의 단순성을 가져간다

. 두 가지 로 분류 할 수 있다

(1) Non-static inner class

(2) static inner class

. Inner class 내부에서 상속은 static 은 static 간 , non-static 은 non-static 간에 만 가능하다

구분 특징

Non-static Inner class

. Inner 클래스의 객체를 만들기 위해서는 반드시 Outer클래스의 객체를 생성하고 이를 통해 Inner클래스를 만들어야함 OuterClass.InnerA obj1 = new OuterClass().new InnerA(); . Inner클래스는 Outer클래스의 맴버에 접근 할 수 있지만 Outer클래스는 Inner클래스의 멤버에 직접 접근 할 수 없다.

Static Inner class

. Static 멤버 (변수 혹은 메소드) 가 있으면 반드시 static 으로 지정 되어야 한다

. Static Heap 영역에 위치 함으로, Outer클래스의 객체 생성 없이 바로 객체 생성이 가능 OuterClass.InnerD.method1(); . Inner 클래스에서는 Outer클래스에 정의된 멤버중 에 static 멤버만 직접 접근이 가능.

Main Class

Non-static InnerA Class

Outer Class

Static InnerD Class

직접 access 가능

OuterClass.InnerA obj1 = new OuterClass().new InnerA(); Obj1.method1() ; OuterClass.InnerD.method1();

Page 27: Java 강의자료 ed11

26

Class 사용 Pattern

Inner Class 예제 Code package a.b.c; public class OuterClass { public int var1 = 10 ; public void outMethod1() { } public void outMethod2() { // varx = 20 ; // can't access InnerA obj1 = new InnerA() ; } public class InnerA{ public int varx = 10 ; /* Can't here as static member public static int var1 = 10 ; public static void method2(){ */ public void method1(){ var1 = 20 ; // can access outMethod1() ; // can access } } public class InnerB extends InnerA{ } /* Can't extends between static and non-static public static class InnerC extends InnerB{ } */ public static class InnerD { public static void method1(){ // var1 = 20 ; // can't access // outMethod1() ; // can't access } } public static class InnerE extends InnerD{} }

Page 28: Java 강의자료 ed11

27

Class 사용 Pattern 익명 (Anonymous) Class

. Method 내부의 지역 Class 로서 선언이 보이지 않고, new 와 함께 임시 class 가 생성된다

. 주로 Interface 인 Listener 에 대한 적용 시 사용되며,

Implement 적용 class 를 별도로 만들지 않고 Interface 를 직접 new 하여 임시 class 를 만들어서 사용하는 방법 이다

. 목적은 간편성을 위함이다

. Template Code

package a.b.c; public interface InterfaceClass { public static final int KKA = 20 ; public static int KKB = 20 ; // this is also static final public int KKC = 20 ; // this is also static final public abstract void method1() ; public void method2() ; // this is also abstract }

package a.b.c; public class AnonymousClass { public void method9(){ /* This is Anonymous class */

InterfaceClass obj1 = new InterfaceClass(){ public void method1(){} public void method2(){} }; // 반드시 ; 가 붙어야 한다 } }

Page 29: Java 강의자료 ed11

28

Class 사용 Pattern

싱글톤 (Singleton) 객체

. 객체 지향적 일 지라도 특정한 것 은 응용 단에서 단 하나의 객체만으로 이용 가능한 객체 형태를 의미한다

. 예를 들어, HW 자원이 하나인 Tuner 에 대한 객체는 하나만 있어도 객체적 의미를 다하는 것이다 . 일반적으로 사용자는 getInstance 라는 메소드를 통하여 Instance 객체를 얻어간다 . new 를 못하게 하도록 Constructor 를 Private 으로 지정한다 - new 를 하면 Exception 이 발생한다

< 고전적인 방법 > public class ClassicSingleton { private static ClassicSingleton instance = null; protected ClassicSingleton() { // Exists only to defeat instantiation. } public static ClassicSingleton getInstance() { if(instance == null) { instance = new ClassicSingleton(); } return instance; } }

< Private Constructor 를 이용하는 방법 > package a.b.c; public class SingletoneClass { private static SingletoneClass stc = new SingletoneClass() ; // To set as private, Not to allow new instance from other class private SingletoneClass(){ System.out.printf("Instancing SingletoneClass \n") ; } // Need static to call without new instance public static SingletoneClass getInstance(){ return stc ; } }

Page 30: Java 강의자료 ed11

29

Class 사용 Pattern

javax.tv.service 의 ServiceContext 사례

. ServiceContext 는 특정한 사용자 서비스 (예. Watch TV Main, Watch TV PIP) 를 위한 Context 객체로 사용되며

아래 그림은 SvcContext 객체를 얻기 위한 과정을 표현한다

. SvcContext 객체의 select Method 를 이용하여 특정 Program 을 선택한다

Abstract Class SvcContextFactory

Abstract Class SvcContextFactoryExt

Class SvcContextFactoryImpl

extends

extends Interface

SvcContext

Interface DvbSvcContext

Interface SvcContextExt

Class SvcContextImpl

Interface DVRSvcContextExt

Class DVRSvcContextImpl

implements

implements

extends

extends

extends extends

< Application > // Step1. Service 객체를 얻는다 // Step2. ServiceContext 객체를 얻는다 scf = ServiceContextFactory.getInstance() ; sc = scf.createServiceContext() ; // Step3. 해당 Service 에 대하여 선택을 요청한다 sc.addListener(new SeriviceContextListener()) ; sc.select (Service) ; // Or Locator

new 를 사용하지 않고 객체생성방법 (3) 으로 객체를 생성한다

Interface SvcContextListener

Page 31: Java 강의자료 ed11

30

Java.lang Class

Primitive Data Type Class

. Variable 에 대한 Primitive Data Type 도 Class 모형을 지니는 객체이다

Java.lang Class

Class 형태 주요 Method

Boolean public final class Boolean implements java.io.Serializable

Character public final class Character implements java.io.Serializable, java.lang.Comparable

Byte Short Integer Long Float Double

public final class Byte extends java.lang.Number implements java.lang.Comparable public final class Short extends java.lang.Number implements java.lang.Comparable public final class Integer extends java.lang.Number implements java.lang.Comparable public final class Long extends java.lang.Number implements java.lang.Comparable public final class Float extends java.lang.Number implements java.lang.Comparable public final class Double extends java.lang.Number implements java.lang.Comparable

parseByte parseShort parseInt parseLong parseFloat parseDouble

String public final class String implements java.io.Serializable, java.lang.Comparable, java.lang.CharSequence

length, charAt, getChars, getBytes compareTo, concat, replace toUpperCase, toLowerCase,

Class public final class Class implements java.io.Serializable forName, getField, getMethod, getConstructor getDeclaredMethod newInstance

Object public class Object finalize, notify, wait

Page 32: Java 강의자료 ed11

31

Java.lang Class

Primitive Data 객체 Array 만들기

. 세가지 방법으로 선언한다 , 초기화 값에 의하여 size 가 정해 지거나 명시적으로 size 를 정한다

. [] 위치는 Data type 에 있어도 무방하다 : int ar1[] == int[] ar1

. Reflect Class 를 이용하여 생성하는 방법도 있다 라는 것을 참고 바란다 : Array.newInstance

public static void ArrayTest(){ int ar1[] = {0,1,2,3,4,5} ; // The size must be 6 by init value int ar2[] = new int[] {0,1,2,3} ; // The size must be 4 by init value int ar3[] = new int[5] ; // The size must be 5 // int ar4[] ; // This is not allowed as init value or size is not determined System.out.printf("ar1=%d, ar2=%d,ar3=%d \n",ar1.length,ar2.length,ar3.length) ; int ar5[][] = { {1,2},{1,2} } ; // The size must be 2 by init value int ar6[][] = new int[10][10] ; // The size must be 10 System.out.printf("ar5=%d, ar6=%d \n",ar5.length,ar6.length) ; }

Page 33: Java 강의자료 ed11

32

Java.lang Class

Reflect Class

. 해당 class 의 구성 요소를 조사 하거나 변경 하고자 하는 목적이다

. 이를 이용하여 동적 객체 생성에 활용을 할 수 있다

. 실제 자바빈 에서는 Method 의 이름이 실행시간에 주어짐으로 Reflect class 를 활용하여야 한다

Java.lang.reflect Class

Class 형태 주요 Method

Array public final class Array newInstance Set,Get

Constructor public final class Constructor extends Accessible Object implements Member GetName, getDeclaringClass newInstance getExceptionTypes getParameterTypes

Field

public final class Field extends Accessible Object implements Member getName, getType getDeclaringClass

Method

public final class Method extends Accessible Object implements Member

getName, getReturnType getDeclaringClass getExceptionTypes getParameterTypes

Page 34: Java 강의자료 ed11

33

Java.lang Class (Object)

Object Class

. 모든 Class 는 Super Class 에 대한 extends 지정이 없다면, java.lang.Object class 를 자동 상속하게 되어있다.

Object class 가 제공하는 Method 를 이용하여 객체를 관리 하는데 사용하는 목적이다

Method 설명 비고

boolean equals(Object obj) 두 개 의 객체가 같은지 비교한다

String toString() 현재 객체의 문자열을 얻는다

protected Object clone() 객체를 복사 시킨다

protected void finalize() GC 직전에 resource 를 정리하는 목적이다 Finalize Thread 가 호출

Class getClass() 객체의 Class 형을 얻는다

int hashCode() 객체의 Code 값을 얻는다

void notify() Wait 된 thread 실행재개를 요청한다

void notifyAll() Wait 된 모든 thread 실행재개를 요청한다

void wait() void wait(long timeout) void wait(long timeout, int nanos)

Thread 를 일시적으로 중지 시킨다

Class Object

Abstract Class A

extends Object Class B

extends A

Page 35: Java 강의자료 ed11

34

Java.lang Class (Exception)

Exception Class

. 모든 Exception (xxxException ) 종류 들을 객체로 관리한다 (Class 가 있고 객체화 되어져서 사용된다)

. Throw keyword 를 통하여 exception 을 delivery 한다

public class Test1{ public void method1(){ Test2 obj = new Test2() ; try{ obj.method2() ; } catch (IOException e){ String str = e.getMessage() ; } } }

public class Test2{ public void method2() throws IOException { // IOException 객체를 생성하고 delivery 한다 throw new IOException() ; } }

public class IOException extends Exception { public IOException() { super(); } public IOException(String s) { super(s); } }

Exception 전달

객체 Class

< java.lang 의Exception 종류 들 > NullPointerException NoSuchMethodException NoSuchFieldException ArithmeticException ArrayIndexOutOfBoundException ArrayStoreException NegativeArraySizeException ClassCastException ClassNotFoundException CloneNotSupportedException InterruptedException IllegalAccessException IllegalArgumentException IllegalMonitorStateException IllegalStateException IllegaThreadlStateException IndexOutOfBoundException InstantiationException NumberFormatException RuntimeException SecurityException StringIndexOutOfBoundException

Page 36: Java 강의자료 ed11

35

Java.lang Class (Thread)

Thread Class (java.lang.thread)

. Multi Thread 를 구현하는 객체이다

. Multi Thread 란 Kernel 의 Scheduler에 의하여 Code 의 Context Cycle (execution-waiting-ready) 이 실행되는 것을 말한다

. Execution 스케쥴링 적용에는 시 분할적인 개념이 적용된다

Multi Thread 적용 두 가지 방법

1) 실행 Class 가 Thread class 를 상속하여 (extend) 사용

2) 실행 Class 가 Runnable class 를 Implement 하여 사용 하는 방법 : Thread 를 상속하지 않고 다른 Class 를 상속하는 경우

Execution

Ready Waiting / Blocking

Signal / Notify

Wait, Sleep, Sync

public class 실행A extends Thread{ public void run(){ // Code } }

public class 실행B extends ABC implements Runnable{ public void run(){ // Code } }

public class App{ public static void main(String args[]){ Thread thread1 = new 실행A ; thread1.start() ; } }

public class App{ public static void main(String args[]){ 실행B obj = new 실행B ; Thread thread2 = new Thread(obj) ; thread2.start() ; } }

Page 37: Java 강의자료 ed11

36

내장 Class (Thread)

Thread Class (java.lang.thread)

. main() 에서 실행 Class 에 대하여 객체화 및 start 를 진행한다

. 실행 Class 는 Thread 를 상속 받아야 하며, 반드시 run() 메소드 로 실행 context 가 적용 되어야 한다

. Thread Class 는 Runnable interface 를 implement 하고 있다

public class App{ public static void main(String args[]){ Thread thread1 = new 실행A ; Thread thread2 = new 실행B ; Thread thread3 = new 실행C ; thread1.start() ; thread2.start() ; thread3.start() ; } }

App Class main()

실행A Class run()

실행B Class run()

실행C Class run()

Class Thread

Interface Runnable

implements extends Thread

extends Thread

extends Thread

public class 실행A extends Thread{ public void run(){ // Code } }

public class 실행B extends Thread{ public void run(){ // Code } }

public class 실행C extends Thread{ public void run(){ // Code } }

Page 38: Java 강의자료 ed11

37

내장 Class (Thread)

Thread 간 상호동작

1) Shared Memory 기법 : 각 thread 의 멤버변수를 동일한 Object 으로 배정하여 관리한다

2) Critical Section 의 동기화 : synchronized KeyWord 를 사용하여 동기화 Block, 동기화 Method 를 적용 – 상호배제 적용

public class SharedMemory { public int msg ; public int state ; }

public class Test1 extends Thread { SharedMemory sm ; }

public class Test2 extends Thread { SharedMemory sm ; }

public class MyApp2 { public static void main(String[] args) { Test1 test1 = new Test1 ; Test2 test2 = new Test2 ; SharedMemory smo = new SharedMemory() ; test1.sm = smo ; test2.sm = smo ; } }

< 동기화 Block > public class Test1 extends Thread { SharedMemory sm ; public void run(){ synchronized (sm){ // Thread 간 같은객체 // Code } } }

< 동기화 Method > synchronized void SyncMethod() { // Code }

Page 39: Java 강의자료 ed11

38

내장 Class (Thread)

Thread 간 상호동작

3) Scheduling Event : Wait, Notify

. Synchronized 를 이용하여 Thread 간 동일 한 객체를 사용 하여야 한다

public class Test1 extends Thread { SharedMemory sm ; public void run(){ synchronized (sm){ // 같은객체 sm.notify() ; } } }

public class Test2 extends Thread { SharedMemory sm ; public void run(){ synchronized (sm){ // 같은객체 sm.wait() ; } } }

Wait 로 Test2 는 Pending 으로 들어가고 Notify 로 Test2 를 wake up 시킨다

Page 40: Java 강의자료 ed11

39

내장 Class (Thread)

Thread Class (java.lang.thread)

. Thread class 가 제공하는 Method 내역

Thread Class Method 설명 비고

public void start() public void run() public State getState() public final void join()

Thread 시작을 요청한다 개별 Thread 에서 Overriding 대상이다 RUNNABLE, WAITING, TIMED_WAITING, BLOCKED A 스레드가 B 스레드를 시작시켰을 때 A 스레드는 B 스레드의 실행이 완전히 끝날 때 까지 기다리는 목적이다

public static void yield() public static void sleep()

높은 Priority 를 지닌 Thread 에게 Execution 을 잠시 양보 특정시간 동안 TIMED_WAITING 상태로 진입을 요청한다

public final void setPriority() public final int getPriority() public final void setName() public final java.lang.String getName()

스케쥴링 우선순위를 지정한다 Thread 이름을 지정한다

public void interrupt() public static boolean interrupted() public boolean isInterrupted()

Sleep 상태 일 경우, sleep 에서 깨어나면 InterruptException 을 발생요청

public void destroy() public final boolean isAlive()

Thread 객체를 폐기한다

public static void dumpStack() Thread stack 을 Dump 한다 (디버깅 목적)

Page 41: Java 강의자료 ed11

40

JVM GC

GC (Garbage Collector)

. JVM Heap 은 시스템 메모리와는 별도로 JVM 에 의하여 관리되는 영역이다 (JVM 시작 시 size 가 주어진다) . Object 생성시 각종 data 의 거주공간 이다 . JVM 에 의하여 GC (free 행위) 가 진행되며, 아래와 같이 두 가지 GC 방법이 있다 (1) JVM 의 내부 Thread 에 의하여 점진적으로 해제처리 (2) 강제 요청에 의하여 (System.gc()) . GC 는 아래와 같이 두 가지 공간으로 관리된다 (JVM 시작 시 Minor GC 주기 가 지정되며, default 4분이다) . 실제 사용시 아래와 같은 Pattern 을 보인다

몇 차례의 GC 에도 남아있는 Object

Old Gen Young Gen new Object

Minor GC 대상 Major GC 대상

시간

Heap Free

Page 42: Java 강의자료 ed11

41

JVM GC

Finalizer

. Object 생성시 Finalizer 를 상속하는 객체는 자동으로 Finalizer 에 대하여 Reference 를 생성하고 Finalizer Queue 에 본인을 등록한다 . Finalizer 는 비 주기적으로 Queue 에 있는 객체를 검사하여 Queue 에 등록된 객체의 Reference 가 Finalizer 이외에는 없는지 확인한다 . 없다면, Object 의 finalize() 를 호출하고, 종료 후 Finalizer 가 가리키고 있는 해당객체의 Reference 를 끓게 된다.

Class A

Object A1

Object A2

Object A3

Object B1

Object B2

Object B3

Class B

JVM Heap reference

new A

new B

Finalize Method

Finalize Thread

GC

no reference then free

reference

No Reference

대상등록

Still Alive

finalize()

NO ( Finalizer 와 상관없이 GC 의 관리대상)

GC 의 관리대상

Page 43: Java 강의자료 ed11

42

JVM JNI

Java Native Interface

Call Native Function From Class

Call Method From Native

. Jmethod_list.def 파일에 method 를 등록 하여야 한다

Class

JVM JNI Interpreter.c

Native Function

public class Car{ // 특정한 define 없이 class 에서 아래와 같이 호출만 한다 private native void Nfunction1() ; public Method1(){ Nfunction1() ; } }

JNIEXPORT void JNICALL PackageName_ClassName_Nfunction1(){ ; } // Function 이름은 Package 와 Class Name 을 포함 하여야 한다 // Arguments : (JNIEnv, jObject, arg1, arg2,,)

Native Function

Java Bridge Class Method()

Call<type>Method VMI_BridgeCall

Jmethod_list.def

JVM

< Object 획득 > jobjectArray = new ObjectArray ; Jobject = new Object ; jbyteArray = new ByteArray ; jstring = new StringUTF ;

Page 44: Java 강의자료 ed11

43

JVM JNI

Event or Result from Native

Class A

Java Bridge Native Function

startMonitor() // for Event realRequest() // for Result

VMI_BridgePostEvent VMI_BridgePostResult

Event Handler Request Handler

Class A

postEvent notifyResult

Page 45: Java 강의자료 ed11

44

Language Feature

KeyWord

. KwyWord 란 : 언어에서 사용랄 목적으로 이미 예약해 놓은 단어 들

. Class 나 멤버변수 및 멤버 메소드 이름으로 사용 할 수 없다

분류 종류 비고

Package package, import

Class 종류 Class 및 멤버 Method 속성 Class 및 멤버 변수, Method 접근 지정자 JNI Method

class, abstract, interface final, static public, private, protected, default native

객체화 및 상속 객체 지칭 모객체 여부

new, extends, implements this, super instanceof

Exception 처리 Multi Thread Sync 처리

throw, throws synchronzed

기타 void, const, return, volatile, transient

Variable type (primitive) boolean, char, byte, short, int, long, float, double 객체가 아님

Try & Catch try, catch, finally

조건문 , 반복문 for, if, else, do, while, switch, case, continue, goto, break

Page 46: Java 강의자료 ed11

45

Language Feature

7.0 에서 적용된 Feature

(1) Null-safe method invocation : Null check 를 위한 coding 방법을 macro 화

(2) String in Switch statements : 원시형 (int,short,char) varaible type 만 가능에서 string 도 가능하도록 , code 용이성

(3) Multi-exception catch : 다중 catch 에 대한 one line 가능

(4) Bracket notation for collection ; 선언 과 동시에 초기화 가능토록

(5) ForkJoinFramework ; 병렬처리 (multi procoessor)

< Multi-exception catch > // Old style try { ...... // IO 작업 } catch( IOException e ) { e.printStacktrace(); } catch( Exception e2 ) [ System.out.println(" Exception : " + e2); } // New style try { block of statement } catch( IOException e | Exception e2 ) { block of statement }

< Null-safe method invocation > // Old style public String getPostcode( Person person ) { if( person != null ) Address address = person.getAddress(); if( address != null ) return address.getPostcode(); return null; } // New style public String getPostcode( Person person ) { return person?.getAddress()?.getPostcode(); }

< Bracket notation for collection > // Old style Collection<String> c = new ArrayList(); c.add("one"); c.add("two"); c.add("three"); // New style Collection<String> c = new ArrayList {"one", "two", "three"};

Page 47: Java 강의자료 ed11

46

Language Feature

Collection

. Collection 이란 배열을 통해 연속된 공간에 Data 를 수집하는 여러 종류의 객체들을 말한다

. java.lang.utilty 하부에 Class 가 존재한다 (java.lang 이하는 Import 를 하지 않아도 된다) . 사용 용도에 따라 4 가지로 분류된다 (1) Set 계열 : HashSet , 순서 없고 중복불허 (2) List 계열 : ArrayList, Vector , 순서 있고 (index) 중복허용, Vector 는 sync 사용, ArrayList 는 sync 미 사용 (3) Map 계열 : HashMap, HashTable , key 와 value 가 한 쌍 , HashMap 은 null 허용, HashTable 은 null 미허용 (4) Queue : LinkedList

< HashTable Enumber String >

HashTable ht new HashTable = {} ; ht.put (“a1”,”abc”) ; ht.put (“a2”,”def”) ; ht.put (“a3”,”ghi”) ; Enumeration keys = ht.keys() ; Enumeration values = ht.elements() ; keys.hasMoreElements() ; // boolean String key = keys.nextElements() ; value = ht.get(key) ;