-
자바 스터디 3회차 - 중첩 클래스, 중첩 인터페이스, 예외처리, 패키지카테고리 없음 2024. 4. 11. 16:49
디폴트 메서드와 static 메서드!
인터페이스에 새로운 메서드를(추상 메서드)를 추가하기 어려움 -> 해결책으로 나온 게 디폴트 메서드
사실 static 메서드는 인스턴스와 관계가 없는 독립적인 메서드이기 때문에 인터페이스에 추가 못할 이유는 없었음
디폴트 메서드 = 인스턴스 메서드(인터페이스 원칙 위반, 예외 사항)
- 추상 메서드의 기본적인 구현을 제공하는 메서드
- 추상 메서드가 아니기 때문에 디폴트 메서드가 새로 추가되어도 해당 인터페이스를 구현한 클래스를 변경하지 않아도 됨
- 앞에 키워드는 default 사용, 추상 메서드와 달리 일반 메서드처럼 몸통 { }이 있어야 함
- 접근 제어자는 public 생략 가능
새로 추가된 디폴트 메서드가 기존의 메서드와 이름이 중복되어 충돌할 때 해결하는 규칙
1. 여러 인터페이스의 디폴트 메서드 간의 충돌 - 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩
2. 디폴트 메서드와 조상 클래스의 메서드 간의 호출 / 조상 클래스의 메서드가 상속, 디폴트는 무시
+ 외우기 귀찮으면 그냥 필요한 쪽의 메서드와 같은 내용으로 오버라이딩 하면 됨
내부 클래스! (inner class) - 클래스 안의 클래스
내부 클래스 장점
- 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있음
- 코드의 복잡성을 줄임 (캡슐화)
내부 클래스의 종류와 특징
- 내부 클래스의 종류와 유효 범위(scope)는 변수와 동일
내부 클래스의 제어자와 접근성
- 내부 클래스의 제어자는 변수에 사용 가능한 제어자와 동일
class Ex7_22 { class InstanceInner { int iv = 100; static int cv = 100; // 에러, static 변수 선언 불가 final static int CONST = 100; // final static은 상수이므로 가능 } static class StaticInner { int iv = 200; static int cv = 200 // static클래스만 static멤버를 정의 가능 } viod myMethod() { class LocalInner { int iv = 300; static int cv = 300; // 에러, static 변수 선언 불가 final static int CONST = 300; // final static은 상수이므로 가능 } int i = LocalInner.CONST; // 가능, 지역 내부 클래스의 static 상수는 메서드 내에서만 사용 가능 } public static void main(String args[]) { System.out.println(InstanceInner.CONST); // 100 System.out.println(StaticInner.cv); // 200 // System.out.println(LocalInner.CONST); 불가능, 지역 내부 클래스는 메서드 내에서만 사용 가능 } }
class InstanceInner = 인스턴스 내부 클래스
static class StaticInner = static 내부 클래스
viod myMethod() { class LocalInner { } } = 지역 내부 클래스
익명 클래스
- 내부 클래스 중 이름이 없는 일회용 클래스. 클래스의 정의와 생성을 동시에 함
- 클래스로 상속받는 동시에 인터페이스를 구현하거나, 둘 이상의 인터페이스를 구현 불가. 오로지 하나만 상속
예외처리!
예외 처리의 정의와 목적
정의 - 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성 (미약한 오류)
목적 - 프로그램의 비정상 종료를 막고, 정상적인 실행상태 유지
Exception 클래스들 - 사용자의 실수와 같은 외적인 요인으로 발생하는 예외
RuntimeException 클래스들 - 프로그래머의 실수로 발생하는 예외
예외 처리하기
try - catch 문 사용. 하나 이상의 catch블럭을 생성한 뒤, 예외 종류와 일치하는 단 한 개의 블럭 수행
if문과 달리, try블럭이나 catch블럭 내에 포함된 문장이 하나뿐이어도 괄호 { }를 생략할 수 없음!
예외가 발생한 이후의 문장들은 실행 안됨, 실행 중에 예외가 발생했을 경우 프로그램 강제 종료
printStackTrace() - 예외발생 당시의 호출스택(Call Stack)에 있던 메서드의 정보와 예외 메세지를 화면에 출력
getMessage() - 발생한 예외 클래스의 인스턴스에 저장된 메세지를 얻음
멀티 catch 블럭 - 내용이 같은 catch블럭을 하나로 합친 것
멀티 catch 주의 사항
- 부모 자식 관계는 멀티 캐치로 사용하면 에러, 부모 타입의 참조변수가 선언된 멀티 캐치 사용
- 멀티 캐치 블럭은 각 메서드의 공통 멤버만 사용 가능
예외 발생 시키기
예외 선언하기
1. try - catch문 (은폐 (빈 catch 사용))
2. 예외 선언하기 (예외 떠넘기기, 메서드가 호출시 발생 가능한 예외를 호출하는 쪽에 알리는 것)
(throw = 예외를 발생시키는 키워드, throws = 예외를 메서드에 선언할 때 사용하는 키워드)
finally 블럭
예외 발생 여부와 관계없이 수행되어야 하는 코드를 넣는 것. try - catch문의 맨 마지막에 위치해야 함.
try 블럭 안에 return문이 있어서 try블럭을 벗어날 때도 finally블럭이 실행
예외 되던지기
예외를 처리한 후에 다시 예외를 발생시키는 것
호출한 메서드와 호출된 메서드 양쪽 모두에서 예외처리를 하는 것 (일을 분담하여 처리)
예외 처리하는 방법
1. 호출 받은 쪽에서 try - catch 사용
2. 호출한 쪽에서 try - catch 사용 (떠넘기기)
3. 양쪽에서 처리
패키지! - 관련된 클래스의 묶음
클래스는 클래스 파일, 패키지는 폴더. 하위 패키지는 하위 폴더 (이클립스가 자동으로 해주긴 함)
패키지 선언
- 패키지는 소스파일의 첫 번째 문장으로 단 한번 선언
- 같은 소스파일의 클래스들은 모두 같은 패키지에 속하게 됨
- 패키지 선언이 없으면 이름 없는(unnamed) 패키지에 속하게 됨
- 커맨드에서 실행하려면 패키지 루트로 이동 후 패키지 이름 다 적어줘야 함
클래스 패스
- 클래스 파일(*.class)의 위치를 알려주는 경로(path)
- 환경변수 classpath로 관리하며, 경로 간의 구분자는 ' ; '를 사용
- classpath (환경변수)에 패키지의 루트를 등록해줘야 함
행복하세요.