Java 입문 - static/abstract/final/interface

2 분 소요

제어자 (Modifier)

사용과 관련된 제어자 (제어 접근자 X, non-access modifier)

static : 객체생성없이 사용가능한 멤버변수, 멤버메서드, 초기화블럭

abstract : 미완성 클래스, 미완성 메서드

final : 상속불가 클래스, 재정의 불가 메서드, 값변경불가 상수

Static

  • 객체생성없이 사용가능한 멤버변수, 멤버메서드, 초기화블럭

  • 클래스 로딩시 (프로그램 실행시) JVM에 의해서 자동으로 메모리의 class area (method area / static area)로 로딩

  • 프로그램 실행시 메모리 자동로딩해서 ~ 프로그램 종료시까지 메모리에 상주

  • 선언방법:

    • class 멤버변수 (‘static 멤버변수’ 라고 한국에서 표현하기도 함, 정식명칭 X)

      [access-modifiers] static 타입 변수명 [명시적초기값];
      

      → 1. 객체 생성하지 않고 클래스이름.class멤버변수명 사용

      → 2. 해당 클래스의 모든 객체(instance)들이 공유하는 변수, static area에서 프로그램을 종료할때까지 저장

      ⇒ 비교: instance 멤버변수는 해당 객체에서만 접근 가능한 멤버변수, heap area에서 null (참조하지 않을 때 까지)

    • class 멤버메서드 (‘static 멤버메서드’ 라고 한국에서 표현하기도 함, 정식명칭 X)

      [access-modifiers] static 반환타입 메서드명(args) {}
      
    • static 초기화블럭

      static {
      		// 수행문
      }
      
      • 선언위치: 클래스의 멤버로 선언 (메서드 내부 X)

      • 클래스 로딩시 (어플리케이션 시작시) 딱 한번만 수행되는 로직

      • 아규먼트를 전달받지 못함

        ⇒ 비교: 생성자 - 객체를 생성할 때마다 수행, 아규먼트를 전달받을 수 있음

        ⇒ 비교: instance 초기화블럭 - 생성자로 대체 가능하기 때문에 실제로는 사용하지 않음, 아규먼트를 전달받지 못함

        {
        		// 수행문
        }
        
  • 사용방법:

    클래스명.static멤버변수명;
    클래스명.static메서드명(params);
    

final

  • 의미: 끝
  • 상속불가 클래스 : 모든 메서드를 그대로 (재정의불가) 사용 강제
  • 재정의 불가 메서드 : 일부 메서드에 대해서만 재정의불가(부분) 사용 강제
  • 변수의 값변경불가 (=상수)
  • 매개변수: 전달받은 값 변경 불가

abstract

  • 추상메서드

    • 메서드의 형식만 선언하고, 메서드의 구현부가 존재하지 않는 미완성의 메서드
    • 자식클래스에서 반드시 재정의 되어야한다.
    [access-modifier] abstract 반환타입 메서드명([args]);
    
  • 추상클래스

    • 추상메서드가 존재하면 반드시 추상클래스로 선언
    • 미완성의 클래스 (미완성 메서드가 있으니까)
    • 추상메서드가 존재하지 않아도 상속을 강제하는 목적으로 추상클래스로 설계하는 경우도 있음
    • 직접 객체 생성 불가 클래스
    abstract class 클래스명 {...}
    

인터페이스

  • 단일 상속 허용하기 때문에 다중의 클래스(표준)를 상속 불가

  • 부모클래스 설계 개념: 메서드 형식 (기능 표준화 - 사용방법 표준화)

  • 자바 = 독립적 (o/s, db, was)

  • JDBC : Java + DataBase 연결 표준화

  • 구성요소:

    • 표준화 목적으로 인터페이스 역할 설계
    • 상수, 추상메서드로만 구성된 클래스 형태
    • 다중 구현이 가능함
    • 부모 인터페이스와 자식 인터페이스 관계 존재: extends
    • 부모 인터페이스와 자식클래스 관계: implements
  • 부모 인터페이스 선언방법

    public interface 인터페이스이름 {
    		// 상수 : 자동으로 public static final (by javac)
    		// 추상메서드 : 자동으로 public abstract (by javac)
    }
    
  • 자식 인터페이스 선언방법

    public interface 자식인터페이스이름 extends 부모인터페이스이름 {
    		// 상수 : 자동으로 public static final (by javac)
    		// 추상메서드 : 자동으로 public abstract (by javac)
    }
    
  • 자식 클래스 선언방법:

    public class 클래스명 extends 부모클래스명 implements 부모인터페이스이름1, ..., 부모인터페이스이름N {
      
    }
    
  • 부모클래스를 class로 설계 vs. interface로 설계

    ⇒ 상속을 선택적으로 할 수 있는 concrete class

    ⇒ 상속을 강제적으로 하기 위한 abstract class

    ⇒ 다중구현을 강제적으로 하기 위한 interface

    무엇이 더 잘 설계 되었다고 할 수 있기보다는 기능과 필요에 따라 다르게 설계되는 것

객체 생성 및 객체 멤버 사용

  • instance 멤버

    • 같은 클래스의 instance(non-static) 메서드에서 사용: 그냥 사용가능
    • 같은 클래스의 class(static) 메서드에서 사용: 반드시 객체 생성 후 참조변수 통해 접근
    • 다른 클래스에서 사용: 반드시 객체 생성 후 참조변수 통해 접근
    // 객체 생성후 
    참조변수명.instance멤버변수명;
    참조변수명.instance멤버메서드명();
    
  • class 멤버

    • 같은 클래스의 class 메서드 내부 : 그대로 사용 가능

    • 같은 클래스의 instance 메서드 내부 : 그대로 사용 가능

    • 같은 클래스에 있는 static 메서드 내부에서는 instance 멤버는 반드시 객체를 생성한 후에 참조변수를 통해서만 접근 가능

    • 다른 클래스인 경우:

      클래스명.class멤버변수명;
      클래스명.class멤버메서드명();
      

댓글남기기