class는 객체지향언어에서 핵심적으로 사용하는 기능 중 하나라고 할 수 있다.

 

class는 무엇인가 ?

class는 하나의 "물건" 이라고 할 수 있으며 java에서 모든 코드는 class안에서 존재해야한다.

 

class Calculator {
    int left, right;
    public void setOprands(int left, int right) {
        this.left = left;
        this.right = right;

        // this.left -> "Calculator 안에서" 선언된 left
        // left -> 매개변수
    }
    public void sum(){
        System.out.println(this.left + this.right);
    }
    public void avg(){
        System.out.println( (this.left + this.right) / 2);
    }
}

 

그럼 class와 method의 차이점은 무엇일까?

 

간단하게 method는 class의 기능이라고 생각하면 간단하다.

class -> 계산기

method -> 더하기, 빼기, 곱하기 등등...

 

그럼 위 class와 method 는 어떻게 사용할까?

아래의 코드 예시를 통해 인스턴스 개념도 함께 알아 볼 수 있다.

public class _04_ {
    public static void main(String[] args) {
        Calculator c1 = new Calculator();
        
        // new Calculator() : Calculator 객체를 새로 만들어 c1에 담음, ( c1은 타입은 new 객체와 동일해야합니다. - 해당 객체만 품을 수 있음 )
        // 인스턴스 : c1에 담겨있는 실제 객체의 내용, 구체적인 객체
        
        c1.setOprands(10, 20); // c1안에는 Calculator 객체가 들어있고, setOprands 메소드에 10, 20 매개변수 적용
        c1.sum(); // 30
        c1.avg(); // 15

        Calculator c2 = new Calculator(); // new 연산자를 통해 새로운 인스턴스 (c1, c2 ... ) 를 담아 언제든지 sum, avg 메서드를 호출해서 원하는 작업이 가능합니다.
        c2.setOprands(20, 40);
        c2.sum();
        c2.avg();
    }
}

 

클래스 : Calculator();

인스턴스 : c1, c2

 

그럼 왜 class와 instance는 왜 구분하고 어떻게 선언할까?

 

class 안에 매우 많은 method가 있다고 가정해보자.

이때 전역적으로 공통적으로 사용되는 변수와 해당 기능에서만 사용하는 변수를 구분하기 위해 사용할 수 있다.

( scope 개념이 들어가는데 해당 내용은 scope 게시글에서 자세히 알아보자 )

 

그래서 아래와 같이 정리할 수 있다.


클래스 변수 : 클래스가 가지고 있는 변수를 모든 인스턴스에서 받아서 사용 가능 -> 인스턴스 메소드에 접근 불가능
인스턴스 변수 : 인스턴스마다 다른 값을 가지는 변수 -> 클래스 메소드에 접근 가능

 

아래 예시 코드를 천천히 보면 이해할 수 있을 것이다.

package lifeCoding_02_member;

// 인스턴스 변수 -> Non-Static Field
// 클래스 변수 -> Static Field
// 클래스 메소드에서는 인스턴스 변수에 접근 할 수 없다.
// 인스턴스 메소드에서는 클래스 변수에 접근 할 수 있다.

class C1{
    static int static_variable = 1; // 클래스 변수 ( static 변수 )
    int instance_variable = 2; // 인스턴스 변수 ( static 없음 )
    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 _04_ {
    public static void main(String[] args) {
        C1 c = new C1();
        // 인스턴스를 이용해서 정적 메소드에 접근 -> 성공
        // 인스턴스 메소드가 정적 변수에 접근 -> 성공
        c.static_static(); // 1

        // 인스턴스를 이용해서 정적 메소드에 접근 -> 성공
        // 정적 메소드가 인스턴스 변수에 접근 -> 실패
        c.static_instance(); // 에러 발생, static 메소드에서 instance 변수에 접근할 수 없다.

        // 인스턴스를 이용해서 인스턴스 메소드에 접근 -> 성공
        // 인스턴스 메소드가 클래스 변수에 접근 -> 성공
        c.instance_static(); // 1

        // 인스턴스를 이용해서 인스턴스 메소드에 접근 -> 성공
        // 인스턴스 메소드가 인스턴스 변수에 접근 -> 성공
        c.instance_instance(); // 2

        // 클래스를 이용해서 클래스 메소드에 접근 -> 성공
        // 클래스 메소드가 클래스 변수에 접근 -> 성공
        C1.static_static(); // 1

        // 클래스를 이용해서 클래스 메소드에 접근 -> 성공
        // 클래스 메소드가 인스턴스 변수에 접근 -> 실패
        C1.static_instance(); // 에러 발생

        // 클래스를 이용해서 인스턴스 메소드에 접근 -> 실패
        // C1.instance_static(); // 에러 발생

        // 클래스를 이용해서 인스턴스 메소드에 접근 -> 실패
        // C1.instance_instance(); // 에러 발생
    }

}

 

 

 

 

'Java' 카테고리의 다른 글

Java - 상속 ( Inheritance )  (0) 2023.05.04
Java - scope  (0) 2023.05.04
Java - Method 사용하기, OverLoading(오버로딩)  (0) 2023.05.04
Java - 배열  (0) 2023.05.04
Java - 반복문  (0) 2023.05.04

+ Recent posts