java

기본 정리

Chris.Ko 2023. 1. 14. 01:00

Q) 인스턴스 멤버와 정적 멤버 ?

인스턴스 멤버는 객체마다 가지고 있는 멤버(필드,메소드), 정적(static) 멤버는 클래스에 위치시키고 객체들이 공유하는 멤버(필드,메소드)

 

정적 필드와 정적 메소드는 클래스에 고정된 멤버이므로 클래스 로더가 클래스를 로딩해서 메소드 메모리 영역에 적재할 때 클래스별로 관리되기 때문에 클래스 로딩이 끝나면 바로 사용할 수 있다.

정적 메소드는 객체가 없어도 실행된다는 특징 때문에 선언시 이들 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 없다. 또한 객체 자신의 참조인 this 키워드도 사용이 불가능하다.

 

final 필드 : 초기값이 저장되면 이것이 최종적인 값이 되어서 프로그램 실행 도중에 수정할 수 없는 필드

상수 : 불변의 값을 저장하는 필드를 자바에서는 상수(constant)라고 한다. 상수는 static final 키워드로 선언

 

Q) 접근 제한자 ?

  • public : 외부 클래스가 자유롭게 사용할 수 있도록 합니다
  • protected : 같은 패키지에 있는 객체와 상속관계의 객체들만 허용
  • default : 같은 패키지에 소속된 클래스에서만 허용
  • private : 현재 객체 내에서만 허용
  같은 클래스 같은 패키지 자식 클래스 전체
public O O O O
protected O O O  
default O O    
private O      

접근 제한자 사용

  • 클래스 : public, default
  • 생성자 : public, protected, default, private
  • 멤버변수 : public, protected, default, private
  • 멤버메소드 : public, protected, default, private
  • 지역변수 : 접근 제한자 사용 불허

Q) 추상클래스

객체를 직접 생성할 수 있는 클래스를 실체 클래스라고 한다면 이 클래스들의 공통적인 특성을 추출해서 선언한 클래스를 추상 클래스라 한다.

추상 클래스 선언 

클래스 선언에 abstract 키워드를 붙이면 된다.

abstract를 붙이면 new 연산자를 이용해서 객체를 만들지 못하고, 상속을 통해 자식 클래스만 만들 수 있다.

new 연산자로 직접 생성자를 호출할 수는 없지만 자식 객체가 생성될 때 super()를 호출해서 추상 클래스 객체를 생성하므로 추상 클래스도 생성자가 반드시 있어야 한다.

 

 

Q) 예외 클래스

 

자바에서는 예외를 클래스로 관리합니다. JVM은 프로그램을 실행하는 도중에 예외가 발생하면 해당 예외 클래스로 객체를 생성합니다. 그리고 나서 예외 처리 코드에서 예외 객체를 이용할 수 있도록 해준다. 모든 예외 클래스는 java.lang.Exception 클래스를 상속 받는다.

 

Exception클래스와 RuntimeException클래스 중심의 상속계층도

 

일반 예외 (exception) & 실행 예외 (Runtime exception)

  • 일반 예외 : 컴파일러 체크 예외라고도 하는데, 프로그램 실행 시 예외가 발생할 가능성이 높기 때문에 자바 소스를 컴파일하는 과정에서 해당 예외 처리 코드가 있는지 검사한다. 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외

ex)

  • FileNotFoundException : 존재하지 않는 파일의 이름을 입력했다
  • ClassNotFoundException : 클래스의 이름을 잘못 적었다
  • DataFormatException : 입력한 데이터 형식이 잘못되었다.
  • 실행 예외 : 컴파일러 넌 체크 예외라고 하는데, 실행 시 예측할 수 없이 갑자기 발생하기 때문에 컴파일하는 과정에서 예외 처리 코드가 있는지 검사하지 않는다. 프로그래머의 실수로 발생하는 예외

ex)

  • ArrayIndexOutOfBoundsException : 배열의 범위를 벗어낫다
  • NullPointerException : 값이 null인 참조변수의 멤버를 호출하려 했다
  • ClassCastException : 클래스간의 형변환을 잘못했다
  • ArithmeticException : 정수를 0으로 나누려했다.

 

Q) 다형성 ?

다형성이란? 하나의 메서드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 의미한다.

다형성의 가장 쉬운 예제로는 오버로딩(메서드)이다.

클래스의 다형성으로는 상속으로 인한 오버라이딩이 있는데 

class A { 
    public String x() { return "A.x" };
}

class B extends A { 
    public String x() { return "B.x" };
    public String y() { return "B.y" };
}

class B2 extends A { 
    public String x() { return "B2.x" };
}

public class Polymorphism1 {
    public static void main(String[] args) {
        A obj1 = new B();
        A obj2 = new B2();
        System.out.println(obj1.x()); //B.x 출력
        System.out.println(obj2.x()); //B2.x 출력
    }
}

B 를 인스턴스화 해서 데이터 타입 A로 가지는 obj1이 있다. obj1에서 x() 호출은 A 클래스의 x()가 호출된다. 하지만 자식클래스에서 부모클래스를 오버라이딩 했다면 실제 동작하는 건 B 클래스의 x()가 호출된다. obj1에서 y() 호출은 A 클래스의 y()가 없기 때문에 없는 메서드가 된다.

'java' 카테고리의 다른 글

com.fasterxml.jackson.databind.exc.InvalidDefinitionException  (0) 2023.01.06
JVM  (0) 2023.01.06
<? super T> 와 <? extends T>의 차이는 무엇인가?  (0) 2021.07.06