programming/Java

JAVA basic grammar (자바 기본 문법)

Roien 2021. 12. 22.
반응형

JAVA 기본 실행 class

public class Hello
{
    public static main(String[] args)
    {
    }
}

class 정의 방법

public class A
{
}

class B
{
}


주석

   1. JAVA DOC 형태

    html file로 주석을 저장

/** ~~~ */

    주석 생성 (html file로)
    javadoc test.java       -> test.html file 생성
    
    
    2. 그냥 주석

    /* ~~~ */
    //


자바 식별자 규칙과 관례

    identifier
        : 변수나 상수, 메소드, class등을 이름 짓는 것
        ex. index, _Variable, Test100, $var, 이름 <- 가능
            3_grade, class, this, #abc <- 불가능 (특수 문자는 _와 $만 가능)


관례


    class, interface의 첫 번째 이름은 항상 대문자
    클래스 이름은 noun
    
    변수 명, method 명
        첫 번째 문자는 항상 소문자
        getName(), getPointSize(), name, age, deptName
    
    상수 이름 관례
        상수는 모두 대문자 (단어 사이는 _ 로 연결)
        ex. MAX_VALUE
        
        참조형 상수는 
        대/소문자 모두 사용
        
        black, darkGray, UndefinedProperty
        
    
        JAVA keyword list
            abstract, assert, boolean, break, byte, case, catch
            char, class, continue, default, do, double
            else, extends, false, final, finally, float, for, goto, if
            implements, import, instanceof, int, interface
            length, long, native, new, null, package, private,
            protected, public, return, short, static, super, switch,
            synchronized, this, throw, throws, transient, true, try,
            void, volatile, while
            
            특이한 것
                abstract, extends, final, finally, implements, import, instanceof, interface
                native, package, super, synchronized, throws, transient
            
        const, goto는 현재 JAVA에서 keyword가 아님
        TRUE, FALSE, NULL도 아님
        sizeof도 아님

        

자바의 기본형 변수


    변수를 선언하면, JVM이 메모리를 할당
    
    메모리 구조
        class area  <- JAVA의 method, code, constant
        stack area  <- local variables
        heap  area  <- stack 영역의 변수가 참조형 일때, 참조형 변수가 참조하는 실제 값을 저장하는 영역
        
    
    primitive type
        boolean, char, byte, short, int, long, float, double
        JAVA에서 double은 64 bits

    reference data type
        메모리의 크기가 고정되지 않고 가변적인 데이터
        new operation을 사용해서 동적으로 heap 영역에 데이터를 할당하고 주소 값을 참조하여 사용.

    class TestVar {
        public static void main(String[] args){
            String msg;                 // only declaration
            msg = new String("~~~");    // must be executed for memory allocation
            
            String msg2 = new String("~~");
            
            String msg3 = "~~";         // literal 만으로도 object가 생성 (String은 unicode 사용 - 2 bytes per char)
        }
    }

     
    자바의 참조형 변수는 메모리의 주소값을 갖기에 pointer와 유사하나, C의 pointer와는 달리 산술 연산이 불가능하다.
    (즉, const pointer인 셈이다)
    
    JAVA의 primitive 변수 size는 platform에 independent하다. (늘 동일하다)
    
    boolean     b-bit                           true/false
    char        16-bit unicode                  '\u0000' ~ '\uffff'
    byte        8-bit  signed integer           -127 ~ 127
    short       16-bit signed integer           -32768 ~ 32767
    int         32-bit signed integer           -21억 ~ 21억 (-2^31 ~ 2^31 - 1)
    long        64-bit signed integer           -920해 ~ 920해 (-2^63 ~ 2^63-1)
    float       32-bit signed floating point    1.4E-45 ~ 3.4028235E38
    double      64-bit signed floating point    4.9E-324 ~ 1.7976931348623157E308
    
    JAVA API에는 primitive type에 대한 wrapper class들이 있다.
    이를 사용하여 데이터 type의 maximum value와 minimum value를 query할 수 있다.
    
    ex. 
    byte type : Byte.MAX_VALUE
    
    char ch1 = '\n';    // new line
    char ch2 = '\r';    // carriage return
    char ch3 = '\t';    // tab
    char ch4 = '\u88ab' // unicode
    char ch5 = 'a';
    
    \u 뒤에는 2-byte UNICODE값 즉, 4자리의 16 진수가 올 수 있다.
    
    double doubleVal = 1.34e10;
    double doubleVal2= 0.2d;
    double doubleVal3= 0.3D;
    
    float floatVal1 = 3.14E5F;
    float floatVal2 = 0.2f;
    
    f or F 가 없으면 double로 사용.
    
    lonb longVal = 1L;      // L or l
    long longVal2= 076L;    // 8  진수
    long longVal3= 0x1234L; // 16 진후
    

