교육 (Today I Learned)/Hanaro

[Hanaro] 41일차 / Java (API Method, Exception, Thread, I/O)

Bay Im 2024. 3. 15. 09:19

06 OOP 이해 및 실습 - OOP 심화 학습

  • 익명 객체 (Anonymous Object)
    • 일회성 메소드 재정의시 사용
    • 한번 쓰고 버릴 코드이기 때문에 굳이 이름을 붙여서 사용하지 않는다.
    • 예시
      • interface NormalCar {
            void run();
        }
        
        public class ex49_anonymousFunction {
            public static void main(String[] args) {
                // 일회성 익명 인터페이스 구현 객체를 선언/생성한다.
                NormalCar normalCar = new NormalCar() {
                    @Override
                    public void run() {
                        System.out.println("슈퍼카가 달린다.");
                    }
                };
                normalCar.run();
            }
        }
  • 중첩 클래스 (Nested class)
    • 클래스 안에 클래스가 들어가는 것
    • 외부 클래스(Outer)
      • 클래스 밖에 클래스를 선언
    • 내부 클래스(Inner)
      • 클래스 안에 클래스를 선언
      • 내부적으로 소비하고 끝나는 클래스는 내부 클래스로 선언
      • Inner 클래스를 static으로 선언하면 좀더 편하게 선언 가능하다.
    • 예시
      • class Outer {
            String name = "outer";
        
            class Inner {
                String name = "inner";
            }
        
            static class InnerStatic {
                String name = "inner static";
            }
        }
        
        public class ex50_nestedClass {
            public static void main(String[] args) {
                Outer outer = new Outer();
                System.out.println(outer.name);
        
                Outer.Inner inner = outer.new Inner();
                System.out.println(inner.name);
        
                // inner 클래스를 static으로 선언하면 좀더 편하게 선언 가능
                Outer.InnerStatic innerStatic = new Outer.InnerStatic();
                System.out.println(innerStatic.name);
            }
        }
  • Object 클래스
    • 자바 최상위 클래스이며, 모든 클래스가 상속 받는 클래스
    • 다형성을 이용하여 모든 클래스 객체를 전달할 수 있다.
  • API 메서드
    • hashCode()
      • 객체 생성시 자동으로 부여되는 ID 값
    • equals(비교대상)
      • 객체 비교
    • toString()
      • 객체를 문자열 표현으로 반환
  • String 관련 클래스
    • StringBuffer(”문자열”)
      • 문자열을 좀더 유연하게 제어가능
      • StringBuffer stringBuffer = new StringBuffer(”문자열”); 형태
      • 추가(append), 삽입(insert), 삭제(delete) 사용 가능
    • StringBuilder(”문자열”)
      • 대량의 문자열을 처리할 때 속도 향상
      • StringBuilder builder = new StringBuilder(”문자열”); 형태
      • 추가(append), 삽입(insert), 삭제(delete) 사용 가능
    • 추가(append), 삽입(insert), 삭제(delete)
      • stringBuffer.append(”끝에 추가할 문자열”);
      • stringBuffer.insert(추가할 인덱스, “문자열”);
      • stringBuffer.delete(시작인덱스, 끝인덱스);
  • Wrapper class
    • 기본 자료형 8개를 감싸서 클래스로 만든 것
      • 기본 자료형: int, long, short, byte, float, double, char, boolean
    • 클래스로 만들어야 다형성 이용 가능
    • 래퍼 클래스 종류
      • Integer, Long, Short, Byte, Charactor, Boolean
    • 숫자 클래스
      • Number
        • int, long, short, byte, float, double
    • 래퍼 클래스 변수 = 값; 형식
      • ex) Integer intValue = 10;
  • 자바 관련 단어 정리
    • API (Application Programming Interface)
      • 함수/클래스 호출의 접점
    • SDK (Softwear Development Kit)
      • 소프트웨어 개발 툴 모음
    • Library
      • 함수나 클래스들의 모임
    • Framework
      • 어떤 소프트웨어를 만드는데 사용하는 근간
    • Collection
      • SW 모음
    • JDK (Java Development Kit)
      • Java + SDK
    • DLL (Dynamic-Link Library)
      • 동적 링크 라이브러리, 함수 및 클래스 모임
    • JAR (Java Archive)
      • .class 파일과 리소스(이미지, 텍스트), 메타 파일을 모아둔 것
      • 실행 가능한 압축파일

 

