멤버
: 구성원
객체 - 변수, 메소드
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();
}
'Programming > 자바' 카테고리의 다른 글
생활코딩 자바 - 생성자 (0) | 2022.04.02 |
---|---|
생활코딩 자바 - 유효범위 (0) | 2022.04.01 |
생활코딩 자바 - 클래스, 인스턴스, 객체 (0) | 2022.03.25 |
생활코딩 자바 - 객체지향 프로그래밍 (0) | 2022.03.25 |
생활코딩 자바 - 입력과 출력(Input &Output, IO) (0) | 2022.03.19 |