public class Student {
int studnetID;
String studentName;
int grage;
String address;
public String getStudentName(){
return studentName;
}
public void setStudentName(String name) {
studentName = name;
}
public static void main(String[ ] args) {
Student studnetAhn = new Student(); // Student 클래스 생성
StudentAhn.studentName = "안연수";
System.out.println(studentAhn.studentName);
System.out.println(studentAhn.getStudentName());
}
}
Student 클래스는 멤버 변수와 메서드로 구성되어 있다. 멤버 변수는 클래스의 속성을 나타내고, 메서드는 멤버 변수를 이용하여 클래스의 기능을 구현한다.
main() 함수는 자바 가상 머신이 프로그램을 시작하기 위해 호출하는 함수이다. 클래스 내부에 만들지만, 클래스의 메서드는 아니다.
클래스 내부에 main() 함수를 만들어 사용할 수도 있고, 외부에 테스트용 클래스를 만들어 사용할 수도 있다.
위 코드는 클래스 내부에 main() 함수를 만든 것이다.
위 코드와 같이 클래스 내부에 main() 함수를 만들면 이 클래스가 프로그램의 시작 클래스가 된다.
public class Student {
int studnetID;
String studentName;
int grage;
String address;
public String getStudentName(){
return studentName;
}
public void setStudentName(String name) {
studentName = name;
}
}
public class StudentTest {
public static void main(String[ ] args) {
Student Ahn = new Student();
studentAhn.studentName = "안연수";
System.out.println(studentAhn.studentName);
System.out.println(studentAhn.getStudentName());
}
}
두 클래스가 같은 패키지에 있으면 이렇게 다른 클래스를 가져와서 사용이 가능하다.
만약 패키지가 다르다면, import문을 사용해서 함께 사용하기를 원하는 클래스를 불러와야한다.
다른 말로 클래스 이름이 같아도 패키지가 다르다면 다른 클래스라는 것이다.
클래스를 사용하려면 먼저 클래스를 생성해야 한다. 클래스를 생성할 때는 new 예약어를 사용하고 이어서 생성자를 써준다. 클래스 자료형 변수를 선언하고 new 예약어로 생성자를 호출하여 대입하면 새로운 클래스가 생성된다.
이렇게 실제로 사용할 수 있도록 생성된 클래스를 '인스턴스'라고 하며,
인스턴스를 가리키는 클래스형 변수를 '참조 변수'라고 한다.
위 코드 중
Student studentAhn = new Student();를 보면
Student 클래스 자료형으로 studentAhn 변수를 선언하고 new Student();로 Student 클래스를 생성하여 studentAhn에 대입한다는 뜻이다. StudentAhn을 참조 변수라고 하고, 이 변수가 생성된 인스턴스를 가리킨다.
객체란 '의사나 행위가 미치는 대상'이며 이를 코드로 구현한 것이 클래스이다.
그리고 클래스가 메모리 공간에 생성된 상태를 인스턴스라고 했다. 위 그림은 클래스 인스턴스를 나타낸 것이다.
클래스의 생성자를 호출하면 인스턴스가 만들어지고, 하나의 클래스로부터 여러개의 각각 다른 인스턴스를 생성할 수도 있는 것이다. 예를 들어 학교에서 학생이란 추상어는 뜻이 하나지만, 그 학교에 다니는 학생 개개인은 여러 명인 것과 같다.
즉, 클래스라는 틀에서 인스턴스를 여러개 만들어 프로그램을 구현하는 것이다.
public class StudentTest {
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)가 두 개 생성된 것이다. // student1, student2는 참조변수이다.
인스턴스가 생성되는 과정을 조금 더 자세히 살펴보자. new Student()를 선언하면 Student 하나가 생성되고 각 Student는 studentID, studentName 등의 멤버 변수를 가지고 있다. 그런데 이들 멤버 변수를 저장할 공간이 있어야 한다. 이 때 사용하는 메모리가 힙 메모리(heap memory)다. 클래스 생성자를 하나 호출하면 인스턴스가 힙 메모리에 생성되는 것이다.
Student studentAhn = new Student();
위와 같이 생성된 클래스를 studentAhn 변수에 대입하면, 인스턴스가 저장된 메모리를 studentAhn 변수가 가리킨다.
그림의 studentAhn 변수는 지역 변수이고, 스택 메모리에 생성된다.
그리고 인스턴스는 힙 메모리에 생성된다.
지역 변수 studentAhn에 생성된 인스턴스를 대입하는 것은 studentAhn에 인스턴스가 생성된 힙 메모리의 주소를 대입한다는 것과 같은 의미를 가진다. 힙 메모리에 생성된 인스턴스의 메모리 주소가 참조 변수(studentAhn)에 저장되는 것이다.
Studnet student1 = new Student();
Student student2 = new Student();
위 코드는 두 개의 인스턴스를 생성한 것이다. 생성된 두 인스턴스는 당연히 각각 다른 메모리 공간을 차지한다.
따라서 student1과 student2는 서로 다른 인스턴스를 가리킬 것이고, 다른 값(주소값)을 가질 것이다.
student1.studentName과 student2.studentName 또한 서로 다른 값을 가질 것이다.
용어가 많이 나왔기 때문에 한번 정리하자면,
객체 : 객체 지향 프로그램의 대상, 생성된 인스턴스
클래스 : 객체를 프로그래밍하기 위해 코드로 만든 상태
인스턴스 : 클래스가 메모리에 생성된 상태
참조 변수 : 메모리에 생성된 인스턴스를 가리키는 변수
참조 값 : 생성된 인스턴스의 메모리 주소 값
멤버 변수 : 클래스의 속성, 특성
메서드 : 멤버 변수를 이용하여 클래스의 기능을 구현
참조 : Do it ! 자바 프로그래밍 기초
'자바 기초' 카테고리의 다른 글
자바 static 변수, 클래스 변수- Do it! 자바프로그래밍기초 (0) | 2022.07.19 |
---|---|
자바 객체 간 협력 - Do it! 자바프로그래밍기초 (0) | 2022.07.19 |
자바 접근제어자, public, private - Do it ! 자바프로그래밍기초 (0) | 2022.07.19 |
자바 생성자, 생성자 오버로딩, 참조 자료형 - Do it ! 자바프로그래밍기초 (0) | 2022.07.19 |
자바 class, 함수, method, - Do it 자바프로그래밍기초 (0) | 2022.07.19 |