티스토리 뷰
Java/Java Basic
[Java] 2-03 - 자바 Modifier : static, final, abstract, 인스턴스 변수, 클래스 변수, 상수, 추상 메소드와 추상 클래스
jhk828 2021. 1. 9. 00:051. 자바의 Modifier
static
+ 변수 => 인스턴스 변수가 아닌 클래스 변수 - 모든 객체가 공유static
+ 메서드 => 클래스 메서드 - 인스턴스를 생성하지 않고도 메서드 사용 가능final
+ 변수 => 상수final
+ 메서드 => Overriding 금지final
+ 클래스 => 상속 금지
1. static
예약어
static
+ 변수 => 클래스 변수
인스턴스 변수 (static x) | 클래스 변수 (static) |
- 생성된 인스턴스마다 그 안에서 클래스의 인스턴스 변수들이 포함된다. - 일반적인 멤버 변수 => 인스턴스 변수 - 한 객체의 값이 변경되어도, 다른 객체의 값에 영향을주지 않음 |
- 클래스로부터 생성된 모든 객체들이 하나의 클래스 변수를 공유 - 객체가 생성될 때 마다 메모리 영역을 할당하지 않고, 클래스가 로딩되는 과정에서 메모리에 한번만 할당되는 멤버임 - 클래스 변수의 값이 변경 => 클래스로부터 생성된 모든 객체에서 변경된 값 사용 가능 - 객체를 생성하지 않고도 접근 가능 |
// EmployeeTest.java
class Employee {
String name;
int employeeNo;
int age;
static String companyName = "S전자"; // 클래스 변수 선언
}
public class EmployeeTest {
public static void main(String[] args) {
Employee kim = new Employee();
System.out.println("kim의 회사명 : " + kim.companyName);
Employee lee = new Employee();
lee.companyName = "A전자"; // 클래스 변수 수정
System.out.println("lee의 회사명 : " + lee.companyName);
Employee park = new Employee();
System.out.println("park의 회사명 : " + park.companyName);
// lee 참조 변수에 의해서 변경된 회사명을 그대로 출력함
// kim의 회사명 : S전자
// lee의 회사명 : A전자
// park의 회사명 : A전자
}
}
클래스 변수의 접근
- 클래스 변수는 일반적으로 객체 참조 변수 이름으로 접근하기 보다는 클래스 이름을 통해서 접근함
- 객체를 생성하지 않고도 클래스 변수에 접근 가능함
- 지금까지 사용했던 자바 출력문은 모두
System
클래스의out
클래스 변수다.
클래스 메서드
- 메서드에서도 static 예약어 사용 가능함
- 인스턴스를 생성하지 않고도 메서드 사용 가능
Integer
클래스의parseInt()
메서드가 대표적인 클래스 메서드다.int age = Integer.parseInt("36");
// 문자열을 정수로 변환
- 클래스 메서드 -- X --> 인스턴스 변수
- 인스턴스 변수는 인스턴스를 생성해야만 메모리가 잡히기 때문에 클래스 메서드에서 사용이 불가하다.
- 클래스 메서드 --------> 클래스 메서드
- 클래스 메서드는 클래스 메서드만 호출 가능하다.
// StaticMethodTest1.java
class Dice {
public static int dotCount = 5; // 클래스 변수
public int rollingCount = 0; // 인스턴스 변수
public static void playGame() { // 클래스 메서드
dotCount++; // 클래스 변수 => playGame()에서 접근 가능
rollingCount++; // 인스턴스 변수 => 클래스 변수 접근 불가
System.out.println("생성된 숫자 : " + rollingDice());
// 일반 메서드 rollingDice() => 클래스 메서드 playGame()에서 호출 불가
}
public int rollingDice() {
int generatedNum = (int)(Math.random() * 6) + 1;
return generatedNum;
}
}
public class StaticMethodTest1 {
public static void main(String[] args) {
Dice.playGame();
}
}
// StaticMethodTest2
class Dice {
public static int dotCount = 5;
public static int rollingCount = 0;
// 클래스 변수 rollingCount는 클래스 메서드 playGame()에서 접근 가능
public static void playGame() {
dotCount++;
rollingCount++;
System.out.println("생성된 숫자 : " + rollingDice());
// 클래스 메서드 rollingDice() => playGame()에서 접근 가능
}
public static int rollingDice() {
int generatedNum = (int)(Math.random() * 6) + 1;
return generatedNum;
}
}
public class StaticMethodTest2 {
public static void main(String[] args) {
Dice.playGame(); // 생성된 숫자 : 6
}
}
2. final
예약어
final
+ 변수 => 상수,final
+ 메서드 => Overriding 금지,final
+ 클래스 => 상속 금지
final
+ 변수
final
+ 변수 단 한번 초기화 가능, 값 변경 불가static
+final
+ 변수- 클래스 변수는, 클래스로부터 생성된 모든 객체들이 동일한 값을 가지는 경우이다.
- 클래스 변수의 값을 변경할 수 있도록 허용하면
static
예약어 의미가 상실되므로final
예약어와 결합하여 사용한다.
- 상수의 이름은 이름은 일반 인스턴스 변수와 구분하기 위해 모두 대문자로 선언
- 여러 단어가 결합된 경우라면 '_' 이용
- ex)
companyName
=>COMPANY_NAME
- ex)
- 여러 단어가 결합된 경우라면 '_' 이용
// EmployeeTest.java
class Employee {
String name;
int employeeNo;
int age;
// static String companyName = "S전자";
final static String COMPANY_NAME = "S전자"; // 상수 형태의 클래스 변수 선언
}
public class EmployeeTest {
public static void main(String[] args) {
Employee kim = new Employee();
System.out.println("kim의 회사명 : " + kim.COMPANY_NAME);
Employee lee = new Employee();
// lee.companyName = "A전자"; // 수정 시 문제 발생
System.out.println("lee의 회사명 : " + lee.COMPANY_NAME);
}
}
final
+ 메서드
- 자식 클래스에서 메서드 재정의 금지
final
+ 클래스
- 상속 금지
3. abstract
예약어
- 클래스 선언시 abstract => 추상 클래스
- 메서드 선언시 abstrct => 추상 메서드
추상 메서드
- 메서드의 시그니처 (리턴 타입, 메서드명, 매개변수)만 정의되고 구체적인 행위 (블록 부분)은 정의되지 않는 메서드
abstract int sum(int num1, int num2);
추상 클래스
- 추상 메서드를 포함하는 클래스는 추상 클래스로 선언되어야 한다.
- 추상 클래스가 추상 메서드를 포함하지 않을 수도 있다.
// 추상 메서드를 포함한 추상 클리스
abstract class AbstractClass {
public abstract void methodA() {...}
public abstract void methodB() {...}
}
abstract class SuperClass {
// 부모 클래스인 SuperClass에 methodA(), methodB() 두 개의 메서드가 정의됨
public void methodA() {
System.out.println("methodA() 실행");
}
public abstract void methodB();
}
class SubClass extends SuperClass {
// 자식 클래스가 상속
// 상속은 부모 클래스의 모든 변수와 메서드가 자식 클래스로 상속되어 들어오는 개념이다.
// => SubClass에는 구현되지 않는 methodB()가 추상 메서드로 있는 것과 동일하다.
// => SubClass를 추상 클래스로 선언하면 객체를 생성할 수 없게 된다.
// => 따라서 methodB()를 재정의해야 한다.
public void methodB() {
System.out.println("methodB() 실행");
}
}
출처 - swexpertacademy.com/
'Java > Java Basic' 카테고리의 다른 글
[Java] 2-04 - 메서드 Overloading, this() 생성자 (0) | 2021.01.09 |
---|---|
[Java] 2-03 - 생성자와 this (0) | 2021.01.09 |
[Java] 2-02 - 클래스의 구조 - 접근제한자와 정보은닉, 메서드 자동 생성, Getter(), Setter(), toString() (0) | 2021.01.09 |
[Java] 2-01 - 객체지향 핵심 개념 (0) | 2021.01.09 |
[Java] 04 - 자바 제어문 (0) | 2021.01.09 |
댓글