07 Exception 처리 실습

  • 에러 (Error)
    • 하드웨어의 잘못된 동작이나 고장으로 인한 오류 (개발자가 해결할 수 없는 오류)
    • 에러 발생 시 프로그램 종료
    • 정상 실행 상태로 돌아갈 수 없다.
  • 예외 (Exception)
    • 사용자의 잘못된 조작이나 개발자의 잘못된 코딩으로 인한 오류 (개발자가 해결 가능한 오류)
    • 예외 발생시 프로그램 종료
    • 예외 처리 추가하면 정상 실행 상태로 돌아갈 수 있다.
  • 예외의 종류
    • 일반(컴파일 체크) 예외(Exception)
      • 예외 처리 코드 없으면 컴파일 오류 발생
    • 실행 예외(RuntimeException)
      • 예외 처리 코드를 생략하더라도 컴파일이 되는 예외
  • 예외 처리 방법
    • try - catch - finally
      • 다중 catch 가능
        • 예외 별로 처리 코드 다르게 구현
        • 순서는 상위 클래스가 위에 위치해야 한다.
      • 멀티 catch 가능
        • 하나의 catch 블록에서 여러 개의 예외 처리 가능
        • 동일하게 처리하고 싶은 예외를 | 로 연결한다.
      • catch 블록 코드 예시
        • try {
          	예외가 발생할 만한 코드;
          } catch(예외클래스 객체e) {
          	예외발생시 처리하는 코드;
          } finally {
          	예외가 발생하든 안하든 무조건 실행되는 코드;
          	마무리 정리하는 코드;
          }​
        • catch (Exception e) {
          • getMessage()
            • System.out.println(e.getMessage());
            • 예외 내용 출력
          • printStackTrace()
            • e.printStackTrace();
            • 예외 경로 출력
    • throws
      • 자신을 호출한 메소드에 예외처리를 떠넘기는 것
      • 리턴타입 메소드명(매개변수) throws 예외클래스1, 예외클래스2, … { … } 형식
      • 예시
        • static void myFunc() throws Exception {
          	...
          	throw new Exception();
          }
          
          // 메인 영역
          try {
          	myFunc();
          } catch (Exception e) {
          	...
          }
    • 사용자 정의 예외 클래스 선언
      • 자바 표준 API에서 제공하지 않는 예외는 사용자 정의 예외 클래스 선언
      • extends [Exception | RuntimeException] 과 같이 여러 예외처리 가능
      • 예시
        • // 사용자 정의 예외
          class MyException extends Exception {
              String message = "";
          
              public void printMessage() {
                  System.out.println(this.message);
              }
          }
          
          static void myFunc() throws Exception {
          	...
          	if (조건문) {
          		MyException e = new MyException();
          		e.message = "사용자 정의 예외";
          		throw e;
          }
          
          // 메인 영역 
          try {
          	myFunc();
          } catch (MyException e) {
          	e2.printMessage();
          }
    • try - with - resources
      • try 문을 벗어나면 자동으로 사용했던 객체의 close()를 호출해서 리소스를 닫아주는 구문 (JDK7 이상)
      • AutoCloseable 인터페이스를 구현한 메소드만 가능하다.
      • 리소스 객체
        • 입출력스트림, 서버소켓, 소켓, 각종 채널
      • 예시 
        • public class Class1 {
          	public method1() throws Exception {
          		Connection conn = DriverManager.getConnection("...");
          		Statement stat = conn.createStatement();
          		ResultSet rs = stat.executeQuery("SELECT 1 from dual");
          		
          		try (conn; stat; rs) {
          			...
          		} catch (Exception e) {
          			...
          		}
          	}
          }
        • try (FileWriter file = new FileWriter("data.txt")) {
              file.write("Hello World");
          } catch (Exception e) {
              e.printStackTrace();
          }
          

 

 

08 Thread, I/O

  • 프로세스 (process)
    • 실행 중인 하나의 프로그램
    • 하나의 프로그램이 다중 프로세스를 만들기도 한다.
  • 멀티 태스킹 (multi tasking)
    • 두 가지 이상의 작업을 동시에 처리하는 것
    • 멀티 프로세스
      • 독립적으로 프로그램들을 실행하고 여러가지 작업 처리
    • 멀티 스레드
      • 한 개의 프로그램을 실행하고 내부적으로 여러가지 작업 처리
    • 멀티 프로세스(여러 개의 프로세스) 안에→ 각 프로세스 안에 멀티 스레드(여러 개의 스레드)
  • 메인 스레드
    • 모든 자바 프로그램은 메인 스레드가 main() 메소드를 실행하며 시작
    • 실행 종료는 마지막 코드 실행되거나 return 문을 만날시에 종료
      • 싱글 스레드
        • 메인 스레드가 종료하면 프로세스도 종료
      • 멀티 스레드
        • 실행 중인 스레드가 하나라도 있다면 프로세스 미종료
  • 스레드 생성 방법
    • Runnable 인터페이스 이용
      • Runnable을 매개값으로 갖는 생성자 호출
      • 기본 형식
        • class R1 implements Runnable {
          	@Override
          	public void run() {
          		while(true) {
          			실행문;
          		}
          	}
          }
          
          // 메인
          R1 r1 = new R1();
          Thread t = new Thread(r1);
          t1.start();
    • Thread 추상 클래스 이용
      • Thread 클래스 상속 후 run() 메소드 재정의하여 스레드가 실행할 코드 작성
      • 기본 형식
      • class T1 extends Thread {
        	@Override
        	public void run() {
        		while(true) {
        			실행문;
        		}
        	}
        }
        
        // 메인영역
        T1 t = new T1();
        t.start();
      • 예시
      • class 클래스명 extends Thread {
        	// 예시 
        	int count = 0;
           
          @Override
          public void run() {
              // super.run(); <- 지워야 함
              
              // 한번만 실행되기에 무한 반복문 사용
              while (true) {
        	      // 예시
        	      System.out.println("Printer: " + count++);
        	      if (count > 10) {
        		      break;
        		     }
        	     }
            }
        }
        
        // 메인 영역
        Printer printer = new Printer();
        printer.start();
  • 스레드 스케줄링
    • 스레드의 개수가 코어의 수보다 많을 경우 스레드를 어떤 순서로 동시성으로 실행할지 결정하는 것
    • 스케줄링에 의해 스레들은 번갈아 가면서 run() 메소드를 조금씩 실행
  • 동시성과 병렬성
    • 동시성
      • 멀티 작업을 위해 하나의 코어에서 멀티 스레드가 번갈아가며 실행하는 성질
    • 병렬성
      • 멀티 작업을 위해 멀티 코어에서 개별 스레드를 동시에 실행하는 성질
  • java.io 패키지
    • 자바의 기본적인 데이터 입출력(I/O: Input/Output) API 제공
    • 주요 클래스
      • 파일 시스템의 파일의 정보를 얻기위한 클래스
        • File
      • 콘솔로부터 문자를 입출력하기 위한 클래스
        • Console
      • 바이트 단위 입출력을 위한 최상위 입출력 스트림 클래스
        • InputStream, OutputStream
      • 바이트 단위 입출력을 위한 하위 스트림 클래스
        • FileInputStream, FileOutputStream
        • DataInputStream, DataOutputStream
        • ObjectInputStream, ObjectOutputStream
        • PrintStream
        • BufferedInputStream, BufferedOutputStream
      • 문자 단위 입출력을 위한 최상위 입출력 스트림 클래스
        • Reader, Writer
      • 문자 단위 입출력을 위한 하위 스트림 클래스
        • FileReader, FileWriter
        • InputStreamReader, OutputStreamWriter
        • PrintWriter
        • BufferedReader, BufferedWriter
  • 바이트 기반 스트림
    • 그림, 멀티미디어, 문자 등 모든 종류의 데이터를 받고 보내는 것 가능
  • 문자 기반 스트림
    • 문자만 받고 보낼 수 있도록 특화
  • InputStream
    • 바이트 단위 입력 스트림의 최상위 클래스로 추상 클래스
    • 주요 메소드
      • read()
        • 입력 스트림으로부터 1 바이트를 읽고 읽은 바이트를 리턴한다.
      • close()
  • OutputStream
    • 바이트 기반 출력 스트림의 최상위 클래스로 추상 클래스
    • 주요 메소드
      • write()
        • 출력 스트림으로 1 바이트를 보낸다.
      • flush()
        • 버퍼에 잔류하는 모든 바이트를 출력
      • close()
  • Reader
    • 문자 기반 입력 스트림의 최상위 클래스로 추상 클래스
    • 주요 메소드
      • read()
        • 입력 스트림으로부터 한개의 문자를 읽고 리턴
      • close()
  • Writer
    • 문자 기반 출력 스트림의 최상위 클래스로 추상 클래스
    • 주요 메소드
      • write()
        • 출력 스트림으로 매개값으로 주어진 한 문자를 보낸다.
      • flush()
        • 버퍼에 잔류하는 모든 문자열 출력
      • close()
  • File 클래스
    • 파일 시스템의 파일을 표현하는 클래스
    • 파일 객체 생성
    • 파일 또는 디렉토리 존재 유무 확인
    • 파일 및 디렉토리 생성 및 삭제 메소드
      • createNewFile()
      • mkdir()
      • mkdirs()
        • 경로상에 없는 모든 디렉토리 생성
      • delete()
  • FileReader, FileWriter
    • 텍스트 파일로부터 데이터를 읽어들이거나, 저장할 떄 사용
    • FileWriter fw = new FileWriter(”파일경로”, true); 형식