#0317_자바_프로그래밍_교육_5일차
인터페이스(Interface)
interface Interface{}
Class implements Interface {}
구현부가 없이 선언부로만 이뤄진 추상 메서드들의 집합으로 필드는 없다. (대신 상수는 정의 가능)
상속받은 자식들은 부모에서 선언된 메서드들을 무조건 구현해야한다. 클래스는 객체를 생성하기 위한 완벽한 설계도로 구멍이 하나라도 있으면 안된다.
인터페이스의 메서드들은 추상 키워드인 abstract와 접근 지정자 public은 항상 붙음으로 생략 가능하다. 구현부는 존재하지 않으며 상속받은 자식에서 구현한다.
[public abstract] 리턴타입 메서드명 ([인자..]);
[public static final] 변수명 = 값;
인터페이스는 객체 생성의 대상이 될 수 없다. 클래스 내 abstract이 하나라도 있으면 객체 생성이 되지 않는다. 객체 생성 시 타입으로서만 정의 가능하다.
interface Parent {};
Child implements Parent{};
Parent p = new Parent(); // (X) Parent cannot be resolrved to a type, 객체 생성 안됨
Parent c = new Child(); // (O) Polymorphism 부모 타입으로 자식 생성이 가능
부모 타입으로 자식 객체 생성은 가능하나 자식만의 메서드나 필드를 사용하고자할땐 자식 타입으로 Object Casting 해줘야한다.
상속받은 부모 클래스의 메서드를 다 오버라이딩하지 않으면 추상 클래스가 된다. 추상 클래스는 메모리에 올라가지 못한다. 즉 객체 생성을 할 수 없다.
** 클래스가 객체 생성의 설계도라면 인터페이스는 설계도의 템플릿이다. 속한 메서드를 무조건 구현하도록 만든 것이다. 추상(abstract) 클래스는 완벽하지 않은 설계도(클래스)이다.
Collection API 란 여러 개의 데이터(객체 기반)를 저장하는 방법론이다.
** 가끔 헷갈리는 Map 순회 방법
Map<String, Object> map = new HashMap<String, Object>();
Set<String> keySet = map.keySet();
for(String key: keySet) {
map.get(key);
}
Properties p = System.getProperties();
Enumeration<?> e= p.propertyNames();
while(e.hasMoreElements()) {
String key = (String)e.nextElement();
System.out.println(key+": "+p.getProperty(key));
}
예외 발생 시점에 따른 에러의 두 종류
예외처리는 뭐든 비정상적으로 프로그램이 종료되지 않도록 처리하는 것이 가장 중요하다.
사용자가 직접 Exception 객체와 예외처리 구문을 사용하여 특정 조건에서 예외를 고의로 발생시키기도 한다. 일종의 강력한 제어문이다.
try{
// 예외 발생 가능성 있는 코드
// 예외 발생 시 다음 줄 실행 안하고 바로 catch 구문으로 이동
} catch(Exception e){
예외 발생 시 수행하고자 하는 코드
if(e instanceof ArrayIndexOutOfBoundsException)
// instanceof 이용하여 예외 객체 종류에 따라 처리 가능
}
* 예외 처리는 메서드 안에서 하면 안된다. throws Exception으로 예외를 던져준 후 해당 메서드를 호출한(리턴받는) 쪽에서 해당 예외에 대한 처리를 해야한다.
- 메서드 내 예외 핸들링이 필요한 부분에서 throw Exception 하고 끝낸다.
- 예외를 던지는 메서드를 호출하는 부분을 try 구문 안에 넣고 예외 발생 시 catch 구문에서 예외 처리를 진행한다.
예시 - UserExam Class
class UserExam{
public void go() throws UserException {
System.out.println("=== go() 메서드 진입 ===");
int i=10;
int j=0;
if(j==0) {
// 필요한 부분에서 고의로 예외를 발생시킴
System.out.println("분모가 0이 되면 안됨");
throw new ArithmeticException();
}
System.out.println("=== go() 메서드 종료 ===");
}
}
- 실행 Class
public class UserExceptionTest {
public static void main(String[] args) {
System.out.println("=== 프로그램 시작 ===");
UserExam ex = new UserExam();
System.out.println("=== UserExam 객체 생성 ===");
try {
ex.go();
} catch(Exception e) {
// 이 부분에서 예외에 대한 핸들링 필요
System.out.println("=== 예외 발생 ===");
}
System.out.println("=== 프로그램 종료 ===");
}
}
실행 결과
=== 프로그램 시작 ===
=== UserExam 객체 생성 ===
=== 예외 발생 ===
분모가 0이되면 안됨
=== 프로그램 종료 ===
사용자가 직접 작성한 Exception 활용 예시 - Custom Exception
class UserException extends Exception{
UserException(){
this("This is an UserException"); // 다른 생성자 호출 UserException(String message)
}
UserException(String message){
super(message); // Exception(String message)
}
@Override
public String getMessage() {
return super.getMessage() + " 분모가 0이 되면 안됨";
}
}
좋은 강사님을 만나 보람찬 일주일이었다. 가산은 잠실보다 좀 더 회색빛이 도는 것 같지만 안양천은 석촌호수보다 산책하기 좋았고 본사 밥은 기대보다 괜찮았다. 무엇보다도 교육팀에서 식권줘서 일주일동안 식비 안들어서 아주 좋았다 흐.. 그리고 여긴 비행기가 정말 낮게 나는 것 같다. 아빠랑 일주일동안 출퇴근 같이해서 그것도 좋았다. 다시 복귀해서 지하철로 출퇴근할 생각하니 머리가 아프다.. 암튼 난 지금 자바로 업무를 하고는 있지만 제대로 배워본 적이 없어서 나에게 아주 소중하고 좋은 경험이었다.
아쉬운 점은 원래 교육 일정에는 람다식이나 스트림, 미니 프로젝트 등 더 많은 주제가 있었는데 시간관계상 생략된것 같다. 거의 하루치 분량을 못했던데 난 후반부 일정이 더 궁금했던터라 많이 아쉽다. 한 2일만 더 해서 좀 더 심화 주제나 실무에서의 자바 사용에 필요한 부분을 더 익혔으면 어땠을까 싶다! 선배는 일주일정도 더 해서 스프링 교육까지 했으면 좋았을 것 같다고 하신다. 초반의 메모리 구조나 이런 부분들은 재밌고 유익했는데 확실히 반복문, 데이터 타입 등 문법적으로 가니까 수업이 좀 루즈해지고 쉬웠다. 필수적인 내용이지만 이런 부분은 교육생도 힘들고 강사님도 힘드셨을 것 같다. 다음엔 보다 더 실무적인 내용이나 OOP 프로그래밍 자체에 도움되는 내용이면 훨씬 좋을 것 같다!
그리고 이건 교육팀이 올려준 사진에서 날 찾은 동기,,🤷🏻♀️
JAVA 버전 8, 11, 17 차이 알아보기 (JDK, JRE, JVM과 버전 명명법) (0) | 2024.06.22 |
---|---|
[JAVA] 자바 프로그래밍 교육 4일차 (0) | 2023.03.27 |
[JAVA] 자바 프로그래밍 교육 3일차 (0) | 2023.03.27 |
[JAVA] 자바 프로그래밍 교육 2일차 (0) | 2023.03.27 |
[JAVA] 자바 프로그래밍 교육 1일차 (0) | 2023.03.13 |
댓글 영역