[목차]
- 맴버란?
- 클래스 변수
- 클래스 메소드
- 타입별 비교
맴버란
- 구성원이라는 뜻을 가지고 있습니다
- 메소드 밖에 선언된 변수
클래스 변수
class Calculator {
// static을 맴버(변수, 메소드) 앞에 붙이면 클래스의 맴버가 됩니다
static double PI = 3.14;
int left, right;
public void setOprands(int left, int right) {
this.left = left;
this.right = right;
}
public void sum() {
System.out.println(this.left + this.right);
}
public void avg() {
System.out.println((this.left + this.right) / 2);
}
}
public class CalculatorDemo1 {
public static void main(String[] args) {
Calculator c1 = new Calculator();
// 인스턴스를 통해서 PI에 접근
System.out.println(c1.PI);
Calculator c2 = new Calculator();
System.out.println(c2.PI);
// 클래스를 통해서 PI에 접근
System.out.println(Calculator.PI);
}
}
- 클래스 변수는 변수의 변경사항을 모든 인스턴스에서 공유해야할 때 사용방법
- 모든 계산에 값을 포함시켜야할 떄
class Calculator2 {
static double PI = 3.14;
// 클래스 변수인 base가 추가되었다.
static int base = 0;
int left, right;
public void setOprands(int left, int right) {
this.left = left;
this.right = right;
}
public void sum() {
// 더하기에 base의 값을 포함시킨다.
System.out.println(this.left + this.right + base);
}
public void avg() {
// 평균치에 base의 값을 포함시킨다.
System.out.println((this.left + this.right + base) / 2);
}
}
public class CalculatorDemo2 {
public static void main(String[] args) {
Calculator2 c1 = new Calculator2();
c1.setOprands(10, 20);
// 30 출력
c1.sum();
Calculator2 c2 = new Calculator2();
c2.setOprands(20, 40);
// 60 출력
c2.sum();
// 클래스 변수 base의 값을 10으로 지정했다.
Calculator2.base = 10;
// 40 출력
c1.sum();
// 70 출력
c2.sum();
}
}
클래스 메소드
- 인스턴스를 사용하지 않고 클래스에 직접 접근해서 sum과 avg 접근
class Calculator3{
public static void sum(int left, int right){
System.out.println(left+right);
}
public static void avg(int left, int right){
System.out.println((left+right)/2);
}
}
public class CalculatorDemo3 {
public static void main(String[] args) {
Calculator3.sum(10, 20);
Calculator3.avg(10, 20);
Calculator3.sum(20, 40);
Calculator3.avg(20, 40);
}
}
맴버타입의 비교
- 인스턴스 메소드는 클래스 맴버에 접근 할 수 있습니다.
- 클래스 메소드는 인스턴스 맴버에 접근할 수 없습니다.
- 인스턴스 변수 -> Non-Static Field
- 클래스 변수 -> Static Field
class C1{
static int static_variable = 1;
int instance_variable = 2;
static void static_static(){
System.out.println(static_variable);
}
static void static_instance(){
// 클래스 메소드에서는 인스턴스 변수에 접근 할 수 없다.
//System.out.println(instance_variable);
}
void instance_static(){
// 인스턴스 메소드에서는 클래스 변수에 접근 할 수 있다.
System.out.println(static_variable);
}
void instance_instance(){
System.out.println(instance_variable);
}
}
public class ClassMemberDemo {
public static void main(String[] args) {
C1 c = new C1();
// 인스턴스를 이용해서 정적 메소드에 접근 -> 성공
// 인스턴스 메소드가 정적 변수에 접근 -> 성공
c.static_static();
// 인스턴스를 이용해서 정적 메소드에 접근 -> 성공
// 정적 메소드가 인스턴스 변수에 접근 -> 실패
c.static_instance();
// 인스턴스를 이용해서 인스턴스 메소드에 접근 -> 성공
// 인스턴스 메소드가 클래스 변수에 접근 -> 성공
c.instance_static();
// 인스턴스를 이용해서 인스턴스 메소드에 접근 -> 성공
// 인스턴스 메소드가 인스턴스 변수에 접근 -> 성공
c.instance_instance();
// 클래스를 이용해서 클래스 메소드에 접근 -> 성공
// 클래스 메소드가 클래스 변수에 접근 -> 성공
C1.static_static();
// 클래스를 이용해서 클래스 메소드에 접근 -> 성공
// 클래스 메소드가 인스턴스 변수에 접근 -> 실패
C1.static_instance();
// 클래스를 이용해서 인스턴스 메소드에 접근 -> 실패
//C1.instance_static();
// 클래스를 이용해서 인스턴스 메소드에 접근 -> 실패
//C1.instance_instance();
}
}