💻 수업정리 (2020)/자바

[5/26] 접근지정자 , 자료형(클래스, 인터페이스, enum)

주다람 2020. 5. 26. 15:32

1. 접근지정자(Access Modifier)

접근지정자 어디에 쓰일수 있는가? 접근가능한 곳
private 필드, 메소드 클래스 내부에서만 접근
default(package) 클래스, 필드, 메소드 접근지정자는 아님, 같은 페이지의 클래스에서 접근
protected 필드, 메소드 같은 패키지 클래스 내에서 접근 가능. 즉, 다른패키지의 클래스가 상속받아 접근 가능 
public 클래스, 필드, 메소드 모든 클래스에서 접근가능
  • 가장 까다로운것 : private > default > protected > public
  • public : 소스안에서 public접근지정자로 지정한 class가 하나만 존재해야만 한다.

 

2. 인터페이스

public interface 인터페이스명 {
            자료형 변수명=값;//public static final 생략
            ...
            반환형 메소드명(매개변수,...);//public abstract 생략
            ...
        }

 

기본 요소 : 상수필드 + 추상메소드 (단, 2개를 같이 쓰는 경우는 별로없음)

  1. 인터페이스를 이용하여 인스터스 생성 불가 (생성자가 없기 때문)
  2. 인터페이스는 클래스가 상속받아 사용한다.(클래스의 부모 역할)
  3. 다중상속이 가능하다
  4. 인터페이스를 상속받은 클래스는 반드시 인터페이스의 모든 추상메소드를 오버라이드 선언 >> 실체화 작업
  5. 인터페이스를 이용하여 참조변수를 생성하고 자식인스턴스 정보를 저장하여 객체 형변환으로 접근 가능
  6. 인터페이스는 기존 인터페이스 상속 가능(extends사용)
  7. 부모인터페이스끼리도 형변환이 가능하다. (공유가 가능하다)

왜 사용하는가?

  1. Java 프로그램 작성시 단일상속의 문제점을 보완하기 위해 인터페이스 사용
  2. 클래스 간의 결합도를 낮춰 시스템 변경에 대한 프로그램 유지보수의 효율성 증가 (결합도를 낮추는게 개발자의몫!!)
  3. 작업명세서의 역할을 한다(상속받은 자식클래스의 메소드 작성규칙을 제공)

참고 ) refractor을 이용하면 클래스들의 공통점을 뽑아내어 interface를 만들수있다.

 

기본메소드(default method)

  • 기본메소드를 호출하기 위해서는 반드시 참조변수를 인터페이스로 생성해야함
  • 오버라이드선언 한 경우 자식클래스의 오버라이드 메소드를 호출
package realization;

public interface Printable {
	void print();
	
	//JDK 1.8이상에서는 인터페이스에 명령을 작성 가능한 기본 메소드 선언
	//=>메소드 선언시 default키우드를 이용하여 선언
	//기본메소드(default) : 인터페이스를 상속받은 자식클래스에 
	//=>오버라이드 선언하지 않아도 되는 메소드
	//오버라이드 선언하지 않은 경우 기본메소드가 선언된다.
	default void scan() {
		System.out.println("[에러] 스캔기능을 제공하지 않습니다.");
	}
}

 

3. Enum(나열형)

  • 클래스(또는 인터페이스)에서 상수필드를 선언할 경우, 문제점이 다음과 같이 생긴다.
1. 상수필드로 값을 대표적으로 표현하기 부적절하다.
2. 상수필드가 의미있는 문자열로 표현되지 않는다.
3.상수필드가 선언된 클래스(또는 인터페이스)가 무의미하다.

=>그래서 JDK 1.5 에서 나열형 자료형을 추가하였다.

 

 

[특징]

  1. 상수필드를 선언하기 위한 자료형 (단, 같은 자료형의 변수에 저장 불가능하다) ex) int -> int에 저장불가
  2. 필드값 대신 의미있는 문자열로 출력됨
  3. 상수필드는 enum 타입으로 생성된 변수에만 저장이 가능하다
  4. enum 타입자체가 변수를 생성하기 위한 자료형으로 사용됨
  5. 나열형에서 선언된 상수필드만 변수에 저장가능하다.
package Enumerate;

public enum StringEnum {
	//생성자를 선언한 경우 상수필드 선언시 초기값을 전달해야만 상수필드가 생성됨.
	INSERT("insert"), UPDATE("update"), DELETE("delete"), SELECT("select"); //내부적으로는 자동으로 0,1,2,3이 들어감
	
	//상수필드에 원하는 자료형 또는 값을 저장하기위해 필드를 선언
	//private final 필드로 선언해 주어야함
	//상수필드에 원하는 값을 저장하기 위해 반드시 생성자를 선언
	private final String value;
	
	//상수필드에 초기값을 전달하여 저장하기 위한 생성자 선언
	//생성자는 반드시 private접근지정자를 이용하여 은닉화 선언해야함
	//매개변수에 전달된 값을 필드에 저장하면 상수필드값으로 초기화됨
	
	private StringEnum(String value) {
		this.value = value;
	}

	//상수필드의 값을 확인하기 위해 만든 메소드
	public String getValue() {
		return value;
	}
}

 

4. 예외처리

예외처리란?

예외가 발생된 경우 예외를 처리하기 위한 방법

 

예외처리를 왜 하는가?

프로그램 사용자에게 메세지를 제공하거나, 개발자에게 에러로그를 제공하기 위해서!

 

예외처리를 처리하는 클래스

Trowable : 프로그램 오류에 관련된 최상위 클래스

Error : 하드웨어에 의해 발생하는 오류 처리를 위한 상위클래스

Exception : 소프트웨어에 의해 발생하는 오류를 처리하기 위한 상위 클래스

 

예외의 종류

  1. 작성 관련 예외 : 예외처리를 하지 않을 경우 컴파일에러 발생 >> RuntimeException클래스를 상속받지 않는 클래스로 예외처리
  2. 실행관련 예외 : 프로그램을 실행할 경우 예외발생 >> RuntimeException클래스를 상속받아 자식클래스로 예외처리

예외처리 방법

   형식) try {
               예외가 발생될수 있는 명령; ... 
            } catch(예외클래스 참조변수) {  
               예외처리명령; ...
            } finally {
               무조건 실행 명령; ...
            }

 

try catch finally
1. 예외가 발생되는 명령은 try영역에 작성
2. try영역의 명령이 실행 될 때 예외가 발생되는지 감시
3. 예외가 발생되면, 발생된 명령 하단에 작성된 명령을 미실행
1. 예외가 발생된 경우, catch영역의 명령을 실행
2. catch 구문의 참조변수의 예외 클래스의 인스턴스를 전달받아 처리

*e.getMessage() : 전달받은 예외 인스턴스의 에러메세지를 반환한다.
*e.printStackTrace() : 에러가 발생된 흐름을 추적해서 보여준다.
예외와 상관없이 실행되는 명령을 작성
(잘 생략됨)

모든 명령을 try문에 넣어버리게 되면 실행할 때마다 try검사를 하므로 속도가 느려질 수 있으니 꼭 필요할때만 사용할것