클래스 - 설계도 , 비유하자면 메소드 정의
인스턴스 - 제품 , 비유하자면 메소드 호출 ex) ABC abc = new ABC();
리팩토링
- 외부에서 보는 프로그램 동작은 바꾸지 않고 프로그램 내부 구조를 개선하는 것
리팩토링의 목적
- 버그를 발견하기 쉽게 만든다
- 기능을 추가하기 쉽게 만든다
- 리뷰하기 쉽게 만든다
인스턴스 변수 (Non-Static Field)
- 인스턴스 마다 다른 값을 가지는 변수
클래스 변수 (Static Field)
- 클래스로 만들어진 인스턴스들은 클래스의 변수의 값을 자연스럽게 가지고 있다.
클래스 변수의 용도
- 인스턴스에 따라서 변하지 않는 값이 필요한 경우
- 인스턴스를 생성할 필요가 없는 값을 클래스에 저장하고 싶은 경우
- 값의 변경 사항을 모든 인스턴스가 공유해야하는 경우
ex 1)
class Abc {
static double PI = 3.14; // 클래스 변수
}
ex 2)
class Calculator2 {
static int base = 0; // 클래스 변수
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 + base);
}
}
public class Main {
public static void main(String[] args) {
Calculator2 c1 = new Calculator2();
c1.setOprands(10, 20);
c1.sum(); // 30
Calculator2 c2 = new Calculator2();
c2.setOprands(10, 30);
c2.sum(); // 40
Calculator2.base = 10;
c1.sum(); // 40
c2.sum(); // 50
}
}
클래스 메소드
- 인스턴스 없이 사용
- 클래스에 직접 접근해서 사용
ex )
class Calculator3 {
public static void sum(int left , int right) {
System.out.println(left + right);
}
}
public class Main {
public static void main(String[] args) {
Calculator3.sum(10,20);
}
}
특징
- 인스턴스 메소드는 클래스 멤버에 접근 할 수 있다.
- 클래스 메소드는 인스턴스 멤버에 접근 할 수 없다.
ex )
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);
}
}
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();
}
}