ex.

public class PrimitiveDataTest {
    public static void main(String[] args)
    {
        boolean b;
        long l = 10L;
        float f = 3.14f;
        char c;
        
        c = 'a';
        b = true;
        
        System.out.println(" booelan b = " + b);
        System.out.println(" long    l = " + l);
        System.out.println(" char    c = " + c);
        System.out.println(" float   f = " + f);
    }
}


자바의 연산자


    type cast
    
    float f = 0.1f;
    int i = (int)f;
    
    // (data_type) 이 방식은 boolean 은 안됨.
    
    자동 형변환 - wide cast
    명시적형변환 - shorten cast
    
    자동 형변환의 예
    byte b = 10l
    int i = b;
    
    byte -> short -> int -> long -> float -> double
    char -> int -> long -> float -> double
    
    산술 연산자
    
    ++val
    val++
    --val
    val--
    는 test를 해 보자.
    
    ++val과 val++의 순서가 C와는 반대

    비교 연산자
    instanceof
    
    val1 instanceof val2        <-- val1이 val2의 객체인 경우 true
    
    ex.

    String str1 = new String("~~");
    if (str1 instanceof String)
    {
        // str1이 String type instance이면 true
    }

     
    expressionA && expressionB
    // expressionA가 false면 B의 조건을 검사하지 않고 out
    
    expressionA || expressionB
    // expressionA가 true면 B의 조건을 검사하지 않고 in
    
    그러나 
    
    expressionA & expressionB
    // 이 경우는 둘 다 계산을 수행 (bit 연산 이므로)
    
    if ((s != null) && (s.length() > 0))
    {
        ....
    }
    
    이 경우 
    
    if ((s != null) & (s.length() > 0))
    {
    }
    
    이와같이 작성하게 되면, s가 null인 경우 s.length()를 수행하여 exception 발생
    
    bit operation
    
    >>>     val1 >>> val2       : val1을 val2 만큼 우측으로 shift하고 왼쪽에는 0이 채워짐
    

삼항 연산자

expression ? true시 : false시;
    
    
    * 연산자 우선순위
    -----------------

    +-------------------------------------+
    | 1       () [] .                     |
    +-------------------------------------+
    | 2       ++ -- ~! (data_type)        |
    +-------------------------------------+
    | 3       * / %                       |
    +-------------------------------------+
    | 4       + -                         |
    +-------------------------------------+
    | 5       >> >>> <<                   |
    +-------------------------------------+
    | 6       > >= < <=                   |
    +-------------------------------------+
    | 7       == !=                       |
    +-------------------------------------+
    | 8       &                           |
    +-------------------------------------+
    | 9       ^                           |
    +-------------------------------------+
    | 10      |                           |
    +-------------------------------------+
    | 11      &&                          |
    +-------------------------------------+
    | 12      ||                          |
    +-------------------------------------+
    | 13      ?:                          |
    +-------------------------------------+
    | 14      =및 각종 축약된 대입 연산자 |
    +-------------------------------------+



int table[][] = new int[10][10];
table.length 가능
table[0].length 가능

int 역시 class이며, 여러 operation을 지니고 있다.


    break;

    out_ter: for (int i = 0; i < 3; i++)    // out_ter는 임의로 지정한 것
    {
        for (int j = 0; j < 2; j++)
        {
            if (i==2)
                break out_ter;
            System.out.println("i = " + i + ", j = " + + j);
         }
    }

  

