2016년 2월 11일 목요일

[SQL 교육] DBMS

[sql 교육] dbms

(*본 게시물은 본인이 교육을 통해서 배우는 내용을 정리하는 글입니다. 부족한 부분이 많으니 참고해주시기 바랍니다. 혹시 정확한 의미를 알고 싶으시거나, 틀린 내용에 대해 조언해주시고 싶은 분들께서는 댓글을 남겨주시면 최대한 빠르게 답변하겠습니다. 감사합니다.)
※ Oracle DB를 사용합니다.


  1. DBMS
    1. 데이터베이스를 관리할 있게 해주는 시스템
    2. DBMS 제공하는 벤더
      1. Oracle - Oracle(동시접송성이 좋지 않다.)
      2. Microsoft - MS SQL
      3. Dell - Dell EMC 인수. EMC DBMS 제공. 주로 storage
      4. 오픈소스
        1. MySQL(지금은 Oracle 인수)
        2. MariaDB(MySQL Oracle 인수되어 언제 상용화될지 몰라서 사람들이 많이 이동함.)
        3. PostgreSQL('포스트그레스큐:', '피쥐에스큐엘' 이라고 읽음)
          1. 동시접속성이 좋다.(KT 아이폰 예약에 사용한 사례가 있다. KT 많이 사용한다.)
    3. DBMS 성능 평가 요소
      1. CAP이론
        1. Consistency 일관성
          1. 값이 갑자기 혼자 바뀌어서는 안된다. (제어하지 않았는데도 변동되는 것이 없어야 한다.)
        2. Availability 가용성
          1. 언제든지 DB 접근하여 사용할 있어야 한다.
        3. Partition Tolerance
      2. 보통 DBMS들의 위의 3가지중 2가지(일관성과 가용성) 초점을 둔다.
  2. 수업에서 배울 SQL&PL/SQL 주요 내용
    1. SQL
      1. DML(데이터 조작 언어)
        1. CRUD(Create, Read, Update, Delete)라고 표현한다.
        2. 종류
          1. insert
          2. update
          3. delete
          4. select
      2. DDL(데이터 정의 언어)
        1. ex. create table, alter table
    2. PL/SQL
      1. 기본구조
      2. 제어문
      3. 함수
      4. 프로시저
      5. 트리거
      6. 예외처리
      7. 커서
    3. 연산자, 함수
    4. 트랜젝션 Transaction
      1. atomic : 여러 개의 문장들이 원자적으로 수행되도록 한다.
    5. 객체
      1. table
      2. index
      3. view
      4. sequence
      5. synonym
      6. partitioned table
    6. 조회
      1. select 이용
      2. 종류
        1. selection
          1. 내가 원하는 행만 뽑아내는
        2. production
          1. 내가 원하는 열만 뽑아내는
        3. join
          1. 두개 이상의 테이블에서 조회 하는
    7. Oracle Express Edition 11g 설치
      1. 설치방법이 아래 주소에 설명되어 있다. 수업과 동일하다.
      2. http://www.oraclejavanew.kr/bbs/board.php?bo_table=LecOracle&wr_id=206
  3. Objects
    1. table : 실질적으로 데이터를 저장
      1. table 정의
        1. create table
        2. 타입과 이름
        3. 제약 조건
    2. view : 가상의 table, 단순한 쿼리문을 사용하기 위해서, 접근제어를 하기 위해서
    3. index : view 성능을 높이기 위해 만든
      1. pk/uk : 자동 생성
      2. 삽입/삭제가 빈번하지 않고 조회가 빈번하면 index 좋은 객체이다.
      3. 삽입/삭제가 빈번하면 매번 index(색인) 다시 정해줘야 하므로 비효율적이다.
    4. sequence : 자동으로 증가하거나 감소하는 .
    5. synonym : 동의어, 데이터베이스 객체에 대한 별칭을 부여한 객체
    6. partitioned table : 논리적으로는 1개의 Table이지만 실제로는 여러 파티션으로 나뉘어 저장한다.
    7. function, procedure
  4. Data Type
    1. DBMS마다 다를 있다.
    2. 문자
      1. char
        1. 고정길이
        2. ex. char(10) - 크기는 무조건 10
        3. 2000byte까지 가능
      2. varchar
        1. 가변길이
        2. ex. varchar2(10) - 크기는 저장한 문자열의 크기
        3. 4000byte까지 가능(한글 2000)
      3. nchar, nvarchar2
        1. 유니코드를 지원
      4. long
        1. 2GB까지 지원
        2. like 연산 불가능
    3. 숫자
      1. number
        1. number(p,s)
          1. p 소수점 기준 모든 유효숫자 자릿수를 의미, s 소수점 이하 유효숫자 자릿수
        2. float
        3. binary_float
          1. 최대 4byte
        4. binary_double
          1. 최대 8byte
    4. 날짜
      1. date
      2. timestamp
    5. LOB
      1. Large Object
      2. 대용량 데이터를 저장
      3. 종류
        1. CLOB : 문자형 대용량 객체
        2. BLOB : 이진형 대용량 객체
        3. NCLOB : 유니코드를 포함한 문자형 대용량 객체
        4. BFILE : 대용량 이진 파일에 대한 로케이터(위치, 이름) 저장
  5. Constraints 제약조건
    1. NN : 반드시 값을 필요
    2. UK : 유일 해야 한다. Null 가능하다.
    3. PK : 기본키
      1. UK, NN 만족해야 한다.
    4. FK : 다른 table 열을 참조한다.
    5. CK : 체크
      1. 입력 데이터를 체크해 특정 조건에 맞는 데이터만 입력 받는다.
      2. 값의 범위를 설정할 있다.
  6. 예시
    1. 고객정보를 저장
      1. NO : NUMBER(4), PK
      2. 이름 : VARCHAR2, NN
      3. 이메일 : VARCHAR2, UK
      4. 나이 : NUMBER(3)
    2. sql developer

