▶ JAVA/개념정리

[Java] 12.객체지향언어(3)_클래스

휴학생감자 2022. 3. 8. 13:00

1. JVM(Java Virtual Machine)

 

JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고, 메모리는 용도에 따라 여러 영역으로 나누어 관리한다.

 

메서드 영역

     프로그램 실행 시 필요한 클래스에 대한 정보를 저장하는 영역이다. 클래스의 클래스 변수도 이 영역에 함께 생성된다.

 

     인스턴스 및 인스턴스 변수가 생성되는 공간이다. 프로그램 실행 중 생성되는 모든 인스턴스가 힙에 생성된다.

 

호출스택(call stack)

      메서드의 작업에 필요한 메모리 공간을 제공한다. 호출된 메서드를 위한 메모리가 할당되며, 메서드가 작업을 수행하는 동안 지역          변수 및 연산의 중간결과 등을 저장하는데 사용된다. 이후 작업이 끝나면 메모리 공간은 반환되어 비워진다.

      호출 스택의 가장 위에 있는 메서드가 현재 실행 중인 메서드이며, 아래에 있는 메서드가 바로 위 메서드를 호출한 메서드이다.

 

 


2. 기본형 / 참조형 매개변수

 

# 기본형 매개변수

변수의 값을 읽을 수만 있다.

Ex) static void change(int x)

 

# 참조형 매개변수

변수의 값을 읽고 변경할 수 있다.

Ex) static void change(Data d)

 

+) 마찬가지로 반환타입으로 참조형이 가능한데, 이는 메서드가 객체의 주소를 반환하는 것을 의미한다.

 

 


3. 클래스 메서드와 인스턴스 메서드

 

변수와 마찬가지로 클래스 메서드는 static을 붙여서 구분한다.

또한, 클래스 메서드도 클래스 변수처럼 객체를 생성하지 않아도 '클래스이름.메서드이름(매개변수)'의 형태로 사용할 수 있다.

인스턴스 변수와 관련된 작업을 하거나, 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드를 인스턴스 메서드라고 한다.

 

☆ 클래스 메서드는 클래스 생성 시 메모리에 올라가므로 인스턴스 변수를 사용할 수 없다.

☆ 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.

 

 

class Test{
    int a, b;

    //인스턴스 메서드
    int add() {return a+b;}
    int subtract(){return a-b;}
    int multiply(){return a*b;}
    int divide(){return a/b;}

    //클래스 메서드
    static int add(int a, int b) {return a+b;}
    static int subtract(int a, int b) {return a-b;}
    static int multiply(int a, int b) {return a*b;}
    static int divide(int a, int b) {return a/b;}
}

public class exCode {
    public static void main(String[] args) {
        System.out.println(Test.add(2, 5));
        System.out.println(Test.subtract(2, 5));
        System.out.println(Test.multiply(2, 5));
        System.out.println(Test.divide(2, 5));

        Test tt = new Test();
        tt.a = 2;
        tt.b = 5;
        System.out.println(tt.add());
        System.out.println(tt.subtract());
        System.out.println(tt.multiply());
        System.out.println(tt.divide());
    }
}

[실행 결과]

 


4. 클래스 멤버와 인스턴스 멤버

 

클래스 멤버 : 클래스 변수 & 클래스 메서드

인스턴스 멤버 : 인스턴스 변수 & 인스턴스 메서드

 

인스턴스 멤버가 존재하는 시점에 클래스 멤버는 항상 존재하지만, 클래스멤버가 존재하는 시점에 인스턴스 멤버는 존재하지 않을 수 있다. 따라서, 클래스 멤버가 인스턴스 멤버를 참조하려 하거나 호출을 원하는 경우에는 인스턴스를 생성해야 한다.

 

☆ 같은 클래스 내의 메서드끼리는 직접 호출이 가능하나, static메서드만 인스턴스 메서드를 호출할 수 없다.

☆ 인스턴스 메서드는 인스턴스 변수를 사용할 수 있지만, static메서드는 인스턴스 변수를 사용할 수 없다.

 

class Test{
    int iv = 10;
    static int cv = 20;

    int iv2 = cv;
    //static int cv2 = iv; >> 에러 : 클래스변수는 인스턴스변수 사용불가
    static int cv2 = new Test().iv;

    //인스턴스 메서드
    void instanceMethod(){
        System.out.println(cv);
        System.out.println(iv);
    }

    void instanceMethod2(){
        staticMethod();
        staticMethod2();
        instanceMethod();
    }

    //클래스 메서드
    static void staticMethod(){
        System.out.println(cv);
        //System.out.println(iv); >> 에러 : 클래스메서드는 인스턴스변수 사용불가
        Test tt = new Test();
        System.out.println(tt.iv);
    }

    static void staticMethod2(){
        staticMethod();
        //instanceMethod(); >> 에러 : 클래스메서드는 인스턴스메서드 호출불가
        Test t = new Test();
        t.instanceMethod();
    }
}

 

 

 

 

 

'▶ JAVA > 개념정리' 카테고리의 다른 글

[Java] 13. 객체지향언어(4)_상속  (3) 2022.03.11
[Java] 11.객체지향언어(2)_클래스  (0) 2022.03.07
[Java] 10. 객체지향언어(1)_클래스  (0) 2022.02.10
[Java] 9. 배열_예제  (0) 2022.02.07
[Java] 8. 배열  (0) 2022.02.04