728x90
클래스 사용과 main( ) 함수
- 우리가 만든 클래스를 다시 한 번 살펴보겠습니다.
class Student {
int studentID;
String studentName;
int grade;
String address;
public String getStudentName(String name) {
return studentName;
}
public void setStudentName(String name) {
studentName = name;
}
}
- Student 클래스(Student 객체)는 속성과 기능으로 구성되어 있습니다.
- 멤버 변수는 클래스 속성을 나타내고, 메서드는 멤버 변수를 이용하여 클래스 기능을 구현합니다.
- 이렇게 만든 클래스를 직접 사용해서 결과 값을 출력해 봅시다.
프로그램을 시작하는 main( ) 함수
- 클래스를 사용하여 프로그램을 실행하려면 먼저 main( ) 함수를 알아야 합니다.
- main( ) 함수는 자바 가상 머신(JVM)이 프로그램을 시작하기 위해 호출하는 함수입니다.
- 클래스 내부에 만들지만, 클래스의 메서드는 아닙니다.
main( ) 함수를 사용하는 두 가지 방법
Student 자바 파일 안에 main( ) 함수 포함하기
public class Student {
int studentID;
String studentName;
int grade;
String address;
public String getStudentName(String studentname) {
return studentName;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Student studentAhn = new Student();
studentAhn.studentName = "안연수";
System.out.println(studentAhn.studentName);
}
}
- < Student studentAhn = new Student(); > 부분은 새로운 Student 클래스의 인스턴스를 생성하는 코드입니다.
- < studentAhn.studentName = "안연수"; > 부분은 생성한 Student 클래스의 인스턴스의 멤버 변수인 studentName 에 "안연수"라는 값을 초기화시켜주는 코드입니다.
- 클래스를 생성하는 new 예약어는 곧 배울 겁니다.
- 그런데 이런 식으로 클래스 테스트를 수행하면 거의 모든 클래스가 main( ) 함수를 포함해야 합니다. 하지만, 프로젝트를 수행하거나 소프트웨어를 개발할 때 모든 클래스에 main( ) 함수가 있는 것은 아닙니다.
Stdent 자바 파일 밖에서 main( ) 함수를 포함한 실행 클래스 따로 만들기
- Student 클래스를 실행하기 위해 같은 패키지에 StudentTest.java 파일을 만들어 봅시다.
public class StudentText {
public static void main(String[] args) {
Student studentAhn = new Student();
studentAhn.studentName = "안연수";
System.out.println(studentAhn.studentName);
}
}
- StudentTest 클래스 내부에서 Student 클래스의 인스턴스를 만들어서 실행시킬 수 있습니다. 이렇게 하면 Student 클래스 내부에 main 함수를 만들지 않고 Student 클래스를 테스트해 볼 수 있습니다.
- 현재 두 클래스가 같은 패키지에 있기 때문에 패키지 이름이 같습니다.
- 이런 경우는 위와 같이 바로 다른 자바 파일에 있는 클래스를 사용할 수 있습니다.
- 그런데 만약 패키지가 다르다면 import 문을 사용해서 함께 사용하기를 원하는 클래스를 불러와야 합니다.
클래스 이름이 같아도 패키지가 다르면 다른 클래스입니다. (클래스 전체 이름)
- Student 라는 같은 이름의 두 클래스를 하나의 패키지에 구현하면 같은 이름의 클래스가 존재하기 때문에 오류가 발생합니다.
- 왜냐하면 aaa 패키지의 하위 Student 클래스의 진짜 이름은 aaa.Student 이기 때문입니다. 그래서 다른 자바 파일이라 할지라도 Student 클래스를 만들면 해당 클래스의 진짜 이름도 aaa.Student 가 되기 때문에 같은 이름을 가진 자바 클래스가 2개가 됩니다.
- 이를 클래스 전체 이름 (class full name) 이라고 합니다.
- 따라서 패키지가 다르면 클래스 이름이 같아도 클래스 전체 이름은 다르기 때문에 다른 클래스가 됩니다.
new 예약어로 클래스 생성하기
- 우선 클래스를 생성하는 코드의 형태는 아래와 같습니다.
클래스형 변수이름 = new 생성자;