[JAVA 교육] 객체 직렬화(Object Serialization)

[JAVA 교육] 객체 직렬화(object serialization)


(*본 게시물은 본인이 교육을 통해서 배우는 내용을 정리하는 글입니다. 부족한 부분이 많으니 참고해주시기 바랍니다. 혹시 정확한 의미를 알고 싶으시거나, 틀린 내용에 대해 조언해주시고 싶은 분들께서는 댓글을 남겨주시면 최대한 빠르게 답변하겠습니다. 감사합니다.)

1. Object Serialization

1. 개념
  1. App data Object 멤버변수를 이용해서 관리하고 저장하거나 전송하는 .
    1. 저장하고 싶을 객체 자체를 그대로 저장한다.
    2. 객체가 아닌 단순 text 저장할 때의 단점
      1. 구분자를 넣어야 한다.
      2. 파싱 해야한다.(파싱 : 구분자를 기준으로 문자열을 쪼개고 위치의 문자가 어떤 의미인지 파악하는 과정)
    3. 객체를 저장
      1. 단점 : 다시 읽을 어떤 객체인지 확인하기 위해서   클래스가 필요하다.
      2. 장점 : 개발자가 저장을 위해 일이 적다.
2. 종류
  1. 자바의 직렬화 : Sun(, Oracle)에서 만든
    1. 자바의 직렬화를 위해 사용되는 클래스
      1. ObjectInputStream
      2. ObjectOutputStream
  2. ProtoBuf(Protocol Buffers)
    1. 구글에서 만든
    2. 서로 다른 언어간 데이터 전송을 위한 프로토콜
    3. 이기종 플랫폼 간에 구조화 데이터를 쉽게 주고 받을 있도록 하는
  3. AVRO
    1. Apache 재단에서 만든
    2. 주로 빅데이터를 직렬화하는 용도
3. 자바에서의 구현
  1. implements Serialization : Serialization 인터페이스를 구현한다.
    1. Serialization 인터페이스는 marker 인터페이스이다.
  2. 직렬화 클래스
    1. ObjectInputStream
      1. readObject() : 읽어 들일 반드시 형변환을 해줘야한다.(Object 형으로 return되기 때문이다.)
    2. ObjectOutputStream
      1. writeObject()
  3. serialVersionUID 입력해 주어야 한다.
    1. 클래스의 구조가 변경되더라도 serialVersionUID 같으면 동일 클래스임을 보장한다.
  4. transient라는 속성이 있다.
    1. 변수에 선언하는 제한자이다.
    2. transient 선언된 변수는 직렬화에서 제외된다.(직렬화 없거나 하고 싶지 않은 변수에 선언한다.)
    3. transient 반드시 붙여야 하는 경우가 있다.
      1. 예로, thread 직렬화 되지 못하도록 짜여져 있다.
      2. thread 사용되는 변수는 직렬화 제외해야 한다.

