본문 바로가기

Java/Jsp

자바 비기닝 정리! (JDK 5.0 기준. 혹은 1.5버젼)


< Java Beginning >

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) 2004년 : jdk 1.5(5.0) 발표
    (7) 2007년 : jdk 6 발표

2. 자바의 특징
    (1) 플랫폼(OS)에 독립적 : 자바가상머신(Java
        Virtual Machine)이 해당 플랫폼마다 따로
        제공되어서, 동일한 실행결과를 보장한다.
    (2) 객체 지향 언어 : 재사용성, 프로그램의
        생산성이 향상
    (3) 멀티 쓰레드를 지원 : Thread는 Process 보다
        작은 단위, 동시 다발적인 작업을 수행할 수 있다.
    (4) 자동 메모리 관리 :
        가비지 컬렉터(JVM에 포함되어 있는 소프트웨어)
        에 의해서 자동관리된다.

3. 용어정리
    (1) 객체(Object) : 모든것이다. Class 를 통해서
                            만들어지는 구현물 (아반떼)
    (2) 클래스(Class) : 객체(Object)를 만들어 내는 틀
                            (설계도, blueprint)
    (3) 속성(Field) : 객체의 속성, 성질, 클래스에 정의
                        되어 있다.
    (4) 메소드(Method) : 객체가 할 수 있는 기능(행위)
    (5) 생성자(Constructor) : 객체가 만들어질때(초기화)
                        호출되는 것
        - 클래스 이름과 동일한 단어 (대문자로 시작한다)
        - 메소드와 비슷한 형태
        - 반환타입이 없다.
        - 하위클래스의 객체가 생성되기 위해서는 먼저
            내부적으로 상위클래스의 생성자가 호출되어서
            부모 객체가 먼저 생성되어야 한다.
            (부모 없는 자식은 없다)
        - 생성자가 하나도 없는 경우 컴파일러가
            기본 생성자를 만들어준다.

4. OOP(Object Oriented Programming)의 특징
    (1) 상속성(inheritance) - Human, Superman, Xman
    (2) 다형성(polymorphism)
    (3) 은닉성(Information Hiding)
    (4) 캡슐화(Encapsulation)

5. 자바의 구조
    (1) package 선언
    (2) import 구문
    (3) class 선언
    {
        (4) 속성(Field)이자 멤버변수(Member Variable)
            선언 및 초기화
        (5) 생성자(초기화)
        (6) 메소드 선언
        public static void main(String[] args)
        {
            실행시 제일 먼저 JVM이 호출하는 메소드
        }
        public void otherMethod(int a)
        {
            this.a = a;
        }
    }

6. 자바의 주석
    (1) // 한줄짜리 주석
    (2) /*
            라인1
            라인2
        */
    (3) /**
            javadoc (API문서를 제작할때 쓰인다)
        */

7. 자바의 변수
    (1) 변수 type에 따라
        <1> 기본형 (primitive type) 변수(8개)
            - 존재 이유 : 실행의 효율성 때문이다.
            - 형변환 방향(오른쪽으로)
byte(1) -> short(2) -> int(4) -> long(8) -> float(4) -> double(8)
                    |
                char(2)
boolean
        <2> 참조형 (Reference type, 객체형) 변수
            - 형변환 방향(위로)
                Object
                    |
                Human
                    |
                Superman
    (2) 유효범위에 따라
        <1> 멤버변수 (member variable = Field)
            - 굳이 초기화를 하지 않아도 된다.
            ex) int i; (선언만 해도 된다)
        <2> 메소드 지역변수(local variable)
            - 반드시 초기화를 해야한다.
            ex) int i = 0;

8. 제한자
    (1) 정의
        클래스, 인터페이스, 변수, 상수, 메소드, 생성자
        앞에 붙어서 기능을 제한하는 keyword
    (2) 종류
        <1> 접근제한자
            public(제한이 없음) > protected(상속관계)
            > default(같은 패키지 안) > private(클래스)
        <2> 소유제한자
            static
            : static 붙으면 class 의 소유
              안 붙으면 객체의 소유
        <3> 수정제한자
            final
            : 붙으면 수정할 수 없게 만드는 제한자
            1) field : 상수가 된다
            2) method : 재정의(overriding) 안됨
            3) class : 상속 안됨
        <4> 추상제한자
            abstract
            1) class : 추상클래스
            2) method : 추상메소드({}가 없는 것)
            - 추상메소드가 1개라도 있으면 추상클래스가
               되어야 한다.
        <5> 기타
            synchronized, transient, volatile, native...