- 자바에서 클래스를 생성할 때는 new 예약어를 사용하고 이어서 생성자를 써 줍니다.
- 클래스형(클래스 자료형) 변수를 선언하고 new 예약어로 생성자를 호출한 것을 대입하면 새로운 클래스가 생성됩니다.
- 클래스가 생성된다는 것은 클래스를 실제 사용할 수 있도록 메모리 공간(힙 메모리)을 할당 받는다는 뜻입니다.
- 이렇게 실제로 사용할 수 있도록 생성된 클래스를 '인스턴스'라고 합니다.
- 그리고 인스턴스를 가리키는 클래스형 변수를 '참조 변수'라고 합니다.
Student studentAhn = new Student( );
클래스형+변수이름 = 예약어+생성자
- 위 코드는 Student 클래스 자료형으로 studentAhn 변수를 선언하고 new Student( ); 로 Student 클래스를 생성하여 studentAhn 에 대입한다는 뜻입니다.
- 이때 studentAhn 을 참조변수 라고 하고, 이 변수가 생성된 인스턴스를 가리킵니다.
인스턴스와 참조 변수
객체, 클래스, 인스턴스
- 객체란 '의사나 행위가 미치는 대상'입니다.
- 객체를 코드로 구현한 것이 클래스입니다.
- 클래스가 메모리 공간에 생성된 상태가 인스턴스입니다.
'의지나 행위'가 미치는 대상 [객체] 객체를 구현한 [클래스] 메모리 공간에서 생성된 인스턴스
학생 >> Student 클래스 >> Student1 인스턴스
- 인스턴스는 여러 개 생성할 수도 있습니다.
- 클래스는 하나지만, 이 클래스로부터 여러 개의 인스턴스를 생성할 수 있습니다.
- 예를 들어 학교에서 학생이란 추상어는 뜻이 하나이지만, 그 학교에 다니는 학생 개개인은 여러 명인 것과 같습니다.
- 각 학생은 이름이 다르고, 학번이 다르고, 학년이 다릅니다.
- 즉 클래스라는 틀에서 인스턴스를 여러 개 만들어 프로그램을 구현하는 것입니다.
인스턴스 여러 개 생성하기
- 인스턴스는 하나 이상 만들 수 있습니다.
public class StudentTest1 {
public static void main(String[] args) {
//클래스형 + 변수명 = new예약어 + 생성자
Student student1 = new Student();
student1.studentName = "안연수";
System.out.println(student1.getStudentName());
Student student2 = new Student();
student2.studentName = "안승연";
System.out.println(student2.getStudentName());
}
}
- 서로 다른 변수에 생성자를 각각 사용하여 클래스를 두 개 생성하였습니다.
- 즉, Student 클래스의 서로 다른 인스턴스 2개를 생성했습니다.
- 이렇게 만든 인스턴스를 어떻게 사용하는지 알아보겠습니다.
참조 변수 사용하기
- 참조 변수를 사용하면 인스턴스의 멤버 변수와 메서드를 참조하여 사용할 수 있습니다.
- 참조 변수를 사용할 때 도트(.) 연산자를 사용합니다.
student1.studentName = "안연수";
System.out.println(student1.getStudentName());
- 위에서는 student1 라는 참조 변수를 사용하여 Student 클래스의 인스턴스가 가지고 있는 멤버 변수와 메서드를 사용하였습니다.
인스턴스와 힙 메모리
인스턴스가 생성되는 과정 자세히 살펴보면서 스택 메모리와 힙 메모리의 관계 보기
- new Student( ) 를 선언하면 Student 가 하나 생성됩니다.
- Student 는 studentID, studentName 등의 멤버 변수를 가지고 있습니다.
- 그런데 이들 변수를 저장할 공간이 있어야 합니다.
- 이때 사용하는 메모리가 힙 메모리(heap memory)입니다.
- 클래스 생성자를 하나 호출하면 인스턴스가 힙 메모리에 생성되는 것입니다.
Student studentAhn = new Student();
- 위와 같이 생성된 클래스를 studentAhn 변수에 대입하면, 인스턴스가 저장된 메모리를 studentAhn 변수가 가리킵니다. 다음과 같이 그림으로 표현할 수 있습니다.
[스택 메모리] >> [힙 메모리]
stdentAhn >> Student 클래스 생성