2016년 2월 6일 토요일

[JAVA 교육] I/O 입출력

[JAVA 교육] I/O 입출력


(*본 게시물은 본인이 교육을 통해서 배우는 내용을 정리하는 글입니다. 부족한 부분이 많으니 참고해주시기 바랍니다. 혹시 정확한 의미를 알고 싶으시거나, 틀린 내용에 대해 조언해주시고 싶은 분들께서는 댓글을 남겨주시면 최대한 빠르게 답변하겠습니다. 감사합니다.)


1. I/O(입출력)
        a. 단위
                i. byte
                        1) InputStream
                        2) OuputStream
                ii. char
                        1) Reader
                        2) Writer
        b. 노드
                i. 노트 스트림 클래스
                ii. File
                        1) FileInputStream
                        2) FileOutputStream
                        3) FileWrite
                        4) FileReader
                iii. Socket
                iv. Pipe
                v. Memory 메모리
        c. 필터
                i. 필터 스트림
                ii. 내가 원하는 (data type)객체 단위로 입출력
                        1) DataInputStream
                        2) DataOutputStream
                iii. Buffering
                        1) BufferedInputStream
                        2) BufferedOutputStream
                iv. Object 직렬화
                        1) 직렬화를 위해서는 직렬화 할 객체의 클래스가 반드시 Serializable을 implements해야한다.
                        2) ObjectInputStream
                        3) ObjectOutputStream
        d. 직렬화 클래스
                i. implements Serializeable
                        1) 메서드를 가지고 있지 않은 Marker Interface이다.
                ii. serialVersionUID - 변수이다.
                        1) static final
                        2) 클래스 구조변경이 이전 클래스와 같은 클래스임을 확인하기 위함.

2016년 2월 4일 목요일

[JAVA 교육] Thread 쓰레드 / Generic 제네릭 / Collection framework

[JAVA 교육] Thread 쓰레드 / Generic 제네릭 / Collection framework