9. 오버로딩과 오버라이딩
    (1) 오버로딩 (overloading)
        <1> 정의
            메소드의 이름은 같은데, 인수의 개수나 type,
            순서가 다른 형태의 메소드로써 이름만 같지
            별개의 메소드인 것을 말한다.
        <2> 조건
            인수(parameter)의 개수나 type, 순서가
            달라야한다.
        <3> 종류
            - 생성자 오버로딩
            - 메소드 오버로딩
    (2) 오버라이딩(overriding)
        <1> 정의
            상속관계가 있는 클래스에서 부모 클래스의
            메소드 내용을 자식클래스에서 재정의하는 것
        <2> 조건
            - 반환타입이 같아야 한다.
            - 인수(parameter)의 개수나 type, 순서가
                모두 같아야 한다.
            - 부모클래스의 오버라이딩될 메소드의
                접근제한자보다 자식클래스에서 재정의하는
                메소드의 접근제한자의 범위가
                같거나 더 커야한다.

10. this, super
    (1) this -  자기 자신(class)의 객체
    (2) super - 부모클래스의 객체

11. 식별자(identifier)
    (1) 정의
        개발자가 임의로 만드는 패키지, 클래스, 메소드,
        변수명 등을 의미
    (2) 규칙 (어기면 컴파일 에러 발생)
        <1> 식별자의 첫문자는 특수문자, 숫자여서는
            안된다. (_, $는 예외)
        <2> 문자와 숫자, 특수문자(_, $)로
            조합할 수 있다.
        <3> 예약어를 사용하면 안된다.
        <4> 길이의 제한은 없다.
    (3) 관례
        <1> 의미있는 단어를 사용한다.
        <2> 클래스와 인터페이스의 첫문자는 대문자
        <3> 단어의 결합으로 되어있을 경우 다음 단어의
            첫번째 글자를 대문자로 하거나 _로 연결한다
            ex) TestClass, getName, set_name
        <4> $문자는 사용하지 않는다.

12. 연산자
    (1) 산술연산자
        +, -, *, /, %
    (2) 증감연산자
        ++, --
    (3) 대입연산자
        =
    (4) 산술 할당(대입) 연산자
        +=, -=, *=, /=, %= ...
    (5) 비트연산자
        &, |, ^, ~(not은 무조건 반대로 0->1 1->0)
    (6) 쉬프트 연산자
        <<, >>, >>>(부호보장X)
    (7) 논리 연산자
        &&, ||, &, |, !
    (8) 삼항(조건) 연산자
        조건식 ? 참일때 : 거짓일때
    (9) instanceof 연산자
        - 형식 :
            Reference Type 변수 instanceof Class 명
        - 앞의 변수가 뒤의 클래스와 상속관계인지를
            알아보는 연산자
13. 조건문(Condition)
    (1) if(boolean 형) {}문
        (body내용에 명령이 한문장이면 {} 생략가능 )
    (2) if(boolean) {} else {} 문
    (3) if(boolean) {} else if {} else {} 문
    (4) switch(값) { case : ... default : } 문

14. 반복문
    (1) for(초기식; 조건식; 증감식) {}
    (2) while(boolean) {}
    (3) do {} while(boolean);

15. 제어의 이동
    (1) break : 블럭({})을 나간다.
    (2) continue : continue 문 이후의 명령을
                실행하지 않고 건너뛴다.
    (3) return : 메소드를 호출한 곳으로 제어권을
                    넘긴다.
   
16. interface(인터페이스)
    (1) 정의 : 명세서이다(골격이다)
                모든 메소드가 추상메소드, 모든 field가
                상수로 구성된 것.
                클래스에 다중 상속이 가능하다.
    (2) 특징
        <1> 인터페이스끼리 다중 상속이 가능하다.
            ex) Inter1 extends Inter2, Inter3
        <2> 클래스에서 인터페이스를 다중상속 가능하다
            ex) InterClass implements Inter1, Inter2
        <3> 형태
            - field에는 public static final 생략 가능
            - method에는 public abstract 생략 가능
        <4> 인터페이스를 구현(상속)하는 클래스에서는
            반드시 메소드를 재정의(overriding)해야 한다.