- studentAhn 변수는 지역 변수입니다.
- 지역 변수는 스택 메모리에 생성됩니다.
- 인스턴스는 힙 메모리에 생성됩니다.
- 지역 변수 studentAhn 에 생성된 인스턴스를 대입하는 것은 studentAhn(지역변수, 참조변수) 에 인스턴스가 생성된 힙 메모리의 주소를 대입한다는 것과 같은 의미입니다.
- 그럼 다음과 같이 두 개의 인스턴스를 생성한 경우를 생각해 보겠습니다.
Student student1 = new Student();
Student student2 = new Student();
- 생성된 두 인스턴스는 당연히 각각 다른 메모리 공간(힙 메모리)을 차지합니다.
- 따라서 student1.studentName 과 student2.studentName 은 서로 다른 힙 메모리에 서로 다른 값을 가집니다.
[스택 메모리] [힙 메모리]
student1(참조변수, 지역변수) >> Student 클래스 생성
student2(참조변수, 지역변수) >> Student 클래스 생성
- 클래스가 생성될 때마다 인스턴스는 다른 메모리 공간(힙 메모리)을 차지합니다.
- 다른 말로 하면, 멤버 변수 & 멤버 메서드를 저장하는 공간이 매번 따로 생긴다는 의미입니다.
- 이런 이유로 클래스에 선언한 멤버 변수를 '인스턴스 변수'라고도 부릅니다.
힙 메모리란? (heap memory)
- 힙 (heap)은 프로그램에서 사용하는 동적 메모리(dynamic memory) 공간을 말합니다.
- 일반적으로 프로그램은 스택, 힙, 데이터 이렇게 3 영역을 사용합니다.
- 객체가 생성될 때 사용하는 공간이 힙(heap)입니다.
- 힙(동적 메모리)은 동적으로 할당되며 사용이 끝나면 메모리를 해제해 주어야 합니다.
- C나 C++ 언어에서는 프로그래머가 직접 메모리를 해제해야 하지만, 자바에서는 가비지 컬렉터(garbage collector)가 자동으로 메모리를 해제해 줍니다.
참조 변수와 참조 값(해시코드 값)
- 참조 변수는 힙 메모리에 생성된 인스턴스가 위치하고 있는 주소 값을 가지고 있습니다.
- 실제로 참조 변수에 어떤 값이 들어 있는지 출력해 보겠습니다.
package exercise;
public class StudentTest2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student student1 = new Student();
Student student2 = new Student();
System.out.println(student1);
System.out.println(student2);
}
}

- 힙 메모리에 생성된 인스턴스의 메모리 주소는 참조 변수에 저장됩니다.
- 출력 된 내용을 살펴보면 인스턴스가 위치하고 있는 힙 메모리 주솟 값은 다음과 같은 형태입니다.
클래스이름@주소값
(인스턴스의 힙 메모리 주소 값)
- 참조 변수가 가지고 있는 힙 메모리에 생성된 인스턴스의 메모리 주소 값을 해시 코드(hash code) 값이라고 합니다.
- 해시 코드(hash code) 값은 자바 가상 머신(JVM)에서 객체가 생성되었을 때 생성된 객체에 할당하는 가상 주소 값입니다.
- student1 변수를 사용하여 student1 인스턴스를 참조할 수 있습니다.
- 이때, student1 을 참조 변수, student1 인스턴스의 해시 코드 값(주소 값)을 참조 값 이라고 합니다.
객체 지향 프로그램 관점 용어 정리
- 객체 : 객체 지향 프로그램의 대상, 생성된 인스턴스
- 클래스 : 객체를 프로그래밍하기 위해 코드로 만든 상태
- 인스턴스 : 클래스가 메모리에 생성된 상태
- 멤버 변수 : 클래스의 속성, 특성
- 메서드 : 멤버 변수를 이용하여 클래스의 기능을 구현
- 참조 변수 : 메모리에 생성된 인스턴스를 가리키는 변수
- 참조 값 : 생성된 인스턴스의 메모리 주소 값
'[그린컴퓨터] Server > JAVA(객체 지향 프로그래밍)' 카테고리의 다른 글
| 참조 자료형 {참조 자료형이란, 헷갈렸던 점(전반부), 헷갈렸던 점(후반부), 추가 이해 자료} (0) | 2023.05.17 |
|---|---|
| 생성자 {생성자란, 생성자 만들기, 생성자 오버로드} (0) | 2023.05.17 |
| 메서드 {함수란?, 함수의 입력과 반환, 함수 정의하기, 함수 호출하고 값 반환, 함수 호출과 스택메모리, 함수의 장점, 클래스 기능을 구현하는 메서드} (0) | 2023.05.16 |
| 클래스 살펴보기 {클래스 속성을 구현하는 멤버 변수, 클래스 기능을 구현하는 메서드, 패키지란?} (0) | 2023.05.15 |
| 객체 지향 프로그래밍과 클래스 {객체란, 생활 속 예시, 클래스란?} (0) | 2023.05.15 |