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()
- 객체를 문자열 표현으로 반환
- hashCode()
- 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(시작인덱스, 끝인덱스);
- StringBuffer(”문자열”)
- Wrapper class
- 기본 자료형 8개를 감싸서 클래스로 만든 것
- 기본 자료형: int, long, short, byte, float, double, char, boolean
- 클래스로 만들어야 다형성 이용 가능
- 래퍼 클래스 종류
- Integer, Long, Short, Byte, Charactor, Boolean
- 숫자 클래스
- Number
- int, long, short, byte, float, double
- Number
- 래퍼 클래스 변수 = 값; 형식
- ex) Integer intValue = 10;
- 기본 자료형 8개를 감싸서 클래스로 만든 것
- 자바 관련 단어 정리
- 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 파일과 리소스(이미지, 텍스트), 메타 파일을 모아둔 것
- 실행 가능한 압축파일
- API (Application Programming Interface)
07 Exception 처리 실습
- 에러 (Error)
- 하드웨어의 잘못된 동작이나 고장으로 인한 오류 (개발자가 해결할 수 없는 오류)
- 에러 발생 시 프로그램 종료
- 정상 실행 상태로 돌아갈 수 없다.
- 예외 (Exception)
- 사용자의 잘못된 조작이나 개발자의 잘못된 코딩으로 인한 오류 (개발자가 해결 가능한 오류)
- 예외 발생시 프로그램 종료
- 예외 처리 추가하면 정상 실행 상태로 돌아갈 수 있다.
- 예외의 종류
- 일반(컴파일 체크) 예외(Exception)
- 예외 처리 코드 없으면 컴파일 오류 발생
- 실행 예외(RuntimeException)
- 예외 처리 코드를 생략하더라도 컴파일이 되는 예외
- 일반(컴파일 체크) 예외(Exception)
- 예외 처리 방법
- try - catch - finally
- 다중 catch 가능
- 예외 별로 처리 코드 다르게 구현
- 순서는 상위 클래스가 위에 위치해야 한다.
- 멀티 catch 가능
- 하나의 catch 블록에서 여러 개의 예외 처리 가능
- 동일하게 처리하고 싶은 예외를 | 로 연결한다.
- catch 블록 코드 예시
-
try { 예외가 발생할 만한 코드; } catch(예외클래스 객체e) { 예외발생시 처리하는 코드; } finally { 예외가 발생하든 안하든 무조건 실행되는 코드; 마무리 정리하는 코드; }
- catch (Exception e) {
- getMessage()
- System.out.println(e.getMessage());
- 예외 내용 출력
- printStackTrace()
- e.printStackTrace();
- 예외 경로 출력
- getMessage()
-
- 다중 catch 가능
- 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(); }
-
- try - catch - finally
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();
- Runnable 인터페이스 이용
- 스레드 스케줄링
- 스레드의 개수가 코어의 수보다 많을 경우 스레드를 어떤 순서로 동시성으로 실행할지 결정하는 것
- 스케줄링에 의해 스레들은 번갈아 가면서 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()
- read()
- OutputStream
- 바이트 기반 출력 스트림의 최상위 클래스로 추상 클래스
- 주요 메소드
- write()
- 출력 스트림으로 1 바이트를 보낸다.
- flush()
- 버퍼에 잔류하는 모든 바이트를 출력
- close()
- write()
- Reader
- 문자 기반 입력 스트림의 최상위 클래스로 추상 클래스
- 주요 메소드
- read()
- 입력 스트림으로부터 한개의 문자를 읽고 리턴
- close()
- read()
- Writer
- 문자 기반 출력 스트림의 최상위 클래스로 추상 클래스
- 주요 메소드
- write()
- 출력 스트림으로 매개값으로 주어진 한 문자를 보낸다.
- flush()
- 버퍼에 잔류하는 모든 문자열 출력
- close()
- write()
- File 클래스
- 파일 시스템의 파일을 표현하는 클래스
- 파일 객체 생성
- 파일 또는 디렉토리 존재 유무 확인
- 파일 및 디렉토리 생성 및 삭제 메소드
- createNewFile()
- mkdir()
- mkdirs()
- 경로상에 없는 모든 디렉토리 생성
- delete()
- FileReader, FileWriter
- 텍스트 파일로부터 데이터를 읽어들이거나, 저장할 떄 사용
- FileWriter fw = new FileWriter(”파일경로”, true); 형식
'교육 (Today I Learned) > Hanaro' 카테고리의 다른 글
[Hanaro] 44일차 / SQL (단일행 함수) (0) | 2024.03.20 |
---|---|
[Hanaro] 42일차 / Java (Collection, JDBC, 기본 SQL문, DB연결) (0) | 2024.03.18 |
[Hanaro] 40일차 / Java (생성자, abstract, interface) (0) | 2024.03.13 |
[Hanaro] 39일차 / Java (Array, Class, method, 접근 제어자, 싱글톤 패턴) (0) | 2024.03.12 |
[Hanaro] 38일차 / Java (제어문) (0) | 2024.03.12 |