(*본 게시물은 본인이 교육을 통해서 배우는 내용을 정리하는 글입니다. 부족한 부분이 많으니 참고해주시기 바랍니다. 혹시 정확한 의미를 알고 싶으시거나, 틀린 내용에 대해 조언해주시고 싶은 분들께서는 댓글을 남겨주시면 최대한 빠르게 답변하겠습니다. 감사합니다.)

  1. Thread 쓰레드
    1. 프로세스와 쓰레드 비교
      1. 프로세스
        1. 프로그램
        2. 보통 한 프로그램이 한 프로세스
        3. but, 한 프로그램이 여러 프로세스를 실행할 수도 있다.(ex. 크롬에서 각 탭이 각 프로세스)
      2. 쓰레드
        1. 최소실행단위
        2. 멀티쓰레드 가능(한 프로세스 안에서 여러 쓰레드가 실행)
        3. 프로세스 안의 실행 단위
    2. main 쓰레드
      1. main() 메서드를 실행
      2. 다른 thread를 생성하고 실행한다.
    3. 생성/실행
      1. 코드
        1. Runnable 인터페이스를 구현하는 방법.
          • class MyRunner implements Runnable {
                public void run(){ }
            }
        2. Thread 클래스를 상속받아서 구현하는 방법.
          • class MyThread extends Thread {
                public void run() {  }
            }
        3. Runnable 익명 객체(익명 클래스)를 이용하여 구현할 수도 있다.
        4. 만일, 구현해야할 함수가 1개라면 별도의 클래스를 만들지 않고 람다식으로 코드를 작성해도 된다.
          람다식은 별도의 클래스를 만들지 않고 아래와 같이 작성한다.
          • Thread thread = new Thread( () -> {
                //쓰레드가 실행할 코드..
            } );
        5. run()
          1. run()함수에 쓰레드가 실행할 코드를 작성한다.
      2. 쓰레드 생성
        • ex1. Thread t1 = new Thread(runnable 객체);
        • ex2. Thread t2 = new MyThread();
        • 쓰레드를 구현할때는 Thread클래스를 상속받는거 보다 Runnable 인터페이스를 구현하는 것이 권장된다. 왜냐하면 Thread를 상속 받으면 다른 클래스를 상속 받을 수 없기 때문이다.
      3. 쓰레드 실행
        • ex. t1.start();
    4. 자바에서는 쓰레드 스케줄링 기법으로 우선순위(Priority)방식과 순환 할당(Round-Robin)방식을 사용한다.
      1. 우선순위가 높은 쓰레드를 먼저 수행하되, 우선순위가 동일하다면 순환 할당 방식으로 쓰레드를 실행한다.
      2. 순환 할당 방식은 시분할 방식이다. 각 쓰레드가 정해진 시간 만큼 수행되고 다시 대기 상태가 된다.
    5. 흐름도
      1. 기본 흐름도
        Runnable(대기)상태와 Running(실행)상태가 반복된다.
      2. Running상태에서 sleep()명령이 오면 TIME_WAITING상태에 들어갔다가 sleep 시간이 끝나면 Runnable 상태가 되었다가 순서가 오면 Running상태가 된다.

        • 여기서 동기화 문제가 발생한다. 쓰레드 1번이 공유객체 값을 100으로 설정하고 sleep 된 동안아 쓰레드 2번이 공유객체 값을 50으로 설정하면 쓰레드 1번은 sleep에서 돌아왔을때 공유객체의 값이 바뀌어 있다. 이를 동기화 문제라 한다.
        • 이를 해결하기 위해서 synchronized를 이용한다. 쓰레드가 synchronized된 공유객체를 참조하려하면 Lock pool에서 BLOCKED상태로 빠진다. Lock pool에서 lock flag를 획득하면 공유객체를 참조 할 수 있고 참조가 끝나면 lock flag를 반환한다.
        • 쓰레드가 공유객체의 lock flag를 획득한 상태에서 sleep명령을 받으면 lock flag를 그대로 가진 상태에서 TIME_WAITING 상태가 된다. 그래서 sleep 동안에 다른 쓰레드가 공유객체를 참조할 수 없다.
        • 실행중인 상태에서 wait() 함수가 수행되면 Wait pool에서 WAITING상태로 들어간다. 대기하다가 notify()함수가 수행되면 BLOCKED상태가 된 후 대기 상태가 된다.
    6. 쓰레드풀(or Bean Pool)
      1. 갑작스런 병렬 작업의 폭증으로 인한 쓰레드의 폭증을 막기 위해 사용한다.
      2. 쓰레드를 제한된 갯수로 정해 놓고 작업 큐에 들어오는 작업들을 하나씩 쓰레드가 맡아 처리한다.
      3. 작업 처리가 끝난 쓰레드는 다시 작업 큐에 돌아온다.
    7. Thread 클래스의 메서드
      1. yield()
        1. 실행 중에 우선순위가 동일한 다른 쓰레드에게 실행을 양보하고 실행 대기 상태가 된다.
        2. 다른 쓰레드가 종료될 때까지 기다린다는 보장은 없다.
      2. join()
        1. 다른 쓰레드의 종료를 기다린다.
        2. join()을 호출한 쓰레드의 종료가 될 때까지 대기한다.
        3. ex. ThreadA에서 ThreadB.join() 을 실행하면 ThreadA는 ThreadB가 종료 될 때까지 대기한다.
      3. wait()
        1. 동기화 메소드 또는 블록에서만 호출 가능한 Object의 메서드이다.(Thread의 메서드가 아니다.)
        2. wait()함수가 포함된 함수를 호출한 쓰레드를 일시정지 상태로 만든다.
        3. notify(), notifyAll() 함수에 의해 실행 대기 상태로 갈 수 있다.
      4. stop()
        1. 쓰레드를 즉시 종료시킨다.(run()메서드가 정상적으로 끝나지 않는다.)
        2. 위험한 종료 방법이다.
      5. interrupt()
        1. 쓰레드를 종료시킨다.
        2. 안전하게 run()메서드를 정상적으로 종료한다.)
  2. Generic 제네릭
    1. 자바5부터 새로 추가되었다.
    2. Collection에서 널리 사용된다.
    3. 제네릭이 제공해주는 기능(이점)
      1. Type safety
        1. 컴파일 시에 강한 타입 체크를 할 수 있다.
        2. 객체를 리턴받을 때 형변환 하지 않아도 된다.
    4. 제네릭 타입
      1. 타입을 파라미터로 가지는 클래스와 인터페이스
      2. 선언 시 클래스 또는 인터페이스 이름 뒤에 "<>"를 붙인다.
      3. "<>" 사이에는 타입 파라미터 위치
      4. 제네릭 타입은 두개 이상의 타입 파라미터 사용 가능하다.
        1. ex. class<K, V, ... >, interface<K, V, ... >
    5. 제네릭 메서드
      1. 리턴 타입 앞에 "<>"기호를 추가하고 타입 파라미터를 기술한다.
    6. 와일드카드 타입
    7. 제네릭 타입의 상속과 구현
      1. 제네릭 타입을 부모 클래스로 사용할 경우 타입 파라미터는 자식 클래스에도 기술해야한다.
      2. 자식 클래스에는 추가적인 타칩 파라미터를 가질 수 있다.
      3. 인터페이스의 경우도 동일하다.
  3. Collection framework
    1. Collection
      1. 특징 : 순서가 없다, 중복을 허용한다.
      2. Set
        1. 순서가 없고, 중복도 허용하지 않는다.
        2. 순서가 없어서 index를 사용하는 get, set을 지원하지 않는다.
        3. Set 인터페이스를 구현한 클래스
          1. HashSet
          2. TreeSet
            1. Comparable한 TreeSet은 값을 넣을 때 자동으로 정렬한다.
      3. List
        1. 순서가 있고, 중복을 허용한다.
        2. List 인터페이스를 구현한 클래스
          1. ArrayList
          2. LinkedList
          3. Vector - Thread safe
            1. synchronized 되어 있다는 것. 그래서 싱글쓰레드에서는 성능이 떨어지니까 사용 안한다.
    2. Map
      1. Key와 Value의 쌍으로 구성된다.
      2. Map 인터페이스를 구현한 클래스
        1. HashMap
        2. Hashtable
        3. TreeMap
        4. Properties
      3. Key는 unique해야한다. = 중복이 되면 안된다.
    3. 데이터 정렬
      1. Comparable
        1. CompareTo() 스스로 다른 객체와 비교가 가능
          1. 디폴트 비교 규칙을 정할 때 사용한다.
      2. Comparator
        1. Compare() 두 객체를 비교
          1. 부가적인 비교 규칙을 정할 때 사용한다.
        2. CompareTo() 이외의 다른 비교 규칙을 만들고 싶을때, Comparator 인터페이스를 구현한 별도의 비교기 클래스를 만들어서 정렬할 수 있다.
          1. ex. Set<NameCard> cardList2 = new TreeSet<>(new NameCardComparator());
          2. NameCardComparator라는 비교기 클래스를 별도로 만들어서 저렇게 인자로 넣어준다.

