Programming/Java

[ JAVA 수업 DAY 10 - 11 ] Final, 인터페이스+, 예외처리, Java API

빠모스 2020. 5. 5. 01:58
반응형

Final

public static final int MAX = 100;

=> 상수변수를 만들어줄때 붙여주는 키워드. 

자바에서는 변수뿐만 아니라 메소드나 클래스에도 붙을수 있다.

 

< final의 3가지 사용법 >

  • 변수 : 상수
  • 메소드 : 오버라이딩 금지
  • 클래스 : 상속을 금지 

ex)

class Printer {
	void copyright() { 
    //=> final 을 붙여줘야만 자식클래스에서 재정의를 못하게 할 수 있음. 
	}
}

class LGPrinter extends Printer {
	public void copyright() { 
    //=> 자식클래스에서 재정의로 저작권을 바꿔버릴수도 있음. 
		…
	}
}

 

인터페이스 +

 

자바 1.8버젼부터 인터페이스에 구현된 메소드를 가질수있는 문법을 더 추가시켜줬다.

프로그램 버전업이 될때마다 copyright을 바꿔줘야하는데 인터페이스에선 구현된 메소드를 원칙적으로 못세우니까 인터페이스와 하위 클래스 사이에 추상클래스를 또 만들어서 copyright을 알려줘야하는 문제가 생김. 버전업이 생길때마다 계속 바꿔줘야 한다. 

이 문제때문에 default 접근제한자로 인터페이스가 구현된 메소드를 갖게 했다. 

 

추상클래스와 인터페이스 모두 기본적으로 변화에 민감하지 않게 만든다는 것이므로 직접 객체를 만드는건 불가능하고, 묵시적 형변환의 경우만 가능하다. 함부로 다른 이름 못만들게 하려고. 이를 “다형성”이라 한다. 

가끔가다 자식클래스의 오버라이드 안된 메소드를 호출하고싶을때만 명시적 형변환을 쓰는 것. 

 

클래스와 클래스 간 혹은 인터페이스와 인터페이스간의 확장에 쓰이는 extend는 generalization (상속)한다고 하고, 클래스와 인터페이스간의 implements는 realization(구현?)이라 한다. UML에선 점선 화살표로 표시한다. 

 

예외처리

예외 (Exception) : 예기치 못한 문제가 발생해서 소프트웨어가 종료되는 것.  

ex) 배열을 0부터 4번지까지 생성해놨는데 7번지 8번지에 접근하려 할 때 문제가 생기면서 소프트웨어 종료됨. 

 

주의> 예외와 오류(Error)는 다르다. 

  • 예외 : 개발자가 제어할 수 있는 문제. 개발자가 프로그램을 잘못만들어서 생기는 문제. 
  • 에러 : 내가 아니라 시스템상에서 발생되는 문제점. ex) 갑자기 jvm이 말썽을 피우거나 thred가 문제를 발생.. 

 

예외의 종류

  • checked exception : 컴파일시의 예외 (반드시 예외를 명시해야 하는 경우 - 예외처리 필수)
  • runtime exception : 실행시의 예외 (코드상에선 문제가 아닌데 실행하면서 문제가 생김.)

 

예외처리를 하는 이유는 예외가 나더라도 프로그램을 종료시키지않고 계속 진행시키고 싶을 때. 또는, 프로그램을 종료시킬수있지만 예외가 발생하더라도 내가 후처리를 다 한 후에 소프트웨어를 종료시키고 싶을 때. 뭔가 안전한 상황들을 만들기 위한 목적.

 

예외관련 키워드

  • try : 예외발생시 직접처리
  • catch: 예외발생시 직접처리
  • finally: 예외발생시 직접처리
  • throws: 예외발생시 간접처리
  • throw: 실제 예외는 아닌데 강제적으로 예외가 발생했다 하고싶을 때 (사용자정의 예외처리)

 

직접처리

  • try : 예외가 발생할것같은 부분을 묶어놓는 코드
  • catch : 예외가 발생하는 순간 걔를 잡아서 후처리할 코드
  • finally : try에서 예외가 발생하던 안하던간에 반드시 실행하는 문장들 (무조건 있어야되는건 아님)

 

만약 예외가 없을경우 catch블럭을 건너뛰고 finally를 실행한다. 예외가 있을 경우 catch 수행. 

 

