자바 2

Mango·2022년 3월 4일

Java

목록 보기
4/8
  • 내부 클래스 inner class

    내부클래스의 장점
    - 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.
    -> B는 객체생성 없이 A의 멤버를 사용가능
    - 코드의 복잡성을 줄일 수 있다.(캡슐화)
    -> 내부클래스에 있는 클래스(B)의 외부접근(C)에 제한이 생긴다.
    - 내부 클래스의 종류와 유효범위(scope)는 변수와 동일

    class A { //외부클래스
    	...
       class B { //내부클래스
       	... //B에서는 객체생성 없이도 A의 멤버 접근가능
       }
    }
  • 내부 클래스의 제어자와 접근성
    - 내부 클래스의 제어자는 변수에 사용 가능한 제어자와 동일
    - 내부 클래스에서는 외부 클래스의 private멤버도 접근가능하다.
    - static클래스는 외부 클래스의 인스턴스 멤버에 접근할 수 없다.
    - 외부 클래스의 지역변수는 final이 붙은 변수(상수)만 접근가능하다.

private int outerIv = 0;
static int outerCv = 0;

class InstanceInner {
	int iiv = outerIv;
    int iiv2 = outerCv;
    
    static class StaticInner {
    //static 클래스는 외부 클래스의 인스턴스 멤버에 접근x
        //int siv = outerIv; 
        static int scv = outerCv;
    }
    void Method() {
    	int lv = 0;
        final int LV = 0; //JDK1.8부터 final 생략 가능
        
        class LocalInner {
        	int lv = outerIv;
            int liv2 = outerCv;
    	//외부 클래스의 지역변수는 fanal이 붙은 변수(상수)만 접근 가능하다.
    		//int liv3 = lv;
            int liv4 = LV
        }
    }
}
  • 익명 클래스 anonymous class
    - 이름이 없는 일회용 클래서, 정의와 생성을 동시에
new 조상클래스 이름() {
	//멤버 선언
}

new 구현 인터페이스 이름() {
	//멤버 선언
}
  • 프로그램 오류
    - 컴파일 에러(comfile-time error) : 컴파일 할 때 발생하는 에러
    - 런타임 에러(runtime error) : 실행 할 때 발행하는 에러
    --> 에러 error : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
    --> 예외 exception : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
    - 논리적 에러(logical error) : 작성 의도와 다르게 동작

    Exception 클래스들 : 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
    RuntimeException 클래스들 : 프로그래머의 실수로 발생하는 예외

try {
	// 예외가 발생할 가능성이 있는 문장들을 넣는다.
} catch (Exception1 e1) {
	// Exception1이 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
} catch (Exception2 e2) {
	// Exception2가 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
} catch (ExceptionN eN) {
	// ExceptionN이 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
}
  • 예외의 발생과 catch블럭
    - 예외가 발생하면, 이를 처리할 catch블럭을 찾아 내려감
    - 일치하는 catch블럭이 없으면, 예외는 처리 안됨
    - Exception이 선언된 catch블럭은 모든 예외 처리(마지막 catch블럭)
    - 멀티 catch블럭 : 내용이 같은 catch블럭을 하나로 합친 것

