상세 컨텐츠

본문 제목

[JAVA] 자바 프로그래밍 교육 5일차(과 후기)

JAVA/기본 & 강의복습

by ranlan 2023. 3. 27. 03:51

본문

728x90

#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  란 여러 개의 데이터(객체 기반)를 저장하는 방법론이다.

  • public interface Set<E> extends Collection<E>
    순서가 없으며(인덱스 사용 불가) 중복을 허용하지 않는다. 자주 쓰이는 구현체로는 HashSet 등이 있다.
  • public interface List< E> extends Collection<E>
    시작점과 끝점을 가지면서 값을 저장한다. 순서가 있어 인덱스로 접근 가능하며 중복 데이터 저장이 가능하다.
    ArrayList, Vecotr, LinkedList 등이 있으며 그 중 ArrayList를 가장 많이 사용한다.
  • class Map implements Serializable
    Collection 인터페이스를 따르지 않는다.
    <key: value> 형태로 값을 저장한다. 여기서 key는 중복이 불가하나 value는 중복을 허용한다. 인덱스를 통한 접근은 불가하다.
    HashMap, HashTable, Properties 등이 있다. HashTable은 현재 사용하지 않고 HashTable을 상속받은 Properties는 종종 사용된다. key와 value 모두 String 타입으로 저장 가능한 특징이 있다.

** 가끔 헷갈리는 Map 순회 방법

Map<String, Object> map = new HashMap<String, Object>();

Set<String> keySet = map.keySet();
   for(String key: keySet) {
      map.get(key);
}
** VM 자바 관련 환경 변수 출력
Properties p = System.getProperties();
Enumeration<?> e= p.propertyNames();
while(e.hasMoreElements()) {
   String key = (String)e.nextElement();
   System.out.println(key+": "+p.getProperty(key));
}

 

 

에러와 예외에 대한 정의 
  • Error : serious한 손상, 개발자 영역에서 해결할 수 있는 문제가 아님, 시스템이 종료되어야할 정도의 심각한 문제
  • Exception : mild한 손상, 개발자가 예측하고 막을 수 있는 오류로 예외처리를 통해 런타임에 문제가 없도록 해야한다.

예외 발생 시점에 따른 에러의 두 종류

  • 런타임 에러 : 코드를 수정하여 해결 가능하다. 컴파일러가 인식하지 못해 컴파일은 성공하지만 런타임 시 발생한다.
  • 컴파일 에러 : 무조건 예외처리하고 작성해야한다.

 

예외처리는 뭐든 비정상적으로 프로그램이 종료되지 않도록 처리하는 것이 가장 중요하다.

사용자가 직접 Exception 객체와 예외처리 구문을 사용하여 특정 조건에서 예외를 고의로 발생시키기도 한다. 일종의 강력한 제어문이다.

try{
   // 예외 발생 가능성 있는 코드
   // 예외 발생 시 다음 줄 실행 안하고 바로 catch 구문으로 이동
} catch(Exception e){
   예외 발생 시 수행하고자 하는 코드
   if(e instanceof ArrayIndexOutOfBoundsException) 
      // instanceof 이용하여 예외 객체 종류에 따라 처리 가능
}
  •  Exception  JVM이 예외를 마주쳤을 때 리턴하는 객체이다.
  •  try-catch  예외 발생 코드를 정의한다.
  •  throws  메서드 내에서 예외 발생함을 알려준다.

https://velog.io/@kdhyo/Java%EC%98%88%EC%99%B8Exception%EA%B4%80%EB%A0%A8-%EC%A0%95%EB%A6%AC

* 예외 처리는 메서드 안에서 하면 안된다. 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 프로그래밍 자체에 도움되는 내용이면 훨씬 좋을 것 같다!

 

그리고 이건 교육팀이 올려준 사진에서 날 찾은 동기,,🤷🏻‍♀️

 

 

 

 

728x90

관련글 더보기

댓글 영역