배열 선언 방법

    int intArray[];
    double [] dArray;
    String strArray[];
    
    이후 = new type[size]; 를 수행해야 한다. (초기화에 바로 하는 것도 가능)
    
    intArray = new int[5];
    하고
    intArray.length는 5이다. 개수임.
    
    배열을 선언하면, 초기화 값이 자동으로 들어간다.
    
    모두 0이며, boolean은 false이고, char는 '\u0000', float는 0.0f, double은 0.0d, long은 0L, 참조형 변수 type은 null이다.
    
    int intArray[] = {10, 20, 30};  // 가능
    String sArray[] = {"hello", "exam"};

ex.

        final int k_nums = 5;

        int [] numbers_1 = new int[5];
        int numbers_2[] = new int[5];
        for (int i = 0; i < k_nums; ++i) {
            numbers_1[i] = i;
            numbers_2[i] = i;
        }

        for (int i = 0; i < k_nums; ++i) {
            print(numbers_1[i]);
            print(numbers_2[i]);
        }

    

다차원 배열

    int twoDimArray[][] = new int[4][10];
    int twoDim[][] = new int[4][];
    
    twoDim[0] = new int[5];
    twoDim[1] = new int[4];


    ..
    
    즉, 2차원 배열이 동적인 길이를 지닐 수 있다.
    
JAVA class 내에는 main method가 반드시 정의 되어 있어야 한다.
    main만큼은 예외적으로 객체의 일부로서 호출되지 않을 수 있다. (JVM에서 자동으로 호출하게 된다)

modifier
    class, member variable, method 앞에 해당 class나 member variable, method들을 사용할 수 있는 권한을 지정하거나 활용 방법을 지정하는 몇 개의 keyword를 제공
    이런 keyword가 modifier
    
    modifier들은 public, protected, private, static, final, abstract 등이 있고, 각각의 의미가 있음
    
    JAVA app.의 main method는 사용자가 정하는 것이 아니라 이미 정해져 있는 modifier를 사용하게 되어 있는데, 
    public과 static이라는 modifier가 사용된다.
    
main의 arg 사용 ex.

    public static void main(String arg[])
    {
        for (int i = 0; i < arg.length; i++)
        {
            System.out.println("arg = " arg[i]);
        }
    }



    java ArgTest param1 param2  <- 와 같이 실행 가능
    위와 같이 실행하면, arg[] = {"param1", "param2"} 이런 식으로 저장된 상태가 된다.
    
연산자 casting
    실수 + 실수 -> 실수
    실수 + 정수 -> 실수
    정수 + 실수 -> 실수
    정수 + 정수 -> 정수
    
    String + non-String(실수 혹은 정수) -> non-String을 String으로 자동 변환 한 후 문자열로 결합해 준다.
   

    public static void main(String arg[])
    {
        int first = Integer.parseInt(arg[0]);       // String을 int로 변경
        double dVal = Double.parseDouble(arg[1]);   // String을 double로 변경
    }


    
switch

    int genger = 0;
    switch (gender) {
        case 0:
            // ...
            break;
        case 1:
            // ...
            break;
        default:
            break;
    }


    
this

    class Person {
        
    }
    
    class Student{
        String name;
        
        Student(String name)
        {
            this.name = name;       // member를 access하는 this의 사용
        }
        
        Student()
        {
            this("none");           // this를 사용한 생성자 호출
            
            // super(..);           // super는 하위에서 상위의 생성자 호출 시 사용
        }
    }



package
    관련 class와 interface들을 하나의 folder or directory에 적절히 배치 가능
     => 이것이 package
     
    package는
        충돌회피
        관리 용이
        access 권한을 package 단위로 제어
        
    ex.
        java.lang.Integer
        java.io.FileInputStream
    
    

