TIL 230612

전선웅·2023년 6월 12일
0

TIL

목록 보기
4/12

무엇을 배웠나

  • static 키워드
  • 클래스
  • 상속
  • 인터페이스

확장학습

static 키워드의 활용

static 키워드는 단순히 static 변수와 static 메서드에만 활용되는 것이 아니다. 여기서는 static 키워드의 활용으로 static 초기화 블록과 static 중첩 클래스를 알아본다.

Java에서 복잡한 초기화 작업을 필요로 하는 static 필드가 있을 경우, static 초기화 블록을 사용할 수 있다. 복잡한 초기화 작업으로 원주율을 구하는 작업을 예시로 들겠다. 원주율을 계산하는 정확한 알고리즘은 보통 복잡하고 시간이 많이 소요되므로, 간단하게 원주율을 나타내는 static 필드를 초기화하는 것이 적합하다. 이 경우, 원주율 값이 모든 인스턴스에 공통이며, 프로그램 시작 시 한 번만 계산해두면 된다. 이는 static 키워드를 사용하면 블록이 JVM의 Method Area라는 공간에 저장되기 때문에 가능하다.

public class PiInitialization {
    public static final double PI;

    static {
        double pi = 0.0;
        double sign = 1.0;

        for (int i = 0; i < 1000; i++) {
            pi += sign / (2.0 * i + 1.0);
            sign *= -1.0;
        }

        PI = pi * 4.0;
    }
}

이 외에 static 초기화 블록에서는 예외처리도 가능하다. 일반 필드에서는 예외처리가 불가능하므로, 예외처리를 위해서는 static 초기화 필드가 필요하다.

아쉽지만 자세한 코드는 예외처리를 배우고 나서 작성해보기로 한다.

@Override 정체

@Override는 자바에서 사용하는 어노테이션 중 하나로, 메서드가 상위 클래스나 인터페이스의 메서드를 오버라이드(재정의)하고 있음을 나타낸다. 프래그래머에게는 물론, 컴파일러에게도 알려주는 표시이다.

class SuperClass {
    void doSomething() {
       
    }
}

class SubClass extends SuperClass {
    @Override
    void doSomething() {
       
    }
}

만약 부모클래스에서 정의하지 않은 메서드를 자식클래스에서 어노테이션을 사용하여 정의하고 있는 경우, 컴파일 에러가 발생한다. 잘못된 오버라이를 방지할 수 있다.

그런데 여기서 또 하나의 궁금증이 생긴다. 오버라이드 어노테이션이 없이는 오버라이드가 불가능 할까? 그렇지 않다. 오버라이드는 필수가 아니다. '@Override' 없이 자식 클래스에서 오버라이드 하려면 단순히 부모 클래스의 메서드와 동일한 시그니처(이름, 파라미터 타입, 반환 타입)를 가진 메서드를 자식 클래스에 작성하면 된다. 그러나 여러모로 '@Override'를 사용하는 것이 좋아보인다.

인터페이스의 자동 키워드

인터페이스 필드는 컴파일 시 자동으로 public static final이 붙는다. 이는 인터페이스가 갖는 목적 때문이다.

인터페이스는 다른 클래스가 사용하기 위한 것이다. 그래서 인터페이스는 범용적이어야 한다. 다른 클래스가 인터페이스에 접근해야하므로 public이어야 한다.

또한 인터페이스는 다른 클래스들을 관장할 수 있도록 일관적이어야 한다. 그래서 static과 final을 사용한다.

메서드의 경우는 자바가 새로운 버전이 나오면서 public, abstract, default, static, private를 사용할 수 있게 되었다. public과 static으로 다른 클래스들과의 범용성과 유연성을, default와 static으로 일관성을 챙기며, private(또는 private static)로 내부의 중복코드를 최소화할 수 있다.

profile
꿈 많고, 꿈 크고, 꿈 좋은

0개의 댓글