본문 바로가기

Programming/자바

생활코딩 자바 - 클래스 멤버, 인스턴스 멤버

멤버

: 구성원

객체 - 변수, 메소드

 

  •  

class Calculator  {
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();
System.out.println(c1.PI);
Calculator c2 = new Calculator();
System.out.println(c2.PI);
System.out.println(Calculator.PI);
}
}

 

=>

setoprands의 입력값들을 인스턴스 변수로 지정 => c1, c2 인스턴스의 left, right 변수 값 각각 다름

but 클래스의 멤버 변수 => 모든 인스턴스에서 변수 값 동일

 

 

클래스 변수
  •  

 

class Calculator  {
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();
System.out.println(c1.PI); //3.14
Calculator c2 = new Calculator();
System.out.println(c2.PI); //3.14
System.out.println(Calculator.PI); //3.14
}
}

 

PI 는 클래스 변수 -> 모든 인스턴스에서 동일 값

 

  •  

class Calculatorr{
static double PI = 3.14 ;
static int base = 0;    => 클래스의 변수
int left, right;  => static 없으므로 인스턴스 변수 (각 인스턴스마다 값이 다름)


public void setOprands(int left, int right) {
this.left = left;
this.right = right;
}
public void sum() {
System.out.println(this.left + this.right + base);
}
public void avg() {
System.out.println((this.left + this.right + base)/2);
}
}


public class CalculatorDemo2 {

public static void main(String[] args) {
Calculatorr c1 = new Calculatorr();
c1.setOprands(10, 20);
c1.sum();
Calculatorr c2 = new Calculatorr();
c2.setOprands(20, 40);
c2.sum();

Calculatorr.base = 10;

c1.sum();
c2.sum();

 

  • 클래스변수의 용도

인스턴스에 따라 변하지 않는 값 필요한 경우 (이때 final 사용해 상수 선언하는 것이 바람직)

인스턴스를 생성할 필요 없는 값을 클래스에 저장하고 싶은 경우 (ex. calculator.pi)

값의 변경사항을 모든 인스턴스가 공유해야 하는 경우

 

 

클래스 메소드
  •  

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(20, 40);

Calculator3.sum(10, 20);
Calculator3.avg(20, 40);             => 인스턴스 등장 X
}

 

타입별 비교

 

1. 인스턴스 메소드는 클래스 멤버에 접근할 수 있다.

2. 클래스 메소드는 인스턴스 멤버에 접근할 수 없다.

 

인스턴스 변수 = 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();
c.static_static();
c.static_instance();
//c.instance_static();    => 아직 인스턴스도 생성되지 않았으므로 인스턴스 접속 X
//c.instance_instance();


}