* import keyword

    package화 된 class들을 사용하기 위한 예약어
    (별도 지정 없을 시 default package 사용 - default는 현재 java source file이 위치한 같은 directory)
    
    java.lang은 별도의 import를 안해도 사용 가능
    
    ex. 

    import java.lang.Integer;
    import java.io.FileInputStream;
    import java.awt.*;                  // 하나의 package 내의 여러 class 사용 경우 *로 표현
    
    ex.
    Date d = new Date();        // Date는 java.util package 내의 api임. - package name의 언급이 없으므로 에러


    -->   

java.util.Date d = new java.util.Date();


    
    그러나 위처럼 하면 귀찮으니..

    
    import java.util.Date;
    class..{
        Date d = new Date();
    }


    
    ex.

    import java.util.Date;
    import java.util.ArrayList;
    
    class..{
        Date d = new Date();
        ArrayList array = new ArrayList();
    }


    
    ex.

    import java.util.*;
    
    class..{
        Date d = new Date();
        ArrayList array = new ArrayList();
    }


    

    * package keyword
    

    사용자가 작성한 클래스 package 화를 위함
    연관성 있는 class들의 package 화
    

    package package_name;
    
    class class_name
    {
    }
    
    public class class_name2 {
    }

 

상속과 인터페이스
    

    JAVA 언어에서는 class 선언부에 extends 키워드를 명시하지 않은 경우라도 java.lang.Object class를 자동으로 상속받게 된다.
    

    class Student {
    }


    라고만 해도 Object class는 자동 상속
    즉, 위 코드는 

    class Student extends Object {
    }


    와 같음     
    JAVA에서는 extends 다음에 다중 상속이 불가능하다.
    
멤버 변수의 상속
    private < default(no modifier) < protected < public
    
    상위의 메소드에 no modifier면, 하위는 public/private/protected 모두 선언 가능
    상위 method가 public이면, 하위도 public으로만 가능
    

    class Base {
        void Method(int num1) throws IOException {}
    }
    
    class Drived extends Base {
        public void Method(int num1) throws Exception   <-- 에러 -- IOException 외에 다른 종류의 exception을 포함하여 error
        {
        }
    }

 

 

final

    final int VAL = 20; // constant 화
    final class AClass {...}    // final class는 하위로 subclassing 불가능
    
    final method는 overriding이 불가능
    

abstract

        class와 method에 사용          
        instance화 불가능         
        abstract method는 subclass에서 overriding해야 한다.
        
        abstract class로 해야하는 경우
            1) abstract method를 지닌 경우
            2) 상위 class가 abstract method를 지녔는데, overriding 하지 않은 경우
            3) interface를 상속받고 상위의 모든 method를 overriding 구현 하지 않은 경우
        
        final과 abstract는 동시에 사용 불가능
    
    interface
        모든 method가 abstract method임
    
생성자 호출과 super keyword
    class Base {
        int memVar = 100;
        int Method(int num)
        {
        }
    }
    
    class Drived extends Base
    {
        int memVar = 200;
        
        public void Method(int memVar)
        {
            this.membVar = memVar;
            super.Method(this.memVar);
            System.out.println(super.memVar);
        }
    }
    
    super는 객체를 의미하므로,
    static member는 super를 사용할 수 없음


static class

    public class Main {
        ...
        static class Person {     <- static이 아니면, static context에서는 non-static 변수인 this를 참조할 수 없음 에러
            int m_age;                static method이므로, this가 없어서 
            String m_name;

            Person(int age, String name) {
                m_age = age;
                m_name = name;
            }
        }

        public static void main(String[] args) {
            ...
            Person person = new Person(30, "A");
        }
    }

 

