티스토리 뷰

반응형

* 요약 *

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



반응형
댓글
최근에 올라온 글
최근에 달린 댓글
링크
Total
Today
Yesterday