17. abstract class (추상 클래스)
    (1) 정의
        추상 메소드를 가질 수 있는 클래스
    (2) 특징
        <1> 추상 클래스는 객체를 생성할 수 없다
            (완벽한 설계도가 아니다)
        <2> 하위 클래스가 추상클래스가 아니면
            반드시 추상메소드를 구현(재정의)해야만 한다.
    (3) 추상메소드 : 메소드의 body({})가 없는,
        선언만 되어있는 메소드

18. 배열 (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}

19. 예외처리
    (1) 예외(Exception)의 정의
        프로그램이 정상적으로 진행되지 못하게 하는
        돌발 상황
    (2) 계층도
        Object
            |
        Throwable
        |            |
    Error        Exception
                |            |
CheckedException    RuntimeException
    (3) 예외처리의 목적
        프로그램 진행시에 발생할 수 있는 상황들을
        정해놓고, 해당 상황 발생시 적절한 조치를
        취해서 프로그램이 정상적으로 작동하도록
        하는 것이다
    (4) 예외처리의 특징
        <1> Exception 은 메소드, 생성자에서 발생한다.
        <2> 발생시킬때에는(던질때에는) throw 라는
            예약어를 사용한다.
            ex) throw new MKException();
        <3> 메소드를 호출한 곳으로 throws 라는
            예약어를 사용해서 Exception 객체를
            넘긴다(또 던진다)
    ex) void main() throws IOException, Exception
        <4> 잡는 방법
            try {
                예외가 던져지는 구문
            } catch(예외클래스 변수명) {
                예외처리 구문
            }
        <5> catch 절(clause)에서 두개 이상의
            Exception 을 잡을 경우 반드시 하위 Exception
            부터 잡아야한다.
            ex) try {
                 }catch(IOException ie) {
                 }catch(Exception e) {}
        <6> finally 절
            try 절과 함께 쓰이며, catch 절의 실행유무와
            상관없이 무조건 실행된다.
            (return 문이 나와도 실행한다.)
        <7> 자동으로 throws 되고, 잡지 않아도 되는 예외
            RuntimeException, Error
            - throws 안해도 되고, 해도 된다.
            - try catch 안해도 되고, 해도 된다.

20. 중첩클래스(Nested class)
    (1) 정의 : 클래스 안에 있는 클래스
    (2) 종류 (static 제한자 유무에 따라)
        <1> static nested class
            ex) Outer.InnerStatic in
                    = new Outer.InnerStatic()
        <2> inner class
            ex)Outer out = new Outer();
                Outer.Inner in
                    = out.new Inner();
        <3> anonymous inner class
            이름이 없는 클래스, 기존의
            클래스(인터페이스)를 클래스 내부에서
            상속받아서 새롭게 정의하는 클래스

21. 주요 클래스
    (1) Object (가장 상위 root class)
        - equals(), hashCode(), toString()
    (2) String (불변 클래스 immutable)
        <1> 한번 생성된 객체의 내용을 연산이나
            메소드의 사용에 의해 변화시킬 수 없다
        <2> 문자열 비교시 반드시 equals 메소드를
            써야한다.
    (3) StringBuffer (가변 클래스 mutable)
        한번 생성된 객체의 내용이 연산이나 메소드를
        통해서 변화한다.
    (4) Math
        상수와 static 메소드만으로 구성

22. 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)
        <5> Map : key와 value로 이루어진 것, 중복된
                    key 불가능
       
        // 순서가 있는 계열
        <6> SortedSet : ascending(오름차순)의
                        순서로 요소를 가진다.
        <7> SortedMap : key값을 오름차순으로
                        가진다.
            ex) 사전, 전화번호부
       
        // ETC
        <8> Enumeration : 각각의 요소를 나열된
                        형태로 가지고 있다.
        <9> Iterator : remove가 가능하다.
   
    (3) implementations (구현체들 class)
        <1> Set
            1) HashSet : TreeSet 보다 빠르다
            2) TreeSet : SortedSet 에서 구현, 정렬
        <2> List
            1) ArrayList : LinkedList 보다 빠르다
            2) LinkedList : List 의 부분적으로 요소를
                    추가하거나 삭제하거나 하는 일이
                    많을때 빠르다.
        <3> Map
            1) HashMap : 빠르다.
                            null 키와 null value값을 허용
            2) TreeMap : SortedMap 에서 구현 정렬된다.
            3) LinkedHashMap : 집어넣는 순서로 정렬,
                            거의 HashMap 만큼 빠르다.

        <4> synchronized (동기화) 계열
            1) Vector (List 계열)
            2) Hashtable (Map 계열)
                : null 키, null value 허용 안함.
   
    (4) Collections : 각종 Collection 관련 유틸 클래스