2016년 2월 3일 수요일

[JAVA 교육] 예외 Tip / equals Tip / etc Tip

[JAVA 교육] 예외 Tip / equals Tip / etc Tip
(*본 게시물은 본인이 교육을 통해서 배우는 내용을 정리하는 글입니다. 부족한 부분이 많으니 참고해주시기 바랍니다. 혹시 정확한 의미를 알고 싶으시거나, 틀린 내용에 대해 조언해주시고 싶은 분들께서는 댓글을 남겨주시면 최대한 빠르게 답변하겠습니다. 감사합니다.)


  1. Tip
    1. Interface는 자식클래스에서 구현이 어떻게 될 지 모르니깐 예외를 throws 하지 않는다.
    2. Callee에서 에러가 발생하는데 그 원인이 Caller 가 전달해준 매개변수 때문일때,
      1. Runtime Exception이 발생하는 것이면 Callee에서는 try-catch도 안해도 되고, throws도 안해도 된다.단지 Caller에서 try-catch만 처리하면 된다.
      2. Checked Exception이 발생하면 Collee는 예외발생의 원인이 자신이 아니더라도 try-catch로 처리해줘야한다.
        하지만 이런경우 Callee에서만 예외를 처리하면 정작 예외발생의 원인이되는 Caller는 예외인줄도 모르고 자신이 올바르게 작업했다고 생각한다. 그래서 Callee의 catch문에서 throw new RuntimeException("에러문구") 를 수행한다.
        그런뒤에 Caller에서는 예외가 던져져 왔으니깐 try-catch문을 써서 catch에서 Exception 또는 RuntimeException으로 받는다.
        1. 왜 이렇게 하냐면 일례로 Caller가 전달한 매개변수로 인해서 Collee에서 SQLException이 발생할 경우 Caller 에서 catch에 SQLException을 처리해버리게 하면 Caller는 Callee의 예외에 종속되어버린다. 이렇게 클래스가 다른 클래스에 종속되는 것은 좋지 않다.
    3. Java에서 객체를 동등 비교 할때는 equals를 사용한다. 기본 클래스가 아니면 equals를 사용하기 위해서는 클래스에 equals 메서드를 재정의 해줘야 한다.
    4. HashSet, HashMap, Hashtable에서는 동등비교에서 바로 equals로 값을 비교하지 않고 객체의 hashcode를 먼저 비교한다. 객체가 같으면 hashcode가 같다.
      1. 객체의 비교를 hashcode로 할 때, 두 객체의 hashcode가 다르면 두 객체는 같지 않다는것이 보장된다. 하지만 그렇다고 해서 두 객체의 hashcode가 같다고해서 두 객체가 같다는 것은 보장되지 않는다.
      2. 결론적으로 equals 동작은 hashcode를 먼저 비교하고 hashcode가 같을때, equals로 비교한다.
        (equals보다 hashcode 수행속도가 더 빠르다.)
      3. HashSet, HashMap, Hashtable에서 객체의 동등비교를 위해서 hashcode와 equals를 모두 사용하기 때문에 내가 만든 클래스에 equals를 재정의할때는 hashcode도 재정의 해줘야한다.
    5. 객체를 복제할 때는 clone을 이용하는 것이 편리하다. 기존 객체의 필드값을 모두 새로운 객체에 옮겨 담으려면 필드가 많을수록 점점 어렵고 불편해진다. clone을 이용하면 편리하게 객체 자체를 복제할 수 있다.
      1. clone을 사용하기 위해서는 복제하고 싶은 클래스에 Cloneable을 implements해야한다.
      2. 재정의 clone함수를 만들면 함수 내부에서 객체를 생성하고 super.clone() 으로 객체를 복제하여 리턴한다.
      3. !!주의!! clone하려는 객체에 기본타입이 아닌 객체타입의 멤버가 있으면 원본과 clone이 같은 객체타입 멤버를 가리킨다.!! 이 경우에는 해당 객체멤버는 clone함수 내에서 new로 다시 생성해서 할당해야 한다.
    6. 객체가 GC쓰레드에 의해서 소멸될 때는 finalize 함수가 호출된다.
    7. 강제로 GC쓰레드를 실행시키려면 System.gc() 를 이용한다.
      1. ex. 영상처리같이 한번에 메모리가 많이 차지할 때는 강제적으로 GC쓰레드를 작동시킬 때도 있다.
    8. 정규표현식과 Pattern클래스
      1. 문자열이 특정 패턴과 일치하는지 확인할 수 있다.
      2. 패턴을 정규표현식이라고 하고, Pattern클래스의 메서드로 일치 여부를 확인할 수 있다.