객체의 형변환과 다형성
    

    class Parent {}
    class Child1 extends Parent{}
    class Child2 extends Parent{}
    
    Parent p;
    Child1 c1 = new Child1();

    p = c1;     // 가능 (자동 형 변환 - super type의 원리)
   

    Parent p = new Child1();     
    Child1 p = new Parent();    /// 에러
    
    Child2 c2 = new Child1();   // 에러 (상속 관계 없기 때문)
    Child2 c2 = (Child2)new Child1();
    Parent p = new Parent();
    Child c1;
    c1 = (Child1)p; //// 에러만 안나고.. 잠재적 문제를 지님

 

    

    class Employee {
        int empBoune;
        void calcSalary() { salary = base + empBonus; }
    }
    
    class Manager extends Employee {
        int manBonus;
        void setDept() { dept = "Manager"; }
    }
    
    Employee e1 = new Manager();
    
    Manager man = (Manager)e1;
    man.manBonus = 700;     // 가능
    man.setDept();          // 가능


    그러나 불편하고, 좋지 않다. (잠재적 위험성)     
    instanceof 연산자를 사용하자. 
   

    void aMethod(Employee emp) {
        if (emp instanceof Manager) {       // 하위로 생성된 상위 reference 이면, (즉, 확인을 하자는 것)
            Manager man = (Manager)emp;
            man.setDept();
        }
    }

     
    상위의 function을 하위에서 override하고, 상위의 reference로 하위를 가리킬때, override된 method를 call하면, 하위것이 호출됨 (virtual이 기본인 것)
    

Interface

    멤버변수는 상수로           - public static final 변수만 포함
    메소드는 abstract로 선언    - public abstract method만 포함
    생성자 없음
    
    즉, 객체생성 불가능
    super 사용 불가능
    
    abstract class는 부분적으로 완성된 미완성 설계도 <- abstract method와 implemented method 모두 포함 가능
    interface class는 구현이 없는 blue print라고 할 수 있음
    
    inetrface는 다중 상속 가능
    
    ex.

    interface Teachable
    {
        public final static String JOB = "teacher";
        public abstract void teach();
    }

 

    
    인터페이스 내에서 
    public static final 혹은 public abstract등은 생략 가능 (interface가 알아서 추가해 줌)
   

    interface Teachable {
        String JOB = "~";
        void teach();
    }
        
    interface Learnable {
        String TASK = "~~";
        void learn();
    }
    
    class PostGraduate implements Teachable, Leanable {
        public void teach()
        {
            System.out.println("~~~");
        }
        
        public void learn()
        {
            System.out.println("~~~");
        }
    }


    interface의 상속은 implements로 상속 (다중 상속 가능)
   

    Teachable t = new PostGraduate();
    t.teach();  // Teachable interface가 teach를 가지고 있기에 가능
    t.learn();  // Teachabel interface가 learn을 가지고 있지 않기에 불가능 (에러)

    t instanceof Teachable <- 을 사용하여 형변환 type을 확인 가능
    

예외 처리

    ex. 예외 상황

    Object o = new Integer(100);
    String s = (String)o;   // Intergert type으로만 casting 가능 - 예외 발생
    FileInputStream in = new FileInputStream("a.txt");  // file이 없으면 예외 발생
    String s = null;
    if (s.length() >= 0) {...} /// 예외

 

 

예외 class
    

    Exception --> ClassNotFoundException
              --> ClonNotSupportedException
              --> InstantiationException
              --> IOException
              --> ...
              --> RunttimeException
                    --> ArithmeticException
                    --> IllegalArgumentException
                    --> IndexOutOfBoundsException
                    ...
                    --> ClassCastException

    에외 발생 시, 
    JVM에 의해서 예외 객체 생성 전달
    예외 처리 NO --> 예외 처리가 된 구문 수행
    or
    예외 처리 YES--> 에러 메시지를 화면에 출력하고 수행 정지
   

    
    class ExceptionTest {
        public static void main(String arg[])
        {
            int x[] = new int[4];
            int i = 0;
            
            while (true)
            {
                i = (int)(Math.random() * 10);
                System.out.println("x[" + i + "] = " + x[i]);       // 예외를 발생 시킴..0~3의 index가 아니면, 예외 처리 확인 위한 test 코드
            }
        }
    }

 

 

예외 처리

        try-catch
       

        try 
        {
            예외가 발생할 만한 코드 - 여기서는 out of bound exception test를 위해서 x[i] <-- i 값이 문제 있는 값일 수 있는 경우
        }         
        catch (ArrayIndexOutOfBoundException e)     // index에 벋어난 access를 하게 되면 이리로 온다.
        {
            예외처리 코드
        }         
        catch (Exception e)                         // catch block은 나열된 순서대로 처리하게 된다.
        {
            나머지 예외 처리
        }

 