printStackTrace() : 예외발생 당시의 호출스택(Call Stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다.
getMessage() : 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.

  • 예외 발생시키기
  1. 연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든 다음
    Exception e = new Exception("고의로 발생시켰음");
  2. 키워드 throw를 이용해서 예외를 발생시킨다.
    throw e;

checked 예외 : 컴파일러가 예외 처리 여부를 체크(예외 처리 필수)
unchecked 예외 : 컴파일러가 예외 처리 여부를 체크 안함(예외 처리 선택)

  • 메서드에 예외 선언하기
    - 예외를 처리하는 방법 : try-catch문, 예외 선언하기, 은폐하기
    - 메서드 호출시 발생가능한 예외를 호출하는 쪽에 알리는것

  • finally 블럭
    - 예외 발생여부와 관계없이 수행되어야 하는 코드를 넣는다.

try {
	// 예외가 발생할 가능성이 있는 문장들을 넣는다.
} catch (Exception1 e1) {
	// Exception1이 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
} catch (Exception2 e2) {
	// Exception2가 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
} finally {
	// 예외의 발생여부에 관계없이 항상 수행되어야하는 문장들을 넣는다.
    // finally 블럭은 try-catch문의 맨 마지막에 위치해야한다.
}
  • 사용자 정의 예외 만들기
    - 사용자가 직접 예외 클래스를 정의할 수 있다.
    - 조상은 Exception과 RuntimeException중에서 선택
class MyException extends Exception {
	MyException(String msg) {
    	super(msg);
    }
}
  • 예외 되던지기 exception re-throwing
    - 예외를 처리한 후에 다시 예외를 발생시키는 것
    - 호출한 메서드와 호출된 메서드 양쪽 모두에서 예외처리하는 것

  • 연결된 예외 chained exception
    - 한 예외가 다른 예외를 발생시킬 수 있다.
    - 예외 A가 예외 B를 발생시키면 A는 B의 원인 예외
    -> 어떤 예외를 다른 예외로 감싸는 것
    -> 세부적인 예외를 포괄적인 예외로 감쌀 때 사용
    -> checked 예외를 unchecked예외로 변경하려 할 때

  • Object클래스
    - 모든 클래스의 최고 조상. 오직 11개의 메서드만을 가지고 있다.
    - notify(), wait() 등은 쓰레드와 관련된 메서드이다.

  • equals (Object obj)
    - 객체 자신(this)과 주어진 객체(obj)를 비교한다. 같으면 true, 다르면 false.

  • equals (Object obj)의 오버라이딩
    - 인스턴스 변수(iv)의 값을 비교하도록 equals()를 오버라이딩 해야한다.

class Person {
	long id;
    
    public boolean equals(Object obj) {
    	if(obj instanceof Person)
        	return id == ((Person)obj).id;
        else {
        	return false;
        }
        Person(long id) {
        	this.id = id;
        }
    }
}
  • hashCode()
    - 객체의 해시코드(hash code)를 반환하는 메서드
    - Object클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환
    - equals()를 오버라이딩하면, hashCode()도 오버라이딩해야 한다.
    -->equals()의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문

  • toString(), toString()의 오버라이딩
    - toString() : 객체를 문자열(String)으로 변환하기 위한 메서드

⛔ 9-4~6 hashCode(), toString()예제 다시 ⛔

  • String 클래스
    - String클래스 = 데이터(char[]) + 메서드(문자열 관련)
    - 내용을 변경할 수 없는 불변(immutable) 클래스
    - 덧셈 연산자(+)를 이용한 문자열 결합은 성능이 떨어짐.
    --> 문자열의 결합이나 변경이 잦다면, 내용을 변경가능한 StringBuffer를 사용

  • 문자열의 비교
    - String str = "abc"와 String str = new String("abc");의 비교

String str1 = "abc"; //문자열 리터럴 "abc"의 주소가 str1에 저장됨
String str2 = "abc"; //문자열 리터럴 "abc"의 주소가 str2에 저장됨
String str3 = new String("abc"); //새로운 String 인스턴스를 생성
String str4 = new String("abc"); ////새로운 String 인스턴스를 생성
  • 문자열 리터럴
    - 문자열 리터럴은 프로그램 실행시 자동으로 생성된다.(constant pool에 저장)
    - 같은 내용의 문자열 리터럴은 하나만 만들어진다.

  • 빈 문자열("", empty string)
    - 내용이 없는 문자열. 크기가 0인 char형 배열을 저장하는 문자열
    - 크기가 0인 배열을 생성하는 것은 어느 타입이나 가능

String str = ""; //str을 빈 문자열로 초기화

char[] chArr = new char[0]; //길이가 0인 char배열
int[] iArr = {}; //길이가 0인 int배열
  • String 생성자
    ⛔ String 클래스의 생성자와 메서드 훑기 ⛔

  • join()
    - 여러 문자열 사이에 구분자를 넣어서 결합한다.

String animals = "dog, cat, bear"; 
String[] arr = animals.split(","); //문자열을 ','로 나눠서 배열에 저장
String str = String.join("-", arr); //배열의 문자열을 '-'로 구분해서 결합
System.out.println(str); 'dog-cat-bear'
  • StringBuffer 클래스
    - String처럼 문자열 배열(char[])을 내부적으로 가지고 있다.
    - String과 달리 내용을 변경할 수 있다.(mutable)
    - append()는 지정된 내용을 StringBuffer에 추가 후, StringBuffer의 참조를 반환
    - StringBuffer는 equals()가 오버라이딩 되어있지 않다.(주소비교)
    -->StringBuffer을 String으로 변환 후에 equals()로 비교해야 한다.

⛔ StringBuffer 클래스의 생성자와 메서드 훑기 ⛔

  • StringBuilder(StringBuffer와 매우 유사)
    - StringBuffer는 동기화 되어있다. 멀티 쓰레드에 안전
    - 멀티쓰레드 프로그램이 아닌 경우, 동기하는 불필요한 성능저하
    -->StringBuffer대신 StrinfBuilder를 사용하면 성능 향상

  • Math 클래스
    - 수학 관련 static 메서드의 집합
    - 반올림 방법 : round(), rint(), even()

  • 래퍼wrapper 클래스
    - 8개의 기본형을 객체로 다뤄야할 때 사용하는 클래스

  • Number 클래스
    - 모든 숫자 래퍼 클래스의 조상

  • 문자열을 숫자로 변환하기

int a = new Integer("100").intValue();
int b = Integer.parseInt("100");
int c = Integer.valueOf("100");
  • 오토박싱 & 언박싱
    - JDK1.5 이전에는 기본형과 참조형간의 연산이 불가능
    - 기본형의 값을 객체로 자동변환하는 것을 오토박싱, 그 반대는 언박싱

    int --(autoboxing)--> Integer
    Integer --(unboxing)--> int

    int i = 5;
    Integer iObj = new Integer(7);
    int sum = i + iObj; //error. JDK1.5이전에는 불가
  • 날짜와 시간 - Calendar 클래스
    - 추상 클래스이므로 getInstance()를 통해 구현된 객체를 얻어야 한다.
    - get()으로 날짜와 시간 필드 가져오기 - int get(int field)
    - set()으로 원하는 날짜와 시간 필드로 변경 가능
    - clear()는 Calendar객체의 모든 필드를 초기화
    - clear(int field)는 Calendar객체의 특정 필드를 초기화
    Calendar cal = Calendar.getInstance(); //현재 날짜와 시간으로 셋팅됨
    int thisYear = cal.get(Calendar.YEAR); //올해가 몇년인지 알아낸다.
    int lastDayOfMonth = cal.getActualMaximum(Calendar.DATE); //이 달의 마지막 날
    - add()는 특정 필드의 값을 증가 또는 감소(다른 필드에 영향o)
    Calendar date = Calendar.getInstance();
    date.clear(); //모든 필드를 초기화
    date.set(2020, 7, 31); //2020년 8월 31일로 설정
    date.add(Caalendar.DATE, 1); //날짜(DATE)에 1을 더한다 -> 9월1일
    date.add(Calendar.MONTH, -8); //월(MONTH)에서 8을 뺀다 -> 2019년 1월1일
    - roll()은 특정필드의 값을 증가 또는 감소(다른 필드에 영향x)
    date.set(2020, 7, 31); //2020년 8월 31일로 설정
    // add()와 달리 roll()은 다른 필드에 영향을 미치지 않는다.
    date.roll(Calendar.DATE, 1); //날짜(DATE)에 1을 더한다 -> 8월1일
    date.roll(Calendar.MONTH, -8); //월(MONTH)에서 8을 뺀다 -> 2020년 1월1일
  • 형식화 클래스
    - java.text패키지의 DecimalFormat, SimleDateFormat
    - 숫자와 날짜를 원하는 형식으로 쉽게 출력 가능(숫자, 날짜 -> 형식 문자열)
    - 형식 문자열에서 숫자와 날짜를 뽑아내는 기능(형식 문자열) -> 숫자, 날짜)
  • SimpleDateFormat
    - 날짜와 시간을 다양한 형식으로 출력할 수 있게 해준다.
profile
How u do that

0개의 댓글