1. 클래스 사용과 main() 함수
지금까지 우리가 만든 클래스를 다시 한 번 살펴보자.
package classpart;
public class Student {
int studentID;
String studentName;
int grade;
String address; // 멤버 변수
public String getStudentName() {
return studentName;
}
public void setStudentName(String name) {
studentName = name; // 메서드
}
}
위의 Student 클래스는 멤버 변수와 메서드로 구성되어 있다.
멤버 변수는 클래스의 속성을 나타내고, 메서드는 멤버 변수를 이용하여 클래스의 기능을 구현한다.
그런데 지금까지 우린 클래스를 열심히 만들었음에도 이렇다 할 출력 화면을 한 번도 보지 못했다
이제 만든 클래스를 직접 사용하여 결과 값을 출력해보자.
2. main() 함수
1) 프로그램을 시작하는 main 함수
클래스를 사용하여 프로그램을 실행하려면 먼저 main() 함수를 알아야 한다.
main() 함수는 자바 가상 머신(JVM)이 프로그램을 시작하기 위해 호출하는 함수이다.
클래스 내부에 만들지만 클래스의 메서드는 아니다.
main() 함수에서 클래스를 사용하는 방법은 두 가지가 있다.
하나는 우리가 만든 클래스 내부에 main() 함수를 만드는 것이고, 또 하나는 외부에 테스트용 클래스를 만들어 사용하는 것이다.
먼저 지금까지 만든 Student 클래스에 main() 함수를 넣어서 임의로 코드를 만들어 보았다.
package classpart;
public class Student {
int studentID;
String studentName;
int grade;
String address;
public String getStudentName() {
return studentName;
}
public static void main(String[] args) {
Student studentAhn = new Student(); //Student 클래스 생성
studentAhn.studentName = "안연수";
System.out.println(studentAhn.studentName);
System.out.println(studentAhn.getStudentName());
}
}
위와 같이 클래스 내부에 main() 함수를 만들면 이 클래스가 프로그램의 시작 클래스가 된다.
클래스가 제대로 수행되는지 알아보기 위해 이렇게 클래스 내부에 main() 함수를 만들고 직접 실행할 수 있다.
main() 함수 내부에서 - Student studentAhn = new Student(); 행은 새로운 Student 클래스를 생성하는 코드이고 그 아래 행은 클래스의 멤버 변수에 값을 대입하는 코드이다.
클래스를 생성하는 new 예약어에 대한 자세한 내용은 곧 살펴보려 한다.
그런데 이런 식으로 클래스 테스트를 수행하면 거의 모든 클래스가 main() 함수를 포함해야한다.
하지만 프로젝트를 수행하거나 소프트웨어를 개발할 때 모든 클래스에 main() 함수가 있는 것은 아니다.
다음은 클래스 내부에 main() 함수를 만들지 않고 테스트용 클래스를 따로 만들어 실행하는 방식을 사용해보려 한다.
2) main() 함수를 포함한 실행 클래스 따로 만들기
Student 클래스를 실행하기 위해 같은 패키지에 StudentTest.java 파일을 만들고 Student 클래스를 생성하는 코드를 아래와 같이 구현했다.
package classpart;
public class StudentTest {
public static void main(String[] args) {
Student studentAhn = new Student();
studentAhn.studentName = "안승연";
System.out.println(studentAhn.studentName);
System.out.println(studentAhn.getStudentName());
}
}
우선 Student 클래스와 StudentTest 클래스가 같은 패키지에 있기 때문에 패키지 이름이 동일하다.
이런 경우는 위와 같이 코드를 작성해도 문제가 되지는 않는다.
그런데 만약 패키지가 다르다면 import문을 사용해서 함께 사용하기를 원하는 클래스를 불러와야 한다.
아직 import문을 배우지 않았으므로 같은 패키지에 있는 두 클래스로 코드를 작성하려 한다.
3) new 예약어로 클래스 생성하기
클래스를 만들고 실행하는 과정을 살펴보려 한다.
클래스를 사용하려면 먼저 클래스를 생성해야 한다.
클래스를 생성하는 코드는 다음과 같다.
클래스형 변수이름 = new 생성자
자바에서 클래스를 생성할 때는 new 예약어를 사용하고 이어서 생성자를 써준다.
클래스 자료형 변수를 선언하고 new 예약어로 생성자를 호출하여 대입하면 새로운 클래스가 생성된다.
클래스가 생성된다는 것은 클래스를 실제 사용할 수 있도록 메모리 공간(힙 메모리)을 할당 받는다는 뜻이다.
이렇게 실제로 사용할 수 있도록 생성된 클래스를 '인스턴스'라고 한다.
그리고 인스턴스를 가리키는 클래스형 변수를 '참조 변수'라고 한다.
앞에서 따라 입력하기만 하고 넘어갔던 코드를 다시 살펴보자.
Student studentAhn = new Student( ) ;
위 코드는 Student 클래스 자료형으로 studentAhn 변수를 선언하고 new Student( ); 로 Student 클래스를 생성하여 studentAhn을 참조 변수라고 하고, 이 변수가 생성된 인스턴스를 가리킨다.
3. 인스턴스와 참조 변수
1) 객체, 클래스, 인스턴스
객체란 '의사나 행위가 미치는 대상'이며 이를 코드로 구현한 것이 클래스이다.
그리고 클래스가 메모리 공간에 생성된 상태를 인스턴스라고 한다.
또한 생성된 클래스의 인스턴스를 객체라고도 한다.
클래스의 생성자를 호출하면 인스턴스가 만들어진다.
그리고 여러 개의 인스턴스를 생성할 수 있다.
클래스는 하나이지만 이 클래스로부터 여러 개의 각각 다른 인스턴스를 생성할 수 있는 것이다.
다음과 같이 학생을 한 명 더 만들어보자.
package classpart;
public class StudentTest1 {
public static void main(String[] args) {
Student student1 = new Student();
student1.studentName = "안연수";
System.out.println(student1.getStudentName());
Student student2 = new Student();
student2.studentName = "안승연";
System.out.println(student2.getStudentName());
}
}
위의 코드와 같이 생성자를 두 번 사용해서 서로 다른 변수 이름으로 두 개의 클래스를 생성했따.
즉 서로 다른 인스턴스(student1, student2)가 두 개 생성된 것이다.
그러면 이렇게 만든 인스턴스를 어디에, 어떻게 참조하여 사용할 수 있는지 알아보도록 하자.
2) 참조 변수 사용하기
참조 변수를 사용하면 인스턴스의 멤버 변수와 메서드를 참조하여 사용할 수 있는데 이때 도트(.) 연산자를 사용한다.
다음은 studentAhn 참조 변수로 studentName 멤버 변수에 이름을 저장하고 getStudentName() 메서드를 사용하는 코드이다.
studentAhn.studentName = "안연수";
System.out.println(studentAhn.getStudentName());
4. 인스턴스와 힙 메모리
이제 인스턴스가 생성되는 과정을 조금 더 자세히 살펴보자.
new Student()를 선언하면 Student 하나가 생성되는데 각 Student는 studentID, studentName 등의 멤버 변수를 가지고 있다.
그런데 이들 변수를 저장할 공간이 있어야 한다. 이때 사용하는 메모리가 힙 메모리(heap memory)이다.
클래스 생성자를 하나 호출하면 인스턴스가 *힙 메모리에 생성된다.
*힙(heap)이란 프로그램에서 사용하는 동적 메모리(dynamic memory) 공간을 말한다. 일반적으로 프로그램은 스택, 힙, 데이터 이렇게 세 영역을 사용하는 데 객체가 생성될 때 사용하는 공간이 힙이다. 힙은 동적으로 할당되며 사용이 끝나면 메모리를 해제해 주어야 하는데 C나 C++ 언어에서는 프로그래머가 직접 메모리를 해제해야하지만 자바에서는 가비지 컬렉터가 자동으로 메모리를 해제해준다.
참조 변수는 힙 메모리에 생성된 인스턴스를 가리킨다.
그러면 참조 변수에 실제로 어떤 내용이 들어 있는지 출력해보자.
package classpart;
public class StudentTest2 {
public static void main(String[] args) {
Student student1 = new Student();
student1.studentName = "안연수";
Student student2 = new Student();
student2.studentName = "안승연";
System.out.println(student1);
System.out.println(student2);
}
}
힙 메모리에 생성된 인스턴스의 메모리 주소는 참조 변수에 저장된다.
출력 내용을 확인해 보면 '클래스이름@주소값'이다.
여기서 나오는 주소 값은 다른 말로 해시 코드(hash code) 값이라고도 한다.
이 값은 자바 가상 머신에서 객체가 생성되었을 때 생성된 객체에 할당하는 가상 주소값이다.
따라서 student1 변수를 사용하여 student1 인스턴스를 참조할 수 있다.
이 때 student1을 참조 변수, 주소 값을 참조 값이라고 한다.
**
#4에 들어서며 객체 지향 개념을 배우다보니 많은 용어가 새롭게 등장했다.
아래 표는 객체 지향 프로그램 관점에서 용어를 정리해보았다.
용어 | 설명 |
객체 | 객체 지향 프로그램의 대상, 생성된 인스턴스 |
클래스 | 객체를 프로그래밍하기 위해 코드로 만든 상태 |
인스턴스 | 클래스가 메모리에 생성된 상태 |
멤버 변수 | 클래스의 속성, 특성 |
메서드 | 멤버 변수를 이용하여 클래스의 기능을 구현 |
참조 변수 | 메모리에 생성된 인스턴스를 가리키는 변수 |
참조 값 | 생성된 인스턴스의 메모리 주소 값 |
'⁂ Java > : 독학으로 공부하기(과거)' 카테고리의 다른 글
[java] #4-4 생성자 (0) | 2022.07.09 |
---|---|
[java] #4-2 메서드와 함수 (0) | 2022.07.04 |
[java] #4-1 객체, 클래스, 패키지 (0) | 2022.07.04 |
[java] #3-2 반복문 : 제어 흐름 이해하기 (0) | 2022.07.03 |
[java] #3-1 조건문 : 제어 흐름 이해하기 (0) | 2022.07.01 |