finally 키워드

        try-catch와 유사         
        try-catch는 예외 타입에 따라서 실행이 안 될수도 있음         
        finally block은 예외의 발생 여부와 관계없이 실행됨
       

        try {
            fd = FildOpen("test.txt");
            fd.read();
        }
        catch (IOException e) {
            ....
        }
        finally {               // finally block 다음에는 catch가 와도 소용 없음
            CloseFile(fd);
        }
        try {
            fd = FildOpen("test.txt");
            //fd.read();
            return;
        }
        catch (IOException e) {
            ....
        }
        finally {               // try block 내에 return이 있어도 finally block은 실행됨. (finally block을 실행하고 return 됨)
            CloseFile(fd);
        }

     
예외의 간접 처리
        throws 키워드         
        메소드 내부의 예외를 다른 메소드로 전달
        

        void method1(void)
        {
            ...
            try {
                t.method2(args[0]);
            }
            catch ( notFoundException이 e ){
                ...
            }
        }
        
        void method2(String name)
        {
            throws ClassNotFoundException {
                Class.forName(name);            // name 의 class가 존재하지 않으면 notFoundException이 발생하고 -> t.method2를 호출한 곳으로 notFoundException을 전달
                ...
            }
        }



    public static void main (String args[]) throws ClassNotFoundException {.. <-- 기본 예외 처리기에 일임한다는 것     
    예외 처리를 안 하면 안되는 경우가 존재하며 이때 예외처리가 없다면, 에러 처리
    
    예외 처리는 
        1) exception이 발생된 곳에서 try-catch를 사용
        2) 예외가 발생한 메소드를 호출한 곳으로 예외를 넘기는 throws 처리
        

Exception의 종류

        1) Exception class 상속 계열
            ClassNotFoundException
            ClonNotSupportedException
            InstantiationException
            IOException
            
            예측 가능한 예외들이기에
            compiler가 처리하기를 요구
            
        2) Exception --> RuntimeException
                                --> ArithmeticException
                                --> IllegalArgumentException
                                --> IndexOutOfBoundsException
                                --> NullpointerException

            프로그래머의 부주의로 발생할 수 있는 예외들이기에,
            compiler에서 처리를 하지 않는다.

Multi-threading programming

    java.lang.Thread class
    
    java.lang.Thread    <-- class
    java.lang.Runnable  <-- interface class
    
    

1. java.lang.Thread를 상속 받아서 thread를 구현하는 경우

        1) Thread class의 상속
        2) run() method를 overriding
        3) 객체 생성
        4) start() method를 호출하여 thread를 실행

    class MyThread extends Thread {
        public void run() {
            ...
        }
    }
    
    class TestMyThread {
        public static void main (String args[]) {
            MyThread myThread = new MyThread();
            myThread.start();
        }
    }

     

2. java.lang.Runnable interface
    

    다른 상위 class를 상속 받으면서 multithread로 동작할 class를 정의한다면,
    자바 언어의 한계로 인하여 다중 상속이 불가능하기에,
    java.lang.Thread를 상속 받을 수 없음.
    
    이 경우, java.lang.Runnable interface를 구현하는 방법으로 multi-thread를 구현
    
    방법
        1) Runnable interface를 구현하는 class를 정의
        2) run() method를 overriding
        3) 객체 생성
        4) 위에서 생성한 객체를 Thread type의 객체로 casting
        5) start()
        
    ex. 
   

    class MyRunnable implements Runnable {
        public void run()
        {
            ...
            while (1) 
            {
                ...
            }
        }
    }
    
    class TestMyRunnable {
        public static void main (String args[])
        {
            MyRunnable myRunnable = new MyRunnable();
            Thread athread = new Thread(myRunnable);
            athread.start();
        }
    }


