티스토리 뷰
* 요약 *
static : 변수에 붙일 시 멤버 변수를 클래스 변수로 선언하는 것이고 클래스로부터 생성되는 모든 객체들이 공유하는 변수가 된다.
final : 변수에 붙일 시 상수를 의미하고 메서드 앞에 붙이면 Overriding을 금지하며, 클래스 앞에 붙이면 상속을 금지
abstract : 클래스와 메서드 앞에 붙일 수 있고, 메서드 앞에 붙이면 추상 메서드, 클래스 앞에 붙이면 추상 클래스
#. static 예약어
> static 예약어 (변수)
- 멤버 변수와 메서드 앞에 붙일 수 있는 modifier로서, 활용 방법을 제어
1 2 3 4 5 6 | class Employee { String name; // 인스턴스 변수 int emplyeeNo; // 인스턴스 변수 int age; // 인스턴스 변수 static String companyName = "COMP"; // 클래스 변수 } | cs |
ㄴ static 예약어가 붙지 않는 인스턴스 변수
- 생성된 인스턴스마다 그 안에 클래스의 인스턴스 변수들이 포함
- 클래스로부터 객체가 생성될 때마다 각 객체의 변수들이 생성
- 한 객체의 값이 변경되어도, 다른 객체의 값에 영향을 주지 않음
- 일반적인 멤버 변수를 인스턴스 변수라고 부름
ㄴ static 예약어가 붙는 클래스 변수
- 클래스로부터 생성된 인스턴스에 포함되지 않은 변수
- 많은 인스턴스를 생성하더라도 메모리에 하나의 변수만 존재
- 클래스로부터 생성된 모든 객체들이 하나의 클래스 변수를 공유
- 객체를 생성하지 않고도 접근할 수 있는 변수 (일반적으로 객체 참조 변수 이름으로 접근하기보다 클래스 이름을 통해 접근)
- 객체가 생성될 때 메모리 영역을 할당하지 않고, 클래스가 로딩되는 과정에서 메모리에 한 번만 할당되는 멤버
(클래스 변수의 값이 변경되는 경우, 클래스로부터 생성된 모든 객체에서 변경된 값을 사용 가능)
- 동일한 값을 가지고 있는 변수를 인스턴스 변수로 선언했을 경우, 각 객체에 동일한 값을 가지는 인스턴스 변수가 포함
ex) 회사명, 부서명
> static 예약어 (메서드)
- 클래스 메서드도 마찬가지로 인스턴스를 생성하지 않고도 사용 가능
(ex. Integer.parseInt(" "); )
- 클래스 메서드에서는 클래스 메서드만 호출 가능
- 클래스로부터 인스턴스를 생성하지 않고 호출이 가능
- 인스턴스 변수는 인스턴스를 생성해야만 메모리가 잡히기 때문에 클래스 메서드에서 사용 불가능
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class test { public static int dotCount = 7; // 클래스 변수 public int rollingCount = 0; // 인스턴스 변수 public static void playGame() { dotCount++; // 클래스 변수로 선언되었으므로 접근 가능 rollingCount++; // 인스턴스 변수로 선언되었으므로 접근 불가 system.out.println("Num : " + rollingDice()); // 일반 메서드로 선언되었으므로 호출 불가 } public int rollingDice() { int generatedNum = (int)(Math.random() * 7) + 1; return generatedNum; } | cs |
#. final 예약어
> 변수와 final
- final이 붙은 변수는 단 한 번 초기화가 가능하지만, 초기화 이후에는 값을 변경할 수 없는 상수
- 클래스 변수의 값을 변경할 수 있도록 허용하는 경우, static 예약어의 의미가 상실되므로 final 예약어를 결합하여 사용함으로써 초기화된 값을 변경할 수 없게 함
- 상수의 이름은 일반 인스턴스 변수와 구분하기 위해 모두 대문자로 선언
- 여러 단어가 결합된 경우 단어와 단어 사이에 '_' 언더바를 이용
1 | final static String COMPANY_NAME= "comp" | cs |
> 메서드와 final
- 메서드 재정의(Overriding)는 상속 구조에서 부모 클래스의 메서드와 동일한모양의 메서드를 자식 클래스에서 상속 받지 않고 새롭게 정의하는 것을 의미, 하지만 부모 클래스에 final 예약어를 사용함으로써, 메서드 재정의를 금지할 수 있음
1 2 3 4 5 6 7 | class parents { public final void method() {} } class child extends parents { public void method() {} // 메서드 재정의 불가 } | cs |
> 클래스와 final
1 2 3 4 5 6 7 8 | final class Car { // final 클래스로 자식 클래스를 가지지 못함 String name; int speed; } class Taxi extends Car { // final 클래스로부터 상속을 받으려고 하면 에러 발생 int currentOil; } | cs |
#. abstract 예약어
> 추상 메서드
- 추상 메서드란 메서드의 시그니처(리턴 타입, 메서드명, 매개변수)만 정의되고 구체적인 행위, 즉 블록({}) 부분은 정의되지 않은 메서드를 의미
- abstract 예약어는 클래스와 메서드를 선언할 때 사용하는 Modifier
- 클래스 선언부에서 abstract 사용 시 -> 추상 클래스로 선언
- 메서드를 선언할 때 abstract 사용 시 -> 추상 메서드를 정의
- 추상 메서드를 선언할 때 abstract 예약어는 메서드 앞에 붙여주어야 함
- 메서드의 구체적인 행위를 표현하는 부분은 생략
- 메서드의 기본 형식인 리턴 타입, 메서드명, 매개변수가 선언되어 있어서, 메서드의 기본적인 기능은 유추 가능
1 2 | int sum(int num1, int num2...) {...} // 일반 메서드 abstract int sum(int num1, int num2...); // 추상 메서드 | cs |
> 추상 클래스
- 추상 메서드를 포함하고 있는 클래스는 추상 클래스로 선언되어야 함
- 추상 클래스가 추상 메서드를 포함하지 않을 수도 있음
1 2 3 4 | static class AbstractClass { public abstract void methodA() {...} public abstract void methodB() {...} } | cs |
- 추상 클래스와 메서드 재정의
1 2 3 4 5 6 7 8 9 10 11 12 | abstract class SuperClass { // 부모 클래스가 추상 클래스 public void methodA() { System.out.println("methodA"); } public abstract void methodB(); } class SubClass extends SuperClass { public void methodB() { // 자식 클래스가 추상 메서드를 System.out.println("methodB"); } } | cs |
출처 : SW Expert Academy
'Web > JAVA' 카테고리의 다른 글
[JAVA] 자바의 상속 (0) | 2019.08.08 |
---|---|
[JAVA] 생성자 개요 및 자동 생성 방법 (0) | 2019.08.05 |
[JAVA] Eclipse에서 JAVA로 디버깅하기 (2) | 2019.07.26 |
[JAVA] 매개변수(Call by value, Call by reference), 가변적 매개변수 (1) | 2019.07.26 |
[JAVA] this()의 의미와 사용 (0) | 2019.07.26 |