[국비지원과정 Day 6-7] Java

📕ch11 추상화 & 인터페이스

1. 추상 클래스 & 추상 메서드

  • 추상 클래스(abstract class): 미완성 메서드(추상 메서드)를 포함하고 있는 클래스. 미완성 설계도
    인스터스를 생성할 수 없으며, 여러 클래스에 공통적인 부분을 뽑아내어 표준화하기 위한 용도로 활용된다.
  • 추상 메서드(abstract method): 메서드의 선언부만 작성하고 구현부가 없는 메서드.
    실제 수행될 내용이 작성되지 않은 미완성 상태이기 때문에, 이를 상속받은 하위 클래스에서 오버라이딩을 통해 구현한다.
    *cf. 추상화: 클래스에서 공통적인 변수와 메서드를 사용해 코드를 표준화 시키기 위한 작업
    /* 주석을 통해 어떤 기능을 수행할 목적으로 작성하였는지 설명한다. */
    /* 선언부만 존재 */
    abstract 리턴타입 메서드이름();
    

2. 인터페이스

  • 추상 클래스의 일종. 추상 메서드와 상수만을 멤버로 가질 수 있으며, 추상클래스보다 추상화 정도가 높다.
  • 인터페이스를 사용하는 이유, 장점
    (1) 유연한 설계가 가능하고 유지보수를 용이하게 하여 개발시간을 단축시킬 수 있다.
    (2) 표준화가 가능하다.
    (3) 서로 상속관계이거나, 같은 상위클래스를 공유하는 등의 상호관계에 있지 않아도 하나의 인터페이스를 공통적으로 구현하도록 함으로써 클래스들 간의 관계를 맺어줄 수 있다.
    (4) 클래스의 선언과 구현을 분리시길 수 있기 때문에, 실제 구현에 독립적인 프로그래밍이 가능하다.

    interface 인터페이스이름 {
      public static final 타입 상수이름 = 값;
        public abstract 메서드이름(매개변수목록);
    }
    
  • 인터페이스는 인터페이스로부터만 상속받을 수 있으며, 다중상속이 가능하다.
  • 인터페이스의 구현(implements): 인터페이스 그 자체로는 인스턴스 생성이 불가능하기 때문에 상속을 통해 추상 메서드를 완성한다. 이 경우, 키워드로 implements 를 사용하여 구분한다.
    *cf. 구현하는 인터페이스에 정의된 추상메서드 중 일부만 구현 하는 경우, abstract 를 붙여서 추상클래스로 선언해야한다.
    class 클래스이름 extends 상위클래스 implements 인터페이스{
      //인터페이스에 정의된 모든 추상메서드를 구현해야 한다.
    }
    


📕ch12 기본 클래스 활용: Object, String, Math, Wrapper

*cf. java.lang패키지: 는 Java 프로그래밍에 가장 기본이 되는 클래스를 포함하고 있는 패키지. import문 없이 바로 사용 가능하다.

1. Object class: 모든 클래스의 최상위 클래스

2. String class: 문자열을 저장하고 이를 다루는데 필요한 메서드를 제공

  • String의 불변성(immutable): 스트링의 내용은 final문자배열에 저장된다. 한번 생성된 String인스턴스가 갖고 있는 문자열은 읽어 올 수 만 있고 수정이 불가능하다.
  • String의 내용비교
    - A.equals(B): A와 B의 문자열(내용)을 비교. 타입이 String이 아니거나 문자열이 다르면 false를 반환
    - A == B: A와 B의 주소값을 비교.
  • String의 초기화: 빈 문자열(“”), null(객체가 가리키는 데이터가 없는 상태) 활용
    *cf. NullPointerException: 참조변수가 가리키는 내용이 없는 상태에서 연산을 실행했을 때, 예외발생
  • StringBuffer & StringBuilder 클래스: String클래스와 달리 내용을 변경할 수 있는 클래스

3. Math class: 수학계산에 유용한 기본적인 메서드 및 상수(자연수 E, 원주율 PI)를 정의해 놓은 클래스

4. Wrapper class: 기본형 값을 객체로 변환하여 작업을 수행할 수 있도록 8개의 기본 자료형을 클래스로 정의해 놓은 클래스.


📕ch13 컬렉션 & 제네릭스

  • 컬렉션: 집합데이터를 저장할 수 있는 자료형. 컬렉션 클래스들은 배열의 단점을 보완하기 위해 만들어진 것으로, 배열에 비해 속도가 느리고 메모리 사용량이 증가한다.
  • 컬렉션 프레임웍: 데이터 군을 저장하는 클래스들을 표중화한 설계(프로그래밍 방식)
    *ex. ArrayList, HashSet, HashMap 등
    *cf. 배열의 단점 : Object 배열 제외 같은 자료형만 저장 가능, 사이즈가 고정적. 추가/삭제가 어려움

1. 컬렉션 종류

(1) List: 순서가 있는 데이터의 집합. 터이터의 중복값을 허용하며 인덱스로 조회가 가능하다.

  • List의 생성 및 활용
    List<자료형> 참조변수 = new ArrayList<자료형>();
    참조변수.size(); 	//데이터의 개수	
    참조변수.add(값);	//데이터 추가
    참조변수.add(인덱스,값);	//해당 인덱스에 데이터 추가
    참조변수.get(인덱스);	//데이터 읽어오기: 
    참조변수.remove(인덱스);	//데이터 삭제:
    

