클래스와 클래스 내부의 멤버변수, 메소드에 대해 알면 이제 만들어서 사용해볼 차례다.
실제 사용은 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 |