For Programmer
6-1. 클래스 - 멤버 변수 본문
멤버 변수(member variable)는 메소드 밖에서 선언된 변수를 말한다. 메소드 안에 선언된 변수는 지역(local) 변수라고 한다.
- 맴버 변수
- 객체 변수
- 객체 속성 변수
- 객체 참조 변수
- 클래스 변수
- 종단(final) 변수
- 객체 변수
멤버 변수의 구성
멤버 변수 선언은 접근 한정자(public, private, protected)를 제외하고는 일반 변수의 구성과 동일하다.
[public/private/protected] [static/final] 변수 타입 변수명;
멤버 변수 선언
멤버 변수 선언은 접근 한정자를 제외하고는 일반 변수의 선언과 동일하다.
int a;
public int b;
private MyClass myclass;
선언과 초기화 및 생성을 같이 할 수 있는데 코드로 보면 아래와 같다.
public int b = 0;
private MyClass myclass = new MyClass();
멤버 변수명은 일반 변수명과 동일하게 소문자로 시작하는 것이 관례이다. 단, static final으로 선언된 변수인 경우 모두 대문자를 하는 경우도 많다.
private static final int MY_NUM;
이는 일종에 상수같은 역할을 한다고 생각하면 된다.
접근 제어 한정자(Access control modifiers) - 멤버 변수
- public
- public는 모든 클래스에서 접근 가능하다.
- private
- final은 한번 선언이 되면 변경이 불가능 하다.
- protected
- public 과 default의 중간쯤 된다. 같은 패키지 내에서는 default와 같이 접근 제한이 없지만, 다른 패키지 에서는 자식클래스만 접근을 허용한다. 또한 protected 접근자는 맴버변수(필드),생성자,메서드에만 사용가능하다.
- 접근 한정자 사용 안 함
- 한정자를 사용하지 않고 선언된 멤버 변수는 같은 패키지 내의 클래스에서만 접근 가능하다.
객체변수
객체 변수는 객체가 가질 수 있는 특성을 표현한다. 객체 변수를 표현하는 값에 따라 객체 속성 변수와 객체 참조 변수로 2가지 형태로 구분된다.
객체 속성 변수
객체 속성 변수는 기본 자료형(int, float, char, byte 등)의 값을 가지는 변수이다.
public int b;
변수의 값이 복사되어 전달된다.
객체 참조 변수
객체 참조 변수는 생성된 객체를 지정하는 변수이다. 객체에 대한 참조(reference) 즉, 객체가 생성 저장된 주소(address)를 가진다.
private MyClass myclass;
객체에 대한 주수가 복사되어 전달되므로 결국 같은 객체를 가리키게 된다.
클래스 변수 - static 키워드
클래스 변수는 다른 말로 정적 변수라고도 한다. static을 사용하여 선어하고 전역변수(global variable)로써의 개념을 가진다.
- static을 사용하여 선언. 전역변수(global variable)의 개념을 가짐
- 그 클래스로부터 생성된 모든 객체들이 하나의 클래스 변수를 공유. 클래스변수는 하나의 클래스로부터 생성된 객체들 사이의 통신이나 객체들 사이의 공통된 속성을 표현하는데 사용가능
- 일반변수와 달리 객체이름을 통해 접근 불가 → 클래스이름을 통해서 접근(= 클래스의 변수라고 생각하기
- 정적 필드와 정적 메소드는 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 고정된 멤버입니다. 그렇기에 클래스 로더가 클래스를 로딩해서 메소드 메모리 영역에 적재할때 클래스별로 관리됨 따라서 클래스의 로딩이 끝나는 즉시 바로 사용가능
- Static 키워드를 통해 생성된 정적멤버들은 Heap영역이 아닌 Static영역에 할당됩니다. Static 영역에 할당된 메모리는 모든 객체가 공유하여 하나의 멤버를 어디서든지 참조할 수 있는 장점을 가지지만 Garbage Collector의 관리 영역 밖에 존재하기에 Static영역에 있는 멤버들은 프로그램의 종료시까지 메모리가 할당된 채로 존재하게 됩니다. 그렇기에 Static을 너무 남발하게 되면 만들고자 하는 시스템 성능에 악영향을 줄 수 있습니다.
정적(Static) 필드 사용 예시
class Number{
static int num = 0; //클래스 필드
int num2 = 0; //인스턴스 필드
}
public class Static_ex {
public static void main(String[] args) {
Number number1 = new Number(); //첫번째 number
Number number2 = new Number(); //두번쨰 number
number1.num++; //클래스 필드 num을 1증가시킴
number1.num2++; //인스턴스 필드 num을 1증가시킴
System.out.println(number2.num); //두번째 number의 클래스 필드 출력
System.out.println(number2.num2); //두번째 number의 인스턴스 필드 출력
}
}
1
0
Number이라는 클래스안에 클래스 변수 num과 인스턴스 변수 num2를 생성하였고 두개의 Number인스턴스 number1과 number2를 생성했을때 number1에서 num1과 num2를 각각 1씩 증가시키고 number2에서 num1와 num2를 각각 출력시켰을때는 num1은 1, num2는 0이 출력되었습니다. 왜 이런 현상이 나타났느냐면 인스턴스 변수는 인스턴스가 생성될 때마다 생성되므로 인스턴스마다 각기 다른 값을 가지지만 정적 변수는 모든 인스턴스가 하나의 저장공간을 공유하기에 항상 같은 값을 가지기에 나타난 현상입니다.
정적(Static) 메서드 사용 예시
class Name{
static void print() { //클래스 메소드
System.out.println("내 이름은 홍길동입니다.");
}
void print2() { //인스턴스 메소드
System.out.println("내 이름은 이순신입니다.");
}
}
public class Static_ex {
public static void main(String[] args) {
Name.print(); //인스턴스를 생성하지 않아도 호출이 가능
Name name = new Name(); //인스턴스 생성
name.print2(); //인스턴스를 생성하여야만 호출이 가능
}
}
내 이름은 홍길동입니다.
내 이름은 이순신입니다.
정적 메소드는 클래스가 메모리에 올라갈 때 정적 메소드가 자동적으로 생성됩니다. 그렇기에 정적 메소드는 인스턴스를 생성하지 않아도 호출을 할 수 있습니다. 정적 메소드는 유틸리티 함수를 만드는데 유용하게 사용됩니다.
https://honbabzone.com/java/java-static/ (static에 대한 자세한 정리글(JVM개념까지 적용)
final 변수
- final를 사용하여 변수를 지정하면 사용하여 선언. 변할 수 없는 상수값을 가짐
- final이 붙은 변수는 단 한번 초기화 할 수 있으며 그 이후에는 그 값을 변경할 수 없음
- 변수이름 사용의 관례상 final변수는 대문자를 많이 사용
'Programming language > Java' 카테고리의 다른 글
6-3 클래스 - 메소드 (0) | 2021.08.13 |
---|---|
6-2 클래스 - 생성자 (0) | 2021.08.13 |
6. 클래스 (0) | 2021.08.13 |
5. 제어문(가정문,반복문) (0) | 2021.08.12 |
4. 배열 (0) | 2021.08.11 |