Java 입문 - static/abstract/final/interface
제어자 (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멤버메서드명();
-
댓글남기기