(2) Set: 순서를 유지하지 않는 데이터의 집합. 중복값을 허용하지 않는다.
(3) Map: key와 value의 한 쌍으로 이루어진 데이터의 집합으로 대량의 자료를 조회할 때 유리한 구조. 데이터가 저장되는 순서는 없다. key(변수명, 중복X)로 조회가 가능하고, value는 중복을 허용한다.

  • 맵(HashMap) 활용
    맵.put(key, value)	//데이터 추가
    맵.get(key)	//데이터 조회
    


2. 제네릭스(Generics)

  • 하나의 클래스로 다양한 자료형의 데이터를 처리할 수 있는 방법.
  • 컴파일 시 타입체크를해주는 기능
  • 타입체크와 형변환 생략으로 코드가 간결해지고, 객체의 타입 안정성을 제공한다.
    class 클래스명<T> {}
    


📕14 예외처리

  • 어떤 원인으로 인해 프로그램이 비정상적으로 종료되는것을 막고, 정상적인 실행상태를 유지할 수 있도록 안전하게 처리하는 작업
  • 프로그램 실행 시 발생할 수있는 예외에 대비한 코드를 작성한다.
  • 발생원인: 네트워크 장애,사용권한 관련 문제, 존재하지 않는 파일 이름 입력, 입력값의 형식이 다른 경우, 연산 오류


(1) 프로그램 오류

  • 발생시점에 따라
    컴파일 에러: 컴파일 시에 발생하는 에러
    런타임 에러: 프로그램 실행 시에 발생하는 에러
    논리적 에러 : 프로그램 실행은 되지만, 의도와 다르게 동작하는 것

  • 에러, 경고, 예외
    Error: 컴파일이 안됨
    Warning: 실행은 되지만 성능 저하 등의 문제가 발생할 가능성이 있는 코드
    Exception: 컴파일과 실행은 되지만 프로그램이 비정상적으로 종료되는 경우


(2) 예외 처리를 하는 경우

  • 선택적인 예외 처리 : 예상되는 코드에 처리
  • 필수적인 예외 처리 : 파일입출력, 네트워크 관련 작업, DB연동 등


(3) 예외처리

  • try ~ catch 구문
    try {
        예외가 발생할 가능성이 있는 코드
    } catch(Exception e) {
        예외가 발생했을 때의 코드
    } finally {
      예외 발생 여부에 관계없이 항상 실행되는 코드
    }
    
  • throws 구문: 키워드 throw를 사용해 고의로 예외를 발생시킬수도 있다.
    Exception e= new Exception( ) ;
    throw e;  
    // 고의로 예외를 발생시킴
    
    void method() throws 예외처리클래스 {}
    
  • 예외가 발생할 경우의 해결 방법
    e.printStackTrace(); 
    //명령어로 예외의 원인을 확인하고 해결할 수 있다.
    //예외 발생 당시의 호출스택에 있었던 메서드의 정보와 예외 메시지를 화면에 출력함.
    
    getMessage(); 	
    //발생한 예외 클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.
    


📕15 프로세스(Process)와 스레드(Thread)

  • 프로세스(Process) : 실행중인 프로그램
  • 스레드(Thread) : 프로세스 내에서의 작업 단위. 모든 프로세스에는 최소 하나 이상의 스레드가 존재함.


1. 멀티 스레드

  • Single Thread : 하나의 프로그램에 하나의 작업단위만 있음. 순차적 처리
  • Multi Thread: 하나의 프로그램에 2개 이상의 작업단위가 있음. 동시에 여러기능을 같이 처리함(순서X)
    하나의 새로운 프로세스를 생성하는 것보다 하나의 새로운 Thread를 생성하는 것이 더 적은 비용이 든다.
  • Multi Thread의 장단점
    장점: 사용자에게 편리한 서비스 제공
    단점: 순서가 중요한 작업의 경우에는 주의가 필요하다. 교착상태(dead-lock)가 발생하지 않도록 주의해야 한다.


2. Thread의 구현과 실행

(1) Thread 클래스를 상속받는 방법

  • Thread 클래스를 상속받으면 다른 클래스를 상속받을 수 없다.(Java에서는 다중상속이 불가)
    class MyThread extends Thread {
      public void run() { /*작업내용*/ } 	
      //Thread클래스의 run() 을 오버라이딩
    }
    

(2) Runnable 인터페이스를 구현하는 방법

  • Runnable 인터페이스의 추상메서드인 run()의 구현부{}를 완성한다.
  • Runnable 인터페이스를 구현한 경우: 인터페이스를 구현한 클래스의 인스턴스를 생성한 후, 이 인스턴스를 Thread클래스의 생성자의 매개변수로 제공해야한다.
    class MyThread implements Runnable {
      public void run() { /*작업내용*/ }	
      //Runnable 인터페이스의 run() 을 구현
    }
    


3. 스레드의 실행

  • start() 를 호출: 스레드를 생성하면 바로 실행되는 것이 아닌 “실행대기 상태”가 되며, start() 를 호출해야만 스레드가 실행된다.
  • 한 번 실행이 종료된 스레드는 다시 실행할 수 없다. 즉, 하나의 스레드에 대해 start()는 한번만 호출될 수 있다.

Categories:

Updated:

Leave a comment