Thread 상태도와 Scheduling

    JVM이 사용되는 Platform에 따라서 다름
    new, start, ready, run, dead, suspend --> (waiting, sleeping, joining, blocked)
    
    ready는 start()를 실행 시켰지만, OS에 의해서 아직 실행되지 못한 상태
 

   suspend의 상태 4가지 

  •         sleeping : 일정 시간 기다림
  •         waiting  : notify() event를 기다림
  •         joining  : JOIN된 다른 thread의 실행 완료를 기다림
  •         blocked  : IO method등의 호출로 인하여 해당 메소드가 종료될 때까지 기다리는 상태
            

 

우선순의

    1~10
    기본은 5 (클수록 높음)
    
    Thread

        getPriority();
        setPriority();



        MIN_PRIORITY
        NORM_PRIORITY
        MAX_PRIORITY
    
    Thread.sleep(1);      // 1ms동안 sleep
    
    

join

    어떤 thread의 join method를 호출하면, join을 호출한 thread는 실행시킨 어떤 thread의 동작의 종료까지 기다림
    --> 어떤 thread의 동작 결과를 사용하고자 할때 사용될 수 있음    

    class JoinThread implements Runnable {
        int i = 0;
        public void run() {
            try {
                Thread.sleep(10);
                i = 10;
            }
            catch (InterruptedException e) {
                ...
            }
        }
    }
    
    public class TestJoinThread {
        pubilc static void main (String args[]) {
            try {
                JoinThread joinT = new JoinThread();
                Thread thread = new Thread(joinT);
                
                thread.start();
                thread.join();
                
                System.out.println(thread.i);   // 여기서 thread의 i는 10의 값을 지님
            }
            catch (Exceptoin e<font style="background-color: #000000"></font>) {
                ...
            }
        }
    }


Synchronized (동기화)

    특정 시간에는 하나의 thread만 동작 시키고 싶은 경우 사용     
    어떤 thread가 synchronized라고 정의된 method를 사용 중일 때는, 다른 thread들이 종료를 기다림.
    -> 하나의 class 내에서만..

    class SyncThraed extends Thread {
        public synchronized void syncFunc() { ... }
        
        public void run()
        {
            syncFunc();
        }
    }
    
    class TestSyncThread {
        public static void main(String args[])
        {   
            SyncThread t1 = new SyncThread();
            SyncThread t2 = new SyncThread();
            t1.start();
            t2.start(); // t2의 syncFunc의 호출은 t1의 syncFunc의 호출이 완료 될 때까지 막힘 (동기화됨)
        }
    }


wait(), notify()

synchronized는 하나의 method 뿐만 아니라, 해당 class 내에서 여러 method에 대해서 사용 가능 (ex. send, receive method)
    그러나 순서대로의 실행을 보장해 주지는 못함
    
    순서대로 번갈아 실행을 시키고자 하면, 
    wait(), notify()로 처리

    class MainBox {
        public synchronized void storeMsg(String msg) {
            while (m_waitCond == true) {
                wait();
            }
            
            m_waitCond = true;
            msg 처리            
            notify();       // waiting 상태의 thread를 ready 상태로 이동
        }
        
        public synchronized String SendMsg() {
            while (m_waitCond == false) {
                wait();
            }
            
            m_waitCond = false;
            msg 처리            
            notify();            
            return msg;
        }
    }


java.lang package의 주요 class들

object class

    equals()

    toString()
    
    모든 class의 최상위 class
    extends java.lang.Object를 선언하지 않아도 기본적으로 상속받음
    
    Object
        equal       : 두 객체가 같으면 true         (== 로도 가능)
        toString    : 현재 객체의 문자열 표현 리턴  

                       (class_name@object_code_value_as_16bit_hexa) <- ex. MyObject@c17164)
        clone       : object의 복사
        finalize    : gabage collection 직전에 객체의 resource 정리 시 호출
        getClass    : 객체의 class type return
        hashCode    : 객체의 코드 값 리턴
        notify      : wait 된 thread 실행 재개 시 호출
        notifyAll   : wait 된 모든 thread 실행 재개 시 호출
        wait        : 스레드 일시 중지 호출
        wait(long)  : 주어진 시간만큼 thread 일시 중지 시 호출
        wait(lg,it) : 주어진 시간만큼 thread 일시 중지 시 호출 (lg는 long, it는 int)
        
        
    System.out.println( <-- 여기에 object를 주면, toString method가 자동 호출되어 처리된다. )
    
    

