출처: http://misoleaf.blogspot.kr/2013/01/java.html
1.자바의 역사
(1) 1991년 : sun 사의 green project 에서 james gosling 외
기술자들 oak라는 언어로 제작(가전기기에 사용할 목적)
(2) 1997년 : jdk 1.1 발표
(3) 1998년 : jdk 1.2 발표
(4) 2000년 : jdk 1.3 발표
(5) 2002년 : jdk 1.4 발표
(6) 2002년 : jdk 1.5(5.0)발표
(7) 2007년 : jdk 6발표 2. java의 특징
(1) 플랫폼(os)에 독립적 : 자바 가상머신(JVM: java virtual Machine)
이 해당 플랫폼마다 따로 제공되어서 ,동일한 실행결과을 보장한다.
(2) 객체 지향언어 : 재사용성, 프로그램 생산성이 향상
(3) 멀티 쓰레드를 지원 : 동시 다발적인 작업을 수행할 수 있다.
(4) 자동 메모리 관리 : JVM에 의해서 자동관리된다.
3. java의 실행 절차
사용자의 .java 파일-> compile-> class 파일 (Byte code)->
JVM 실행 -> 결과 출력
4. 용어 정리
(1) 객체(Object) : 모든 것이며 class 를 통해 만들어지는 구현물
(2) 클래스(Class): 객체(Object)를 만들어 내는 틀 (설계도, Blueprint)
(3) 속성 (Field) : 객체의 속성, 성질, 클래스에 정의가 되어 있다.
cf.) property, attribute, member variable, 전역변수 ....
(4) 메소드(Method) : 객체가 할 수 있는 기능 (행위)
(5) 생성자 (Construtor) : 객체가 만들어질때(초기화) 호출이 되는
일종의 메소드와 같은 것
-- 클래스 이름과 동일한 단어( 대문자로 시작한다.)
-- 메소드와 비슷한 형태 () ,{}
-- 반환타입이 없다.
-- 하위(자식, sub)클래스의 객체가 생성되기 위해서는 먼저
내부적으로 상위(부모,super)클래스의
생성자가 호출되어서 부모의 객체가 먼저 생성되어야 한다.
(부모 없는 자식은 없다)
-- 생성자가 하나도 없는 경우 컴파일러가 기본생성자를
만들어 준다.
(기본 생성자의 접근 제한자는 클래스의 접근제한자와 동일)
5. OOP(Object Oriented Programming) 의 특징
(1) 상속성 (inheritance) - Human, Superman, Xman
(2) 다형성 (polymarphism)
(3) 은닉성 ( Information Hiding)
(4) 캡슐화 (Encopsulation)
6. 기본 자바 파일의 구조
(1) package 선언
(2) import 구문 (import java.lang.*;)
(3) class 선언 (public class | class)
{
(4) 속성(field) 선언하거나 초기화
(5) 생성자(객체의 초기화를 담당)
(6) 메소드 선언
public static void main(String [] args)
{
실행시에 제일 먼저 JVM이 호출하는 메소드
}
}
7. 자바의 주석
(1) // 한줄짜리 주석
(2) /*
여러줄 주석
라인 2~~~~~~~~~
*/
(3) /**
javadoc (API문서를 만들때 쓰인다)
*/
8. 자바의 변수
(1) 변수 type에 따라
<1> 기본형 (primitive type) 변수 (8개) - 실행의 효율성 때문
-존재이유 : 실행의 효율성 때문이다.
- 형변환 방향 ( 오른쪽으로 )
byte(1) -> short(2) -> int(4) -> long(8) -> float(4) -> double(8)
|
char(2)
boolean
<2> 참조형(Reference type, 객체명) 변수
- 초기값 : null,실제로는 참조하는 객체의 주소값을 가진다.
- 형변환 방향 (위로)
Object
|
Human
|
Superman
(2) 유효 범위에 따라
<1> 멤버 변수 (Member Variable = Field)
-초기화를 하지 않아도 된다.
Ex) int (자동으로 0으로 초기화가 된다.) -> 선언만 했다.
<2>메소드 지역변수(locla variable)
-반드시 초기화를 해야 한다.
Ex) int i = 10;
9. 제한자 ( modifier)
(1) 정의
-클래스, 인터페이스, 변수, 메소드, 생성자 앞에 붙여서 기능을
제한 하는 keyword
(2) 종류
<1> 접근제한자
public(제한이 없음) > protected(상속관계) >
defoult(같은 패키지 안) > private( 같은 클래스안)
<2> 소유제한자 (static)
- static 붙으면 클래스의 소유
- static 없으면 객체의 소유
<3> 수정제한자 (final)
-붙으면 수정할 수 없게 만드는 제한자
1) field : 상수가 된다.
2) method : 재정의 (Overriding) 안됨
3) class : 상속 안됨
<4> 추상제한자 (abstract)
<5> 기타
- synchronized, transient, volatile, native.....................
10. Overloading 과 Overriding
(1) 오버로딩(Overloading)
<1> 정의
- 메소드의 이름은 같은데, 인자의 개수나 type, 순서가 다른형태의 메소드로써 이름만 같지 별개의
메소드인 것을 말한다.
<2> 조건
-인자 (paramerter)의 개수나 type, 순서가 달라야 한다
<3> 종류
- 생성자 오버로딩
- 메소드 오버로딩
(2) 오버라이딩(Overriding)
<1> 정의
- 상속관계가 있는 클래스에서 부모 클래스의 메소드 내용을 자식 클래스에서 재정의 하는 것
<2> 조건
- 반환타입이 같아야 한다.
- 인자(parameter)의 개수나 type, 순서가 모두 같아야 한다.
- 부모 클래스이 오버라이딩될 메소드의 접근 제한자보다 자식클래스에서 재정의하는 메소드의
접근 제한자의 범위가 같거나 더 커야 한다.
11. this, super
(1) this - 자기 자신(class)의 객체
(2) super - 부모클래스의 객체
12. 식별자 (identifier)
(1) 정의
개발자가 임의로 만드는 패키지, 클래스, 메소드, 변수 등의 이름을 의미
(2) 규칙(어기면 컴파일 에러 발생)
<1> 식별자의 첫문자는 특수문자, 숫자여서는 안된다. ( _ , $는 예외)
<2> 문자와 숫자, 특수문자( _ , $)로 조합할 수 있다.
<3> 예약어를 사용하면 안된다.
<4> 길이의 제한이 없다.
(3) 관례
<1> 의미있는 단어를 사용한다.
<2> 클래스와 인터페이스의 첫문자는 대문자
<3> 단어의 결합으로 되어있을 경우 다음 단어의 첫번째 글자를 대문자로 하거나 _ 로 연결한다.
Ex) TestClass , getName , get_name
<4> $ 문자 사용하지 않는다.
13. 연산자
(1) 산술연산자
+,-,*,/,%
(2) 증감연산자
++, --
(3) 대입연산자
=
(4) 산술 할당(대입) 연산자
+=,-=,*=,/=,%=.......
(5) 비트 연산자
&,|,^,~
(6)쉬프트 연산자
<<,>>,>>>(부호보장 X)
(7) 논리 연산자
&&, ||, &,|,!
(8) 삼항(조건) 연산자
조건식? 참일때 : 거짓일때
(9) instanceof 연산자
- 형식 :
Reference Type 변수 instanceof Class 명
- 앞의 변수가 뒤의 클래스로 형변환 가능 한지 알아보는 연산자
14. 조건문 (Condition)
(1) if(boolean 형) {body} 문
(body 내용에 명령이 하나면(한문장)이면 {} 생략 가능)
(2) if(boolean 형) {} else {}문
(3) if(boolean 형) {}else if{} else {} 문
(4) switch(값) {case : ...... default:} 문
15. 반복문
(1) for (초기식; 조건식; 증감식){}
(2) while(boolean) {}
(3) do {} while(boolean);
16. 제어의 이동
(1) break : 감싸고 있는 {}(블럭)을 나간다.
(2) continue : continue 문 이후의 명령을 실행하지 않고 건너 뛴다.
(3) return : 메소드를 호출한 곳으로 제어권을 넘긴다.
17. interface (인터페이스)
(1) 정의 : 명세서 이다. (골격이다.)
모든 메소드가 추상메소드, 모든 Field가 상수로 구성된것, 클래스에 다중 상속이 가능하다.
(2) 특징
<1> 인터페이스끼리 다중 상속이 가능하다.
Ex) Inter1 extends Inter2, Inter3
<2> 클래스에서 인터페이스를 다중 상속하는것이 가능
Ex) class House implements Roof, Door
<3> 형태
- Field 에는 public static final 이 생략 가능
- Method 에는 public abstract 생략 가능
<4> 인터페이스를 구현(상속)하는 클래스에서는 반드시 메소드를 재정의 (Overriding)해야 한다.
18. abstract class(추상클래스)
(1) 정의
추상 메소드를 가질 수 있는 클래스
(2) 특징
<1> 추상클래스는 객체를 생성할 수 없다.
(완벽한 설계도가 아니다.)
<2> 하위 클래스가 추상 클래스가 아니면 반드시 추상 메소드를 구현(재정의) 해야 한다.
(3) 추상 메소드 : 메소드의 body({ })가 없는, 선언만 되어 있는 메소드
19. 배열(Array)
(1) 정의: 같은 타입(type)의 객체 또는 기본형 자료를 저장하는 저장소로써, 생성될 때 그 크기가
고정되는 저장소
(2) 생성
<1> Type[] 변수명=new Type[저장소크기];
ex) int[] i=new int[30]
int []i=new int[30]
int i[]=new int[30]
<2> Type[] 변수명={value,value,value....};
ex) String[] str={"1","2","3"}
int[][] i={{1,2},{3,4,5}}
20. 예외처리
(1) 예외(Exception)의 정의
프로그램이 정상적으로 진행되지 못하게 하는 돌발상황
(2) 계층도
Object
|
Throwable
| |
Error Exception
| |
RuntimeException CheckException(런타임셉션외)
(3) 예외처리의 목적
프로그램 실행시에 발생할 수 있는 상황들을 정해놓고, 해당 상황 발생시 적절한 조치를 취해서 프로그램이
정상적으로 작동하도록 하는 것이다.
(4) 예외처리의 특징
<1> Exception은 메소드,생성자에서 발생한다.
ex) Human() throws Exception{}
<2> 발생시킬 때에는(던질 때에는) throws라는 예약어를 사용한다.
ex) throw new JWJException();
<3> 던져진 Exception은 바로 try{} catch하거나 throws라는 예약어를 사용해서 메소드를 호출한 곳으로
떠넘길 수 있다.(또 던진다.)
ex)void badMethod() throws IOException,Exception
<4> 잡는 방법
try{
예외가 던져지는 구문
}catch(예외클래스명 변수명){
예외처리 구문
}
<5> catch절에서 두 개 이상의 Exception을 잡을 경우 반드시 하위 Exception부터 잡아야 한다.
ex) try{
}catch(JWJException e){
}catch(Exception e){}
<6> finally 절
try절과 함께 쓰이며, catch 절의 실행유무와 상관없이 무조건 실행된다.
(return문이 나와도 실행된다.)
<7> 자동으로 throws되고, 잡지 않아도 되는 예외
RuntimeException, Error
-throws 안해도 되고, 해도 된다.
-try catch 안해도 되고, 해도 된다.
21. 중첩 클래스 (Nested class)
(1) 정의 : 클래스 안에 있는 클래스
(2) 종류
<1> static nestde class(static 붙은 class)
(static 변수나 static 메소드에만 접근이 가능하다)
Ex) Outer.InnerStatic is = new Outer.InnerStatic();
<2> inner class(static 붙지 않은 class)
Ex) Outer.Inner inner = out.new Inner();
<3> Anonymous inner class
이름이 없는 클래스, 기존의 클래스(인터페이스)를 클래스 내부에서 상속 받아서 새롭게
정의 하는 클래스
Ex) Anon a = new Anon() {};
22. 주요 클래스
(1) Object ( 가장 상위 root class)
- 객체는 서로 다르다.
- equal(). hashCode(), toString()
(2) String (불변 클래스 immutable)
<1> 한번 생성된 객체의 내용을 연산이나 메소드의 사용에 의해 변화시킬 수 없다.(+wrapper)
<2> 문자열 비교시 반드시 equals 메소드를 써야 한다.
(3) StringBuffer ( 가변 클래스 mutable)
- 한번 생성된 객체의 내용이 연산이나 메소드를 통해서 변화할 수 있다 (ex . append, insert...)
(4) Math
- 상수와 static 메소드만으로 구성, 수학적인 계산을 돕는 유틸리티 클래스
(5) Date, Calendar, GregorianCalendar
- 날짜를 구하거나, 더하거나 ,빼거나 등의 일을 할때에 필요한 클래스
(6) SimpleDateFormat
- 날짜타입을 원하는 대로 ("yyyy년 MM월 dd일")로 바꿀 수 있게 도와주는 클래스
(7) DecimalFormat
- 숫자를 원하는 형태로 바꿀 수 있게 도와주는 클래스
23. Collections Framework
(1) hierachy (계층 구조도)
Collection Map
| | | |
set List Queue SortedMap
|
SortedSet
(2) interface
<1> Collection : 컬렉션 계층구조의 root( 나열된 데이터들의 집합)
<2> Set : 중복된 요소( element) 를 허용하지 않는다. ex) 트럼프 카드
<3> List : 순서가 있는 컬렉션 ( sequence라고도 한다.) 중복허용, 인데스로 각 요소에 접근 가능
<4> Queue : 우선순위를 가지는 여러개의 요소를 가지고 있는 컬렉션 FIFO(First In First Out) ex) 스케쥴러
<5> Map : key와 value 로 이루어진 것, 중복된 key 불가능
// 순서가 있는(정렬이 되는 ) 계열
<6> SortedSet : ascending(오름차순)의 순서로 요소를 가진다.
<7> SortedMap : key값을 오름차순으로 가진다.
ex) 사전 , 전화번호부
// ETC
<8> Enumeration : 각각의 요소를 나열된 형태로 가지고 있다.
<9> Iterator : Enumeration와 같은기능, 또한remove(삭제)가 가능하다.
(3) implementations (구현체들 class)
<1> Set
1)HashSet : TreeSet 보다 빠르다.
2)TreeSet : SortedSet 에서 구현, 정렬
<2> List
1) ArrayList : LinkedList 보다 빠르다
2) LinkedList : List 의 부분적으로 요소를 추가하거나 바로 추가한 놈을 추적하거나
삭제하거나 하는 일이 많을때 빠르다
( Queue 상속, 순환구조 - 그 사이에 삽입, 삭제시 빠르다.)
<3> Map
1) HashMap : 빠르다. null key 값과 null value 값을 허용
2) TreeMap : SortedMap 에서 구현, 정렬가능 (key)
3) LinkedHashMap : 집어 넣는 순서로 정렬, 거의 HashMap 만큼 빠르다.
<4> synchronized (동기화) 계열 (Multi Thread에 안전)
- 삽입 삭제 등의 갱신이 발생하는 동안 다른 작업이 참조 할 수 없음
1) Vector (List계열) ArrayList와 유사
2) Hashtable (Map 계열) :HashMap과 유사하나, null key, null value 허용 안함.
(4) Collections : 각종 Collection관련 유틸 클래스(뒤섞기, 정렬)
24. Thread
(1) Process : 컴퓨터 내에서 실행중인 프로그램
(2) Thread 란?
- 한 프로그램내에서 동시에 두가지 일을 수행하는 것으로 프로세스보다 작은 업무 단위이며,
프로세스의 resource(자원)를 공유하기 때문에 가볍다는 장점이 있다.
(3) 생성(대상 target 을 만드는 법)
<1> java.lang.Thread 를 상속받는 방법 (extends를 쓰기 때문에 다른 테이블을 상속 받을 수 없음)
<2> java.lang.Runnable 을 구현하는 방법( 권장됨)
- 실행 : start()호출하면 JVM이 자동으로 run() 메소드 실행 한다. (Thread의 LifeCycle.ppt참조)
(4) 소멸
run() 메소드의 실행이 끝나면 종료(terminated)된다.
(5) Multi Thread 멀티 쓰레드
2개이상의 Thread가 동시에 실행되는 것
(6) 동기화 ( synchronized)
synchronized 로 되어 있는 곳들은 실행중인 Thread가 대상 객체의 lock(monitor)을 소유하고 실행이 끝난 뒤
unlock(monitor를 반환)해 주는 것.
*한번에 하나의 Thread만 실행이 가능하다.
(7) 우선순위 (priority)
MIN_PRIORITY(1), NORM_PRIORITY(5), MAX_PRIORITY(10)
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<J2SE 5.0 추가 기능 들>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1. Generics
- 컴파일시 잘못된 데이터가 들어 가는 것을 방지
(1) 특징
<1> 타입 안정성을 갖춘 컬렉션을 만들 수 있다.
<2> 컴파일 시점에 타입에 대한 검증을 한다.
(2) 선언방법
<1> E : 컬렉션에 저장하고 컬렉션에서 리턴할 타입의 원소의 타입. E는 Element(원소)
K : key , V : value , O : Object , T : Type
<2> class 나 interface 선언
ex) public class ArrayList<E> extends AbstractList<E> {
public boolean add(E o)
}
<3> 인스턴스 생성시
ex) ArrayList<E> list = new ArrayList<E>();
<4> 메소드 선언(호출)시
1) 선언 : void list(ArrayList<E> list)
2) 호출 : x.list(list);
(3) Generics의 유형매개변수 (Type Parameter)
<1> 사용방법
1) 일반적인 선언
public void setHuman(ArrayList<Human> list)
public<T extends Human> void setHuman(ArrayList<T> list)
2) wildcard를 사용
public void setHuman(ArrayList<?> list) //? all(모든것)
public void setHuman(ArrayList<? extends Human> list) //super도 들어감(extends자리에, 자신이나 자신의 위)
<2> 특징
1) interface도 extends로 표현한다.
2) 일반적으로 wildcard를 쓰지 않는 법을 선호한다.(인자값이 늘어날수록 쓰기 힘들어진다)
public <T extends Human> void setHuman(ArrayList<T> list, ArrayList<T> list2)
public void setHuman(ArrayList<? extends Human> list, ArrayList<? extends Human> list2)
2. 확장 for문 (Enhanced for loop)
(1) 형식
for(테이터형 접근 변수명 : 배열이나 컬렉션 변수명)
(2) 특징
Generics와 같이 쓰여서 효율적인 Collection 계열의 루핑이 가능하다.
ex) ArrayList<Integer> list = new ArrayList<Integer>();
for(Integer i : list)
3. Autoboxing / Unboxing
(1) 정의
<1> Autoboxing : primitive type 변수를 Wrapper class로 자동 변환해주는 것이다.
<2> Unboxing : Autoboxing의 반대의 경우에 해당한다.
(2) 특징
오토박싱은 -128 ~ 127의 범위에 있는 정수값의 경우에만 같은 오브젝트의 리턴을 보장한다.
(list에 add시 범위를 넘는건, 같은 오브젝트 타입의 return이 보장되지 않아서 다른 객체가 리턴된다.)
4. Typesafe enums (타입에 안전한 enum)
(1) 기존의 열거형 타입은 상수 값만 같으면, 사실상 열거형 타입의 구분이 없어진다.
ex)
interface Num {
public static final int ZERO = 0;
}
interface Language {
public static final int JAVA = 0;
}
(2) if나 switch를 사용해서 분기작업을 할 수 있다.
(3) ==나 equals() 모두 쓸 수 있다.
(4) 열거 타입 그 자체가 타입이다.
5. Varargs (가변인수)
(1) 여러개의 인수(parameter)를 배열이 아닌 "..." 로 처리할 수 있다.
ex) void getString(String... names)
(2) 메소드(생성자) 오버로딩시는 사용하지 않는 것이 좋다.
ex) Human(Integer... i)
Human (int i, int j)
new Human(3, 4) = new Human(new Integer(3), new Integer(4))
6. static import
(1) static class, static variable, enum등의 값을 사용할때 타이핑을 더 적게 해보자는 의도
ex) import static java.lang.Math.*;
import static java.lang.System.out;
(2) 가독성이 떨어질 수 있기 때문에 static member를 아주 많이 쓰는 경우에만 활용한다.
7. Annotation(metadata)
(1) "at" @ 표시와 어노테이션 이름으로 표현한다.
(2) BuiltIn(내장) annotation
<1> Override Annotation
override가 수행되지 않으면 컴파일러에서 문제를 표시해준다.
<2> Deprecated Annotation
<3> SuppressWarning Annotation
컴파일러가 warning(예를 들어 generics를 쓰지 않아서 나는)을 나지 않게 해준다.
8. StringBuilder
(1) StringBuffer의 unsynchronized version이다.
(2) 멀티 쓰레드 환경에 안전하지 않지만 StringBuffer에 비해서 속도면에서 월등하다.
(3) StringBuffer와 동일한 메소드를 제공하기 때문에 기존의 StringBuffer를 이름만 바꿔서 쓸수가 있다.
9. Formatting
(1) java.util.Formatter 클래스로써 제공한다.
(2) String 클래스의 format()이나 System.out.printf()