2016년 2월 1일 월요일

[JAVA 교육] Interface 인터페이스 / 내부클래스 / 예외 - 실습예제

[ Class Diagram ]


[소스코드 : OperationApplication.java]

package sk.didimdol.exercise.operation;

public class OperationApplication {
      public static void main(String[] args) {
            OperationMenu opmenu = new OperationMenu();
             opmenu.runApp();
      }
}

[소스코드 : OperationMenu.java]

package sk.didimdol.exercise.operation;

import java.util.Scanner;

public class OperationMenu {
      char menu;
      Operation op = new Calculator();

      public void runApp(){
            mainMenu();
      }

      public void mainMenu(){
            Scanner scan = new Scanner(System. in);
             boolean key = true;
             while( key){
                  System. out.println( ">> 메뉴를 선택하세요." );
                  System. out.print( ">>(A)dd, (S)ub, (M)ultiple, (D)ivide, (Q)uit : ");
                   menu = scan.next().toUpperCase().charAt(0);
                   switch( menu){
                   case 'A':
                        System. out.print( ">> 덧셈입니다. 두 수를 띄어쓰기로 구분하여 입력하세요. : " );
                        displayResult( op.add( scan.nextInt(), scan.nextInt()));
                         break;
                   case 'S':
                        System. out.print( ">> 뺄셈입니다. 두 수를 띄어쓰기로 구분하여 입력하세요. : " );
                        displayResult( op.sub( scan.nextInt(), scan.nextInt()));
                         break;
                   case 'M':
                        System. out.print( ">> 곱셈입니다. 두 수를 띄어쓰기로 구분하여 입력하세요. : " );
                        displayResult( op.multiple( scan.nextInt(), scan.nextInt()));
                         break;
                   case 'D':
                        System. out.print( ">> 나눗셈입니다. 두 수를 띄어쓰기로 구분하여 입력하세요. : " );
                        displayResult( op.divide( scan.nextDouble(), scan.nextDouble()));
                         break;
                   case 'Q':
                        System. out.println( "프로그램을 종료합니다." );
                         key = false;
                         break;
                   default:
                        System. out.println( "잘못된 메뉴를 선택하셨습니다. 다시 선택하세요." );
                  } //end switch
            } //end while
      }//end mainMenu