23. Thread
    (1) Process : 컴퓨터 내에서 실행중인 프로그램
    (2) Thread 란?
        한 프로그램내에서 동시에 두가지 일을 수행하는
        것으로 프로세스보다 작은 업무단위이며,
        프로세스의 resource(자원)를 공유하기 때문에
        가볍다는 장점이 있다.
    (3) 생성
        <1> java.lang.Thread 를 상속받는 방법
        <2> java.lang.Runnable 을 구현하는 방법(권장)

        - 실행 : start() 호출하면 JVM이 자동으로
            run() 메소드 실행
    (4) 소멸
        run() 메소드의 실행이 끝나면 terminated된다
    (5) 멀티 쓰레드 (Multi Thread)
        여러개의 쓰레드를 동시에 수행하는 것
    (6) 쓰레드 Life Cycle : ppt 참조
    (7) 동기화 (synchronized)
        synchronized 로 되어있는 곳은 실행중인
        쓰레드가 lock(monitor)를 소유하고 실행이
        끝난 뒤 unlock (monitor를 반환)해 주는 것
        한마디로 한번에 하나의 쓰레드만 실행된다
    (8) 우선순위 (priority) :
        MIN(1), MAX(10), NORM(5)
    (9) wait(), notify(), notifyAll() : wait 폴더 참조

//////////////////// 5.0 변경사항 /////////////////
24. Generics
    (1) 특성
        <1> Type 안정성을 갖춘 컬렉션을
            만들 수 있다.
        <2> 컴파일 시점에 Type에 대한 검증을 한다
    (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 element)
                    public E get(int index)
                 }
        <3> 메소드 선언(호출)시
            1) 선언 : void list(ArrayList<E> list)
            2) 호출 : x.list(list);
        <4> 인스턴스 생성시
            ex) ArrayList<E> list = new ArrayList<E>();
    (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)
                public void setHuman
                    (ArrayList<? extends Human> list)
        <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)

25. 확장 for 문 (Enhanced for loop)
    (1) 형식
        for(데이터형 변수명 : 배열이나 컬렉션 객체)
    (2) 특징
        Generics 와 같이 쓰여서 효율적인 Collection
        계열의 루핑이 가능하다.
        ex) ArrayList<Integer> list =
                                new ArrayList<Integer>();
            for(Integer i : list)

26. Autoboxing / Unboxing
    (1) 정의
        <1> Autoboxing : primitive type 변수를
                            Wrapper class 로 자동 변환
        <2> Unboxing : 반대의 경우
    (2) 특징
        오토박싱은 -128~127의 범위에 있는 정수값의
        경우에만 같은 오브젝트로의 리턴을 보장한다.

27. 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) 열거 타입 그 자체가 타입이다.

28. 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))

29. static import
    (1) static class, static variable, enum 등의
        값을 사용할때 타이핑을 더 적게 해보자는 의도
        ex) import static java.lang.Math.*;
            import static java.lang.System.out;

30. Annotation (metadata)
    (1) @("at") 표시와 어노테이션 이름으로 표현한다
    (2) BuiltIn(내장) annotation
        <1> Override Annotation
            오버라이드가 되지 않으면 컴파일러에서
            문제를 표시한다.
        <2> Deprecated Annotation
        <3> SuppressWarning Annotation
            컴파일러가 warning(예를 들어서 generics
            를 안쓰면 발생)을 나지 않게 해준다.

31. StringBuilder
    (1) StringBuffer의 unsynchronized version이다
    (2) 멀티쓰레드 환경에서 안전하지 않지만 StringBuffer
        에 비해서 속도면에서 월등하다
    (3) StringBuffer 와 동일한 메소드를 제공한다.
[출처] http://canworld.tistory.com/192