day15
추상클래스
- 공통된 멤버변수(필드)와 메소드의 이름을 통일하려고 사용
=> 시간을 절약
추상클래스 생김새
abstract class 클래스명{
}
추상클래스 특징
- 추상 클래스를 이용하여 객체를 생성할 수 없다.
=> 추상 클래스를 상속한 자식 클래스를 만든 후, 객체를 생성해야 한다.
- 추상 클래스는 추상 메소드를 생성할 수 있다.
- 추상 메소드는 선언부만 있고 구현부가 없는 메소드
=> 기능명은 있지만 구현되지 않음
- 추상 클래스에 추상 메소드가 있으면 추상 클래스를 상속받은 자식 클래스에서 (자식 클래스가 일반 클래스인 경우) 추상 메소드를 무조건 오버라이딩 해야 한다.
=> 구현부가 없기 때문에 구현해줘야 한다
- 추상 메소드가 있으면 일반 클래스가 될 수 없고 추상클래스여야 한다.
인터페이스 (기능 명세해서 통일되게(=표준화) 작업할 수 있도록 해줌)
- 메소드는 **추상 메소드만** 있을 수 있다
=> abstract라는 키워드가 없어도 자동으로 추가가 됨.
- 변수는 있을 수 없고, 클래스 상수만 있을 수 있다
=> static final이라는 키워드가 없어도 자동으로 추가 됨.
- 매개변수의 다형성을 인터페이스를 이용해서도 적용할 수 있다.
*매개변수의 다형성
- 메소드의 매개변수를 부모클래스로 설정하면, 해당 부모 클래스를 상속받은 자식 클래스들이 매개변수로 올 수 있다.
- 인터페이스를 이용하여 객체를 만들 수 없다. (기능구현이 안되어있어서 객체를 만들 수 없음)
- 인터페이스는 구현 클래스를 생성한 후, 객체를 만들 수 있다.
- 상속은 extends, 구현은 implements를 이용
- 구현클래스는 여러개의 인터페이스를 구현할 수 있다.
- 구현부가 없어서 기능을 한눈에 볼 수 있음. => 제품설명서의 목차 같은
추상클래스 vs 인터페이스
- 객체멤버변수, 객체상수, -클래스 상수, 추상 메소드
클래스멤버변수, 클래스 상수,
객체메소드, 클래스메소드, 추상메소드
인터페이스의 상속
- 클래스의 상속과는 다르게, 인터페이스의 상속은 다중 상속이 가능(일반 상속과 다르게, 부모에게 물려받은 기능이나 멤버변수의 같은 이름등으로 인한 충돌이랑 상관이 없음)
일반클래스 추상클래스 인터페이스
멤버변수 O O X
상수 O O O
메소드 O O X
추상메소드 X O O
객체생성 O X(자식클래스생성) X(구현클래스생성) *추상클래스/인터페이스는 추상메소드가 있어서 객체생성 불가
상속갯수 1개 1개 여러개
타입변환
- 상속
1. 자동
자식클래스 객체1 = new 자식클래스();
부모클래스 객체2 = 객체1;
2. 강제(조건부로 가능)
부모클래스 객체3 = new 자식클래스();
자식클래스 객체4 = (자식클래스) 객체3;
-구현
1. 자동
구현클래스 객체5 = new 구현클래스();
인터페이스 객체6 = 객체5;
2. 강제
인터페이스 객체7 = new 인터페이스(); //인터페이스를 통해서 객체를 만들 수 없다. 기능이 구현이 되어있지 않기때문에 => **인터페이스 객체7=new구현클래스();**
구현클래스 객체8 = **(구현클래스)객체7**;
중첩클래스
- A클래스를 구현할 때, B클래스가 필요하지만 다른클래스에서는 B클래스가 쓸모없는 경우, 중첩 클래스를 이용
중첩클래스 생김새: 클래스 안에 클래스가 선언되어 있는 형태
class A{
class B{
}
}
익명 객체 (p424)
-일반적으로 클래스를 생성하고, 생성한 클래스를 이용하여 객체를 만듬.
=> 객체의 이름이 있다.
1. 자식 클래스 대신 익명 객체 사용
=> 자식 클래스가 재사용 되지 않고 딱 한군데에서 사용되는 경우, 자식 클래스를 만드는 대신 익명 객체를 만들어서 사용
2. 구현 클래스 대신 익명 객체 사용(제공되는 라이브러리를 이용해서 많이 사용)
=> 구현 클래스가 재사용 되지 않고 딱 한군데에서만 사용되는 경우, 구현 클래스를 만드는 대신 익명 객체를 만들어서 사용
- 익명 객체는 재사용이 안될 때 사용하는 방법으로 재사용이 많이 되는 경우는 사용을 피하자. (예: 딱 한번만 사용될 때, 익명객체 사용하면 됨)
- 익명 객체가 어려우면 굳이 사용하지 않아도 대체방법이 있다.
=> 자식클래스를 생성하거나 구현 클래스를 생성하면 된다.
-익명 객체를 몰라도 된다. 단, **"메소드 안"에서 @Override를 본다면, 익명 객체를** 이용했구나 정도만 떠올리면 된다.
=> 메소드안에서 메소드가 구현됐는데 에러가 안난다면 익명객체를 이용한 것이다. (*일반적으로 메소드안에서 메소드를 구현하지 못함)
**+메인 안에 있는 메소드 => 익명객체**
예외처리 : 예외를 처리
- 예외가 발생되었을 때, 예외처리가 안되어있다면 프로그램이 중단됨. 프로그램이 중단되는 걸 막기위해 예외처리를 해야한다.
- 예외처리란? 예외를 사전에 방지하는 것이 아니라 예외가 발생했을 때, 프로그램이 중단되는 것을 막는 것을 의미
- 예외 : 코드로 해결이 가능 한 것
- 오류 : 코드로 해결이 불가능한 것
-모든 예외클래스의 조상은 Exception클래스
-일반예외 : **컴파일 과정에**서 오류가 남. 실행되지 않음(코드라인옆에 빨갛게 뜨는 오류들)
-실행예외 : **실행**되는 과정에서 오류가 남. 일단 실행은 됨(콘솔창에서 빨간글자들로 에러났다고 뜨는거)
실행예외의 종류
1. NullPointerExeption
- **참조변수를 이용한 경우**, 발생할 수 있다. =>참조변수는 null로 초기화가 가능하기 때문에
- 객체나 배열을 생성하지 않고 멤버변수나 메소드를 사용하는 경우 발생
해결 방법(=예외가 발생하지 않도록 사전에 처리하는 방법) //예외처리(예외가 발생했을 때, 처리하는 방법)
1. 객체나 배열을 **생성**
2. 멤버변수나 메소드를 호출하기 전에 조건문을 이용하여 **null인지 체크**를 하면 된다.
2. ArrayIndexOutOfBoundsException (=배열의 번지가 범위를 벗어났다)
- 배열을 이용할 때 발생할 수 있다.
- 잘못된 배열 번지에 접근하는 경우, 발생한다.
해결방법
1. 배열의 번지는 0부터 **arr.length보다 작다**는 걸 기억하자. (*작거나 같다는 게 아님)
2. 향상된 **for문을 이용해도 되는 상황이면 적극적으로 이용**하자.
3. NumberFormatException
- 문자열을 숫자로 변환할 때에 발생할 수 있다.
- 문자열에 숫자가 아닌 문자들이 있는 경우 발생한다.
해결방법
1. 발생 전 처리(=해결방법)는 따로 없음ㅋㅎ, 발생 후에 처리(=예외처리)는 있음
4. ClassCastException
- 클래스 타입변환 시, 발생할 수 있다.
해결방법
1. **조건문과 instanceof 를 이용**하자