      public void displayResult( int x){
            System. out.println( "계산된 값 : "+x);
            System. out.println( "");
      }
      public void displayResult( double x){
            System. out.println( "계산된 값 : "+x);
            System. out.println( "");
      }
}

[소스코드 : Operation.java]

package sk.didimdol.exercise.operation;

public interface Operation {
      int add(int a, int b);
      int sub(int a, int b);
      int multiple(int a, int b);
      double divide( double a, double b);
}

[소스코드 : Calculator.java]

package sk.didimdol.exercise.operation;

public class Calculator implements Operation{

      int resultInt;
      double resultDouble;

      @Override
      public int add(int a, int b) {
             resultInt = a + b;
             return resultInt;
      }

      @Override
      public int sub(int a, int b) {
             resultInt = a - b;
             return resultInt;
      }

      @Override
      public int multiple(int a, int b) {
             resultInt = a * b;
             return resultInt;
      }

      @Override
      public double divide( double a, double b) {
             resultDouble = a/ b;
             return resultDouble;
      }

}

[JAVA 교육] Interface 인터페이스 / 내부클래스 / 예외

[JAVA 교육] Interface 인터페이스 / 내부클래스 / 예외
(*본 게시물은 본인이 교육을 통해서 배우는 내용을 정리하는 글입니다. 부족한 부분이 많으니 참고해주시기 바랍니다. 혹시 정확한 의미를 알고 싶으시거나, 틀린 내용에 대해 조언해주시고 싶은 분들께서는 댓글을 남겨주시면 최대한 빠르게 답변하겠습니다. 감사합니다.



  1. Review - 다형성
    1. 상속관계
    2. 다형적 객체
      1. 다형적 객체는 선언하는 타입과 생성하는 타입이 다르다.
      2. 선언은 부모클래스 - class, abstract class, interface(모든 method가 다all 추상 method)
      3. 생성은 자식클래스 - class
    3. 이종모음
      1. 서로 다른 타입들의 집합(배열)이 가능
      2. 배열 타입을 부모클래스로 선언하고 자식클래스 타입의 객체들을 저장
      3. 기본타입도 저장할 수 있게 하기 위해서 wrapper class를 지원(jdk 1.4 이하)
        1. 기본타입을 객체타입으로 변환
        2. jdk 1.5 이상은 Auto-Boxing 지원
    4. VMI ( Virtual Method Invocation )
      1. 컴파일시에는 선언한 클래스의 메서드 유무를 확인(메서드 시그니처의 유무만 확인)
      2. 런타임시에 객체를 생성해서 참조하는 클래스의 메서드를 실행(호출)
      3. 예. Object obj = new Circle();
              obj.draw();  //컴파일시에 에러. Object에는 draw() 메서드가 없기때문에.
              이런 경우에는 draw() 메서드가 존재하는 객체 타입으로 형변환 해줘야한다.
              (Circle클래스나 draw() 메서드를 가진 부모클래스로 형변환)
  2. Interface 인터페이스
    1. UML 표기법
    2. 기능의 명세 : 인터페이스의 메서드는 추상메서드
    3. 비교
      1. 클래스 : 상속 O, 객체 생성 O
      2. 추상클래스 : 상속 O, 객체 생성 X
        • 구현된 메서드, 구현 안 된 메서드를 모두 가질 수 있다.
      3. 인터페이스 : 구현, 객체 생성 X
        • 인터페이스를 구현한 자식클래스에서 인터페이스의 모든 메서드를 구현해주어야 한다.
        • 오직 구현되지 않은 메서드만 가질 수 있다.
        • 용도: 내가 어떤 기능이 있다고 외부로 알려주는 역할.
    4. 누가 사용하는가? Interface의 이해관계자.
      • to 개발자, Interface의 어떤 기능을 사용하는 사람. 메서드 원형을 보고 사용만 한다.
        "구현은 어딘가에 되어있으니깐 신경쓰지말고 코딩하세요."
        Association
      • to 벤더, Interface를 만드는 사람. Interface의 메서드를 구현하는 사람. (메소드 속을 채운다.)
        Realization
      • 위의 둘 사이에 표준을 정해주는 사람이 필요하다. Interface를 정의하는 사람.
    5. 선언 - interface
    6. 구현 - implements, 구현해주는 사람이 벤더(Interface를 만드는 사람)
    7. 멤버
      1. 변수 - 상수 - public static final
      2. 메서드
        • 추상 메서드 - public abstract (public은 안써도 자동으로 붙음)
        • default - 구현된 메서드(concrete method) - Java SE 8부터 가능
        • static 메서드 - 정적 메서드 - Java SE 8부터 가능

      3. Interface가 Interface를 상속할때는 extends 키워드 이용. 다중 상속 가능.
        • 여러 Interface를 extends에 넣을 수 있다.
  3. 내부클래스
    1. Inner Class
      1. (Instance) Inner Class
      2. Static Inner Class
        1. static이 붙은 Inner Class
        2. Top level class로 사용된다. = 정적 메서드나 정적 멤버를 갖는 클래스
    2. Local Class
      1. method안에서 정의되어 있는 class - Local 클래스
      2. 인자(argument)값으로 정의 - Anonymous class
    3. Local Interface
      1. Anonymous Class와 함께 사용 될 수 있다.
    4. 접근제한자 public, protected, package friendly, private 모두 사용 가능.
  4. 예외
    1. 정의
      1. mild한 에러(가벼운 에러)
      2. 예시
        1. 파일오픈을 하려하는데 파일이 없는 경우
        2. 네트워크 연결이 잠시 중단된 경우
        3. 배열의 범위를 넘어선 data 참조
    2. 상속관계
      1. Throwable
        1. Error
        2. Exception
    3. 처리
      1. try~catch
        • 예외의 원인이 본일일 경우 처리하는 것.
        • try블럭에서는 예외가 발생할 가능성이 있는 문장들을 넣는다. 실행 완료를 보장하지 않는다.
        • catch블럭은 예외가 발생하면 실행된다.
        • fianlly블럭은 예외가 발생해도, 안해도 항상 실행하는 블럭이다.
          리소스를 반납해야 하는 경우 finally블럭에 넣어준다.
      2. throws
        • 예외의 원인이 caller에 있을 경우, callee에서 하는 것.
    4. jdk 1.7에 추가된 예외 기능
      1. multi catch
        1. catch(AException | BException e)
        2. 이때 AException과 BException은 상속관계가 있으면 안된다.
      2. try-with-resources(문법은 아니다.)
        1. try () { ... }
          1. try(FileReader in = new FileReader("a.txt"))
        2. finally없이 리소스를 반납해준다.
        3. 성능적으로 기존보다 좋아진 것은 아니다. 단지 스타일이 추가된 것이다.
    5. 종류
      1. Runtime Exception
        1. Unchecked Exception : 예외 발생 유무를 컴파일 할때가 아니라 런타임에 확인한다.
        2. 예외처리 하지 않아도 컴파일은 된다.
      2. 그 외 나머지
        1. Checked Exception
        2. 컴파일시에 예외 발생 체크
    6. throw
      1. 예외를 발생 시킬때 사용한다.
  5. Tip
    1. Interface는 현재 내가 가지고 있는 기능을 외부로 알려주기 위한 용도.
    2. Interface의 default와 static메서드에 대해서 Java SE 8에 새로 나왔기 때문에 적절한 경우에 사용하면 좋겠다.
    3. 익명클래스(Anonymous Class) : 클래스 구현과 객체 생성을 한번에 한다. (주로 이벤트 처리할때 사용 on Android 개발)
      1. 객체 생성 옆에 바로 구현하니깐 클래스 이름이 필요없다. 그래서 익명 클래스.
      2. 마지막 중괄호 뒤에는 세미콜론을 붙여야한다.