첫 번째 TIL이다.
오늘은 자바 기본 공부를 하였다.
정리 시작!
1. 상속
- Def : 부모가 자식에게
메소드 , 멤버 변수 등을 물려주어 자식 클래스에서 구현하지 않아도 사용 할 수 있게 하는 것.
- Purpose : 코드의 중복을
피하고 객체의 관계성을 지킬 수 있다.
- 상속을 하게 되도 private 접근 권한을 가진 필드와 메소드는 상속 대상에서 제외 됨
부모와 자식이 다른 패키지에 존재한다면 default 권한에 대해서도
상속 제외 됨.
2. final 키워드
- final class => 상속이 불가능한
클래스
- final
+ 변수 => 초기값 설정 후 변경이 불가능 한
변수
- final 메소드 => 오버라이딩 할수 없는 메소드
3. 다형성
* 개인적으로 자바를 처음 입문하는 입장에서 가장 낯설은 개념이라고 생각한다. 하지만 중요하니 꼭 다지고 넘어가자
* 다형성을 이해하기 위해선 상속과 인터페이스(적어도 상속 + 클래스)의 개념은 확실히 다질 것!
- Def : 같은 타입이지만
다양한 인스턴스 객체에 따라 실행 결과가 달라 질 수 있는 성질.
- Example

빨간색 부분이 다형성이 적용된 예이다. 부모 클래스 A의 참조 변수(obj1,obj2)로 A를 상속받은 자식 클래스 B , B2의 인스턴스 (new B(), newB2())를 참조 할 수 있다.
4. 인터페이스
- 자바에서 인터페이스는 객체의 사용방법을 정의한 타입. 이 말은 객체를 사용하는데 필요한 필드 , 메소드 들을 정의’만’ 해 놓은 타입이다.
서로 다른것에 대해 통신하기 위해 노출 된 부분이라고 생각한다.
Ex) User Interface : 사용자와 디바이스 혹은 웹페이지 간에 통신하기 위해 노출 된 부분
API(Application Programmble Interface) : 소비자와 응용프로그램 내부에 통신하기 위해 노출 된 부분
- 인터페이스를 구현하는 하위 클래스에 대해 필요한 메소드를 강요할 수 있다.(상속과 비슷)
- 인터페이스를 활용하여 인터페이스를 구현한 하위 클래스에 대하여 자유롭게 참조 할 수 있다. 상속과 비슷할 수 있지만 , 인터페이스는 cost가 매우매우 저렴하다. 어떠한 메소드 구현도 , 필요하지 않다. 단지 정의만 하면 된다. (다형성!!!)
=> 물리적으로 인터페이스는 클래스와 동일하다.(=~.class파일이 생성된다) 그러나 클래스는 필드 , 메소드 , 생성자를 갖는거에 비해 , 인터페이스는 상수 , 메소드 만을 갖는다
=> 인터페이스의 필드는 static final을 붙이지 않아도 자동으로 상수(static final)으로 컴파일된다.
=> 인터페이스는 객체생성이 불가하기 때문에 생성자가 없다. 또한 인스턴스 변수도 없다..
=> 인터페이스는 3가지의 메소드를 가질 수 있다.
1. 추상 메소드
2. 디폴트 메소드 (java 8 추가)
3. 정적 메소드 (java 8 추가)
5. default vs static
=> 두 메소드 다 인터페이스에 속한 메소드임에도 불구하고 실행 블록을 갖고 있다. 그러나 두 메소드의 차이점이 있는데 ,
default 메소드는 구현 클래스에서 overriding이 가능하다. 그러나 static 메소드는 overriding이 불가능하다.
또한 , static 메소드는 구현 클래스에서 사용이 불가능하다.
결론으로 , default메소드는 사실 구현 클래스의 인스턴스 메소드라고 생각해야 한다. 만약 구현 클래스에서 overriding을 한 경우 , 해당 메소드가 실행되고 , 구현되지 않을 경우 인터페이스의 메소드가 실행된다.
그러나 static method는 overriding이 불가능하다. 또한 구현 클래스의 참조로 사용 될 수 없다.
또한 , 구현 클래스와 인터페이스 간에 같은 이름을 가진 Static 메소드를 가질 수 있다. 그 말인 즉슨 , static 메소드는 해당 클래스에만 속한다.
* default 메소드의 필요성
=> default 메소드는 사실 인터페이스의 목적에 약간은 위배 되는 것 처럼 보인다. 왜냐 하면, default 메소드는 객체를 생성해서만 사용할 수 있는 인스턴스 메소드이기 때문이다.
그렇다면 왜 default 메소드를 만들었는 이유는 다음과 같다.
차후에 interface의 수정이 필요해서 method를 추가하게 되면 , 해당 interface를 구현한 모든 구현 클래스 들은 추가된 메소드를 빠짐없이 구현해야만 하는 상황에 놓인다.
이러한 곤란한 상황을 피하기 위해 default로 선언을 하게 되면 , 추가된 메소드에 대하여 구현 클래스는 overriding하여 쓰거나 , 그대로 쓰거나 , 할 수 있다. 결론적으로 많은 코드를 수정할 필요가 없어진다는 얘기.
6. Exception
*에러(Error) 와 예외(Exception)
=> 에러란 하드웨어의 오동작 또는 고장으로 인해 응용프로그램 실행 오류가 발생하는 것. 이러한 에러는 막을 수 없다. 그러나 예외는 사용자의 잘못된 조작, 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류를 말한다.
* 예외는 두가지로 나뉜다. 일반 예외(=컴파일러 예외)와 런타임 예외가 있다.
* 일반예외 => Exception 상속 , 런타임 예외 => RunTimeException 상속
*예외 처리는 다음과 같은 방법으로 처리한다.
Try{
Code which is
expected to happen error
}catch (Error name which is you want to handle){
Code (I,e. error
message)
}finally{
Code block which has
to be operated.
}
Q. try 구문에 여러 개의 error가 있을 때 모든 error를 핸들링 할 수 있을까?
A. 그렇지 않다. Try 부분에서
error가 하나라도 발생 되면 해당 try문은 해당하는
catch 블락으로 가 코드를 실행하고 빠져나가게 된다.
* 예외 떠넘기기 (throws)
=> throws는 메소드 내에서 발생 될 수 있는 error를
메소드 내에서 handling하지 않고 메소드를 호출한 곳에서
handling하게 떠넘길수 있다.
해당 메소드(main method)에서 발생하는 IOEception 예외는 main문을 call하는 곳에서
try – catch를 통해 handling 해야만 한다.
위와 같이 main문에서 throws를 하게 되면 JVM이 예외처리를 하게 되고, JVM은 예외의 내용을 conslole에 출력하는 것으로 예외 처리를 한다.
* 사용자 정의 예외와 예외 발생
Built in 된 예외 클래스 말고 사용자가 원하는 상황에 대한 예외를 처리하기 위해 사용자 정의 예외를 만들
수 있다.
예외를 만드는
법은 클래스를 만드는 방법과 동일하며 일반예외 or 런타임예외에 따라 상속 받는 것이 달라진다.
사용자 정의 예외 클래스에선 대부분 생성자 선언만을 포함한다.
생성자는 parameter가 없는 기본 생성자와 예외 발생 원인(예외 메시지)를 전달하기 위한 String
매개 변수를 갖는 생성자 이다
Ex)
1. Exception class 생성
2. Create Exception by condition with 'throws'
3. Try - catch Exception on running method
=======================================================
TIL을 처음으로 해봣는데 방법에 대해서 조금 더 보기 좋은 구조로 바꿔야 될 필요가 있을 것 같다...
천천히 고민해보자..