cf) 예외처리를 안해줄경우에도 exception 이름과 발생한 위치를 알려준다. 이것은 jvm이 하는 일. try catch는 내가 예외를 직접 잡아주는것이다. 단, jvm은 예외가 발생하자마자 프로그램을 종료시켜버린다.  

 

간접처리

  • throws : 당장 이 메소드에서 예외를 잡지 않고 상위 메소드가 잡도록 던진다. 

 

사용자정의 예외처리 

  • throw : JVM이 예외를 발생시키는 것이 아니라 인위적으로 특정 시점에 예외를 발생시킬때 사용하는 키워드

throw new Exception();

 

자바 API

[ 날짜 API ]

날짜 관련 API 클래스

  • Date 
  • Calendar : 제일 중요한 클래스. 
  • SimpleDateFormat : 그다음으로 중요한 클래스. 하지만 많이 안씀. 

 

Date

 

Calender 클래스가 나온후로는 거의 안쓴다. 

자바 도큐먼트 가보면 Date 클래스는 대부분 Deprecated됬다. 사용을 권장하지 않고, 없어질 예정이라는 것. 

이래서 혼자 자바 도큐멘테이션을 보는게 중요하다. 

 

  • long getTime()
  • int getYear()
  • int getMonth()
  • int getDate()
  • int getDay()
  • int getHours()
  • int getMinutes()
  • int getSeconds()

 

Calendar

 

Date클래스를 대체하기 위해 만들어진 클래스. 추상클래스다. 

근데 추상클래스는 객체를 만들수 없다. 이는 곧 칼렌더를 상속받는 자식클래스가 있다는 것.

Direct Known Subclass에 GregorianCalendar가 있다.

 

  • getInstance()

Calendar 클래스에는 getInstance() 라는 static 메소드가 있다. 객체없이 호출하려면 static 방식밖에 없기 때문. 여기서 호출되는 인스턴스객체는 gregorian일수도있고 다른 날짜를 판별하는 subclass일수도 있다. 

이는, 자식클래스가 calendar에게 상속받아 오버라이드된 메소드만 사용하겠다는 것. 즉, 묵시적 형변환이 일어난것이다.  그래서 subclass가 뭐가들어와도 그게 calendar형이 되기 때문에 자바를 쓰는 모든 인종, 나라의 사람들이 원하는 달력을 쓸 수 있도록 한다. 

그래서 Calendar.getInstance()로 객체의 실제 시간을 얻어오는 방식이다. 

즉, Calendar c = Calendar.getInstance(); 로 객체 생성 (묵시적 형변환)

 

  • 정보추출 : int get();

c.get(1), c.get(2)… 이렇게 각 숫자마다 year, month, day 등이 멤버변수로 할당되있다. get 메소드로 각각의 필드를 가져온다. 이때 필드는 static으로 선언되있기때문에, Calendar.YEAR로 접근해야한다.

int year = c.get(Calendar.YEAR);

int month = c.get(Calendar.MONTH) + 1; // 얘도 달이 0부터 11로 설정되있어서. 

int date = c.get(Calendar.DATE);

멤버변수는 final static이라 상수값이기때문에 카멜표기법이 아니라 언더바로 단어들을 구분한다. DAY_OF_MONTH처럼. 

 

  • set();

내가 만약 멤버변수 값을 직접 지정하고싶을때. 이때, YEAR, MONTH의 상수항을 바꿔주는게아니라 그레고리안칼렌더 subclass에 YEAR과 MONTH의 값을 바꿔주는 변수 year, month가 따로 존재함. 

void set(int year, int month, int date)

void set(int field, int value)

 

  • Date getTime() : 칼렌더 객체를 데이트 객체로 변환

날라오는 데이트객체를 보고 내 칼렌더 객체 값을 바꿔준다.

 

  • getActualMaximum (int calendarField) : 해당 달의 가장 큰 날, 가장 마지막 날을 알고싶을때.

 

실습 코드 및 과제

https://github.com/LeenaKim/Java_Lessons/tree/master/src/kr/ac/kopo/day10

 

LeenaKim/Java_Lessons

Source codes and notes from Java Lessons / 자바 수업시간 배운 내용과 과제 코드입니다. - LeenaKim/Java_Lessons

github.com

 

반응형