String class

    java.lang.String
        한번 만들어진 String class 객체의 값은 변경 불가능

Wrapper class

    Wrapper class
    
    ex.

    Integer class
    
    int i = 10;
    Ingeger.toBinaryString(i); ---> 1010
    Integer.toHexString(i);     --> A
    Integer.toString(i);       ---> 10

 

    
    기본형 변수 type의 데이터를 다양한 연산이 가능하도록 유용한 method들을 모아 놓은 utility 형식의 class가 Wrapper class이다.
    
    자바의 기본형 변수들은 모두 8가지,
    각 기본형 변수에 대응되는 Wrapper class가 존재하므로, Wrapper class또한 8 종류가 제공
    

    Wrapper class 이름  --- Primitive variable type
    -----------------------------------------------
    Boolean                 boolean
    Character               char
    Byte                    byte
    Short                   short
    Integer                 int
    Long                    long
    Float                   float
    Double                  double



    Wrapper class로 객체를 생성하기
    
    boolean b = true;
    Boolean wb = new Boolean(b);
    
    int i = 100;
    Integer wi = new Integer(i);
    
    위 과정이 J2SE 1.5 부터는 Auto-boxing에 의해서 아래와 같이 처리 가능
    
    int i = 20;
    Integer in = i;
    
    자동으로 wrapper class type의 type-casting
    
    Unboxing도 제공
    
    Integer in = 20;
    int val = in;
    
    Integer arr []  = new Integer[3]; 도 가능
    

java.util package와 collection framework

SWING component와 Event 처리 programming
    JFC(Java Foundation Class)는 AWT(Abstract Window Toolkit), SWING과 같은 자바 GUI programming API 임
    SWING은 AWT와 유사한 기능을 수행하지만, AWT와는 달리 platform 마다 다른 interface를 제공
    
    AWT는 OS에 따라서 실행되는 program의 모습이 차이를 보일 수 있음.
    SWING component는 JAVA language에서 각각의 component를 rendering하고 기능을 구현하는 새로운 기술인 lightweight component 기법을 적용한 것.
    

SWING component의 package들

    javax.swing         UI SWING component class 포함 package
    javax.swing.border  SWING package 경계선 처리 요소 포함 package
    javax.swing.event   java.awt.event package 내에 정의된 event 외에 SWING에서 추가적으로 사용될 수 있는 각종 event 및 리스너 제공 package
    javax.swing.tree    javax.swing.JTree 생성 class와 interface 제공 package
    javax.swing.table   javax.swing.JTable 생성 class와 interface 제공 package
    
    
    100개 이상의 classes
    
    SWING component들은 javax.swing.JComponent로부터 상속받고, JComponent가 java.awt.Container로부터 상속받으므로 SWING component들은 container 역할을 수행
    
    java.lang.Object
    java.awt.Component
    java.awt.Container
    javax.swing.JComponent
    SWING components
    
    SWING component는 AWT component와 비교될 수 있는 component와(modified) SWING에서 새롭게 추가된 component로 구분하여 볼 수 있다.
    

1) AWT component와 대응되는 SWING component 관계

    JComponent
        AbstractButton <--  AbstactButton <---- JCheckBoxMenuItem
                                          <---- JMenu
                                          <---- JRadioButtonMenuItem
                            JComboBox
                            JList         <---- JCheckBox
                                          <---- JRadioButton
                       <--  JLabel
                       <--  JMenuBa
                       <--  JPanel
                       <--  JScrollBar
                       <--  JTextComponent <-- JTextArea
                                           <-- JTextField <-- JPasswordField
                                           <-- JEditorPane <-- JTextPane



    SWING에서 새롭게 소개되는 components
        JComponent
            JColorChooser
            JDirectoryPane <-- FileChooser
            JInternalFrame
            JLayeredPane <-- JDesktopPane
            JProgressBar
            JSlider
            JSplitPane
            JTablePane
            JTable
            JToolBar
            JToolTip
            JTree

    

반응형

댓글