JAVA

클래스와 인스턴스

seungmin576 2024. 12. 12. 16:50

main() 함수

자바 가상 머신이 프로그램을 시작하기 위해 호출하는 함수이다.

클래스 내부에 만들지만, 클래스의 메서드는 아니다.

 

  • main() 함수에서 클래스를 사용하는 방법 두가지

1. 우리가 만든 클래스 내부에 main() 함수를 만드는 것

public class Student {
    int studentID;
    String studentName;
    int grade;
    String address;

    public String getStudentName(){
        return studentName;
    }

    public void setStudentName(String name){
        studentName = name;
    }

    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 클래스를 생성하는 코드이고,

다음 코드는 클래스의 멤버 변수에 값을 대입하는 코드이다.

 

 

 

2. 외부에 테스트용 클래스를 만들어 사용하는 것

 

Student 클래스를 실행하기 위해 같은 패키지에 StudentTest.java파일을 만든다.

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());
    }
}

 

인텔리제이라서 따로 패키지를 생성하지 않아도 기본패키지에 둘다 작성되어 연결됨.

만약 이클립스 였다면 따로 패키지를 만들었고 패키지 명도 두 파일 모두 동일했을 것이다.

그런데 만약 패키지가 다르다면 import문을 사용하여 함께 사용하기를 원하는 클래스를 불러와야 한다.

 


new 예약어로 클래스 생성하기

 

 

클래스를 사용하려면 먼저 클래스를 생성해야 한다.

클래스형 변수 이름 = new 생성자;

 

자바에서 클래스를 생성할 떄는 new 예약어를 사용하고 이어서 생성자를 써준다.

클래스 자료형 변수를 선언하고 new 예약어로 생성자를 호출하여 대입하면 새로운 클래스가 생성된다.

클래스가 생성된다는 것은 클래스를 실제 사용할 수 있도록 메모리 공간(힙 메모리)을 할당 받는다.

실제로 사용할 수 있도록 생성된 클래스를 '인스턴스'라고 한다.

인스턴스를 가리키는 클래스형 변수를 '참조 변수'라고 한다.

 

Stuent studentAhn = new Student();

 

위 코드는 Student 클래스 자료형으로 StudentAhn 변수를 선언하고 new Student();로 Student 클래스를 생성하여 studentAHn에 대입한다는 뜻이다.

여기서 studentAhn을 참조 변수라 하고, 이 변수가 생성된 인스턴스를 가리킨다.


인스턴스와 참조 변수

 

  • 인스턴스 여러 개 생성하기

클래스의 생성자를 호출하면 인스턴스가 만들어진다.

클래스는 하나이지만, 이 클래스로부터 여러 개의 각각 다른 인스턴스를 생성할 수 있다.

예를 들어 어떤 학교에서 학생이란 추상어는 뜻이 하나이지만, 그 학교에 다니는 학생 개개인은 여러 명인 것과 마찬가지이다.

각 학생은 이름이 다르고, 학번이 다르고, 학년이 다르다.

즉 클래스라는 틀에서 인스턴스를 여러개 만들어 프로그램을 구현하는 것이다.

 

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)가 두 개 생성되었다.

이렇게 만든 인스턴스를 어디에, 어떻게 참조하여 사용하는지 알아보자.

 

  • 참조 변수 사용하기

참조 변수를 사용하면 인스턴스의 멤버 변수와 메서드를 참조하여 사용할 수 있는데 이때 도트(.) 연산자를 사용한다.

참조 변수.멤버 변수
참조 변수.메서드

 

studentAhn 참조 변수로 studentName 멤버 변수에 이름을 저장하고 getStudentName() 메서드를 사용하는 코드

studentAhn.studentName = "안연수";			// 멤버 변수 사용
System.out.println(studentAhn.getStudentName());   // 메서드 사용

인스턴스와 힙 메모리

 

new Student()를 선언하면 Student 하나가 생성되는데 각 Student는 studentID, studnetName 등의 멤버 변수를 가지고 있다.

그런데 이들 변수를 저장할 공간이 있어야 한다.

이때 사용하는 메모리가 힙 메모리(heap memory)이다.


  • 힙 메모리란?

힙은 프로그램에서 사용하는 동적 메모리(dynamic memory) 공간을 말한다.

일반적으로 프로그램은 스택, 힙, 데이터 이렇게 세 영역을 사용하는데, 객체가 생성될 때 사용하는 공간이 힙이다.

힙은 동적으로 할당되며 사용이 끝나면 메모리를 해제해 주어야 한다.

C나 C++ 언어에서는 프로그래머가 직접 메모리를 해제하지만, 자바에서는 가지비 컬렉터가 자동으로 메모리를 해제해 준다.


 

클래스 생성자를 하나 호출하면 인스턴스가 힙 메모리에 생성된다.

Student studnetAhn = new Student();

 

위와 같이 생성된 클래스를 studentAhn 변수에 대입하면, 인스턴스가 저장된 메모리를 studnetAhn 변수가 가리킨다.

 

  스택 메모리                       힙 메모리

  studentAhn      ㅡㅡ>   Student 클래스 생성

 

studentAhn 변수는 지역 변수이다.

지역 변수이기 때문에 스택 메모리에 저장된다.

지역 변수 studentAhn에 생성된 인스턴스를 대입하는 것은 studentAhn에 인스턴스가 생성된 힙 메모리의 주소를 대입한다는 것과 같은 의미이다.

 

Student student1 = new Student();
Student student2 = new Student();

인스턴스를 두개 생성한다 해도 두 인스턴스는 당연히 각각 다른 메모리 공간을 차지한다.

따라서 student1.studentName과 student2.studentName은 서로 다른 값을 가진다.

 

  스택 메모리                       힙 메모리

     student1      ㅡㅡ>   Student 클래스 생성

     student2      ㅡㅡ>   Student 클래스 생성

 

 

클래스가 생성될 때마다 인스턴스는 다른 메모리 공간을 차지한다.

다시 말하면 멤버 변수를 저장하는 공간이 매번 따로 생긴하는 의미이다.

이런 이유 때문에 클래스에 선언한 멤버 변수를 다른말로 '인스턴스 변수'라고도 부른다.

 

  • 참조 변수와 참조 값

참조 변수는 힙 메모리에 생성된 인스턴스를 가리킨다.

참조 변수에 실제로 어떤 내용이 들어 있는지 출력하면?

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);
    }
}

 

힙 메모리에 생성된 인스턴스의 메모리 주소는 참조 변수에 저장된다.

출력 내용을 확인해 보면 '클래스 이름@주소 값' 이다.

여기 나오는 주소 값은 해시 코드값이라고도 한다.

이 값은 자바 가상 머신에서 객체가 생성되었을 때 생성된 객체에 할당하는 가상 주소 값이다.

따라서 student1 변수를 사용하여 student1 인스턴스를 참조할 수 있다.

이때 student1을 참조 변수, 주소 값을 참조 값이라고 한다.

 

'JAVA' 카테고리의 다른 글

참조 자료형  (1) 2024.12.13
생성자  (0) 2024.12.13
함수(매개변수, return), 스택 메모리, 메서드  (0) 2024.12.11
객체 지향 프로그래밍, 클래스  (1) 2024.12.11
continue문, break문  (0) 2024.12.10