클래스와 클래스 내부의 멤버변수, 메소드에 대해 알면 이제 만들어서 사용해볼 차례다.

실제 사용은 main()함수 내부에서 하는데 main함수는 보통 가장 먼저 시작 될 클래스에 포함시킨다.

지금은 사용할 클래스와 같은 패키지 내부에 Test.java 클래스를 만들어서 main()함수를 포함시킨다.

 

1. 클래스 생성하기


클래스를 생성하는 방법은 다음과 같다.

(클래스형) (변수명) = new 생성자;

클래스를 생성하기 전에 다음과 같은 클래스를 정의해보자.

package classpart;

public class Person {
    String name;
    int age;
    String address;
    char gender;

    public void setName(String str) {
        name = str;
    }

    public String getName() {
        return name;
    }
}

위 클래스를 사용해서 하나 생성을 해보겠다.

package classpart;

public class Test {
    public static void main(String[] args) {
        Person per1 = new Person(); // Person 클래스 객체를 하나 생성
    }
}

이렇게 클래스가 하나 생성된 것이다.

클래스를 생성한다는 것은 사용할 수 있도록 힙 메모리에 저장하는 행위이며 생성자를 호출함으로써 생성할 수 있다. 이렇게 생성된 클래스를 인스턴스라고 한다. 인스턴스를 가리키는 클래스형 변수를 참조변수라고 한다.

즉, 위의 클래스 객체 생성 코드가 의미하는 바는 Person() 생성자앞에 new를 붙여 Person 클래스의 인스턴스를 하나 만들고 per1변수가 그 인스턴스를 참조하도록 한 것이다. 일반 변수 선언과 크게 다르지 않다. 물론 클래스 타입의 인스턴스는 몇 개든 상관없이 찍어낼 수 있다.

 

 

2. 인스턴스 사용


클래스형 변수인 참조변수는 생성자로 만들어진 인스턴스에 접근할 수 있는 수단이다. 어렵게 생각하지 않아도 int num = 10; 이라고 선언하면 num을 사용해 10에 접근할 수 있는것과 완전히 같은 것이다.

package classpart;

public class Test {
    public static void main(String[] args) {
        Person per1 = new Person(); // Person 클래스의 인스턴스 생성
        Person per2 = new Person(); // Person 클래스의 인스턴스 생성
    }
}

위 처럼 2개의 인스턴스를 생성하면 각각의 인스턴스에 참조변수 per1, per2를 사용해서 접근할 수 있는 것이다. 참조변수를 사용하면 인스턴스의 멤버변수와 메소드를 사용할 수 있다.

package classpart;

public class Test {
    public static void main(String[] args) {
        Person per1 = new Person(); // Person 클래스의 인스턴스 생성
        Person per2 = new Person(); // Person 클래스의 인스턴스 생성

        per1.name = "John"; //참조변수.멤버변수 형태로 name에 접근하여 "John" 저장
        System.out.println(per1.name); // 참조변수.멤버변수 형태로 name에 접근하여 출력

        per1.setName("Kelly"); //참조변수.메소드 형태로 name에 접근하여 "Kelly" 저장
        System.out.println(per1.getName()); // 참조변수.메소드 형태로 name에 접근하여 출력
    }
}

위 코드에서 확인했지만 인스턴스를 이용한다는 것은 멤버변수와 메소드를 활용하는 것이고 방법은 아래와 같이 정리가 된다.

참조변수.멤버변수

참조변수.메소

 

 

3. 참조변수와 인스턴스


참고로 참조변수는 지역변수이므로 스택 메모리에 생성되고 인스턴스는 객체이므로 힙 메모리에 생성된다.

힙 메모리는 동적 메모리로 C나 C++에서 프로그래머가 수동으로 관리해야하는 것과는 다르게 Java에서는 가비지 컬렉터가 자동으로 관리해준다.

package classpart;

public class Test {
    public static void main(String[] args) {
        Person per1 = new Person(); // Person 클래스의 인스턴스 생성
        Person per2 = new Person(); // Person 클래스의 인스턴스 생성

        per1.name = "John"; //참조변수.멤버변수 형태로 name에 접근하여 "John" 저장
        System.out.println(per1.name); // 참조변수.멤버변수 형태로 name에 접근하여 출력

        per1.setName("Kelly"); //참조변수.메소드 형태로 name에 접근하여 "Kelly" 저장
        System.out.println(per1.getName()); // 참조변수.메소드 형태로 name에 접근하여 출력

        System.out.println(per1); //classpart.Person@15db9742
        System.out.println(per2); //classpart.Person@6d06d69c
    }
}

참조변수에 저장된 값은 인스턴스가 저장된 메모리의 주소값이다. 참조변수에 저장된 인스턴스의 메모리 주소값을 참조하여 메모리공간에서 멤버변수와 메소드에 관한 데이터를 쓰고 읽고 할 수 있었던 것이다.

이 주소는 JVM에서 객체가 생성될 때 할당하는 가상 주소값이다.

정리하자면 인스턴스가 저장된 힙 메모리의 주소를 참조값, 그것이 저장된 것이 참조변수이다.

'프로그래밍 언어 > Java' 카테고리의 다른 글

(Java) 18 - 참조 자료형  (0) 2020.05.17
(Java) 17 - 생성자  (0) 2020.05.17
(Java) 15 - 메소드  (0) 2020.05.17
(Java) 14 - 클래스  (0) 2020.05.17
(Java) 13 - 객체 지향 프로그래밍이란  (0) 2020.05.17

+ Recent posts