#13. 클래스와 인스턴스에 대해 알아보자!
안녕하세요! 하프입니다😋
어느덧 2022년의 마지막 주인데요, 한 해가 지나가기 전에 자바 관련 포스팅을 하나 더 해야겠다는 생각에 시험 때문에 고이 넣어둔 자바 이론 시리즈를 다시 꺼내왔습니다~! 클래스와 인스턴스에 대해 알아볼 예정인데요, 클래스는 이 글에서 다룬 적이 있지만 클래스에 대해서 새롭게 알게 된 사실을 더 소개할 예정입니다!
이 글은 <Do it! 자바 프로그래밍 입문> 책을 읽고 이해한 내용을 바탕으로 작성되었습니다😉
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;
}
}
지금까지 만들었던 Student 클래스입니다. 여기에는 멤버 변수와 메소드가 있는데, 지금까지는 클래스를 생성하기만 했다면 이제부터는 클래스를 직접 사용해서 결과 값을 출력해보도록 합시다!
클래스를 사용하기 위해서는 main() 함수가 필요한데요, main() 함수는 자바 가상 머신(JVM)이 프로그램을 시작하기 위해서 호출하는 함수입니다. main() 함수는 클래스 안에 생성하지만 클래스의 메소드는 아니라는 점 알아주세요!
main() 함수에서 클래스를 사용하는 방법으로는 우리가 만든 클래스 내부에 main() 함수를 만드는 것과, 외부에 테스트용 클래스를 만들어 사용하는 방법이 있습니다.
2. main() 함수를 통해 클래스를 사용해 보자!
Student 클래스 내부에 main() 함수를 넣었습니다. Student studentHalf = new Student(); 부분은 새로운 Student 클래스를 생성하는 코드이고, studentHalf.studentName = "하프"; 부분은 클래스의 멤버 변수인 studentName에 값을 대입하는 코드입니다. 자세한 내용은 아래에서 알아보도록 할게요!
이런 식으로 클래스에 main() 함수를 넣을 수도 있겠지만, 많은 클래스를 사용해야 할 때는 거의 모든 클래스가 main() 함수를 포함해야 하는 상황이 올 수 있습니다. 그렇기 때문에 클래스 내부에 main() 함수를 넣는 방법이 아닌, 테스트용 클래스를 따로 만들어 실행하는 방식을 알아볼게요!
이클립스에서 테스트용 클래스를 따로 만들겠습니다. 클래스의 이름은 StudentTest로 정했고, main() 함수를 넣을 것이기 때문에 'public static void main(String[] args)' 에 체크 표시를 해줄게요! 물론 직접 입력해도 상관은 없습니다. Finish를 눌러 클래스를 만들겠습니다!
짜잔! 잘 실행이 되네요! 제가 만든 두 클래스는 java_project라는 같은 패키지에 있어서 지금은 딱히 문제될 부분이 없지만, 테스트용 클래스와 사용할 클래스의 패키지가 서로 다르다면 import문을 사용해서 다른 패키지에 있는 클래스를 불러와야 합니다. import에 대해서는 나중에 다룰 기회가 있을 테니 그 때 좀 더 알아보도록 할게요!
3. new Student? 그건 뭐죠?
위에서 봤던 코드 중 Student studentHalf = new Student(); 라는 코드가 있는데, Student 클래스를 생성한다는 의미입니다. new 예약어를 사용했습니다.
클래스형 변수 이름 = new 생성자;
이런 형식으로 클래스를 생성할 수 있습니다. 이렇게 코드를 작성하면 새로운 클래스가 생성된 것입니다. 클래스가 생성된다는 것은, 클래스를 실제로 사용할 수 있도록 메모리 공간을 할당받는다는 뜻이라고 하네요! 이렇게 실제로 사용할 수 있도록 생성된 클래스는 인스턴스라고 합니다. 또한, 인스턴스를 가리키는 클래스형 변수는 참조 변수라고 합니다.
Student studentHalf = new Student();
이 코드를 다시 한 번 살펴볼까요? Student 클래스를 자료형으로 studentHalf 변수를 선언한 뒤, new Student();로 Student 클래스를 생성하여 studentHalf에 대입한다는 뜻이 되겠네요! 이때 studentHalf는 참조 변수가 되고, 이 변수가 생성된 인스턴스를 기리킵니다.
4. 인스턴스와 참조 변수
객체를 코드로 구현한 것이 클래스, 클래스가 메모리 공간에 생성된 상태를 인스턴스라고 합니다. 또한 생성된 클래스의 인스턴스를 객체라고 부르기도 합니다. 클래스의 생성자를 호출하면 인스턴스가 만들어지는데, 인스턴스는 여러 개 생성할 수 있답니다! 인스턴스를 여러 개 만드는 코드를 살펴볼까요?
이번에는 생성자를 두 번 사용하여 인스턴스 두 개(studentHalf와 studentHarp)를 만들었습니다. 이렇게 만든 인스턴스는 어떻게 참조하여 사용할 수 있을까요? 바로 참조 변수를 사용하면 됩니다.
참조 변수를 사용하면 인스턴스의 멤버 변수, 메소드를 참조하여 사용할 수 있답니다! 이 때 도트(.) 연산자를 사용합니다.
studentHalf.studentName = "하프"; // 멤버 변수 사용
System.out.println(studentHalf.getStudentName()); // 메소드 사용
참조 변수.멤버 변수 또는 참조 변수.메소드 의 형식으로 코드를 작성하면 인스턴스의 멤버 변수나 메소드를 참조하여 사용할 수 있게 됩니다😎
5. 인스턴스와 힙 메모리
new Student()를 선언하면 Student 하나가 생성되는데, 이렇게 만들어지는 각 Student는 studentID, studentNAme 등의 멤버 변수를 가지고 있습니다. 이런 변수들을 저장할 공간이 필요하겠죠? 이때 사용하는 메모리를 힙 메모리라고 합니다. 클래스 생성자를 하나 호출하면, 인스턴스가 힙 메모리에 생성되는 것이죠!
지역 변수 studentHalf에 생성된 인스턴스를 대입하는 것은, studentHalf에 인스턴스가 생성된 힙 메모리의 주소를 대입한다는 것과 같은 의미라고 하네요!
여러 개의 인스턴스를 생성하면, 그 인스턴스는 서로 다른 메모리 공간을 차지합니다. 그러므로 멤버 변수를 저장하는 공간 또한 매번 따로 생기는 것이죠! 이런 이유로 클래스에 선언한 멤버 변수는 인스턴스 변수라고 부르기도 합니다.
6. 참조 변수와 참조 값
참조 변수는 힙 메모리에 생성된 인스턴스를 가리키는데요, 참조 변수에는 어떤 값이 들어있을까요?
인스턴스를 출력해 보면 뭔가 이상한 값이 출력됩니다. 출력 내용은 클래스 이름@주소 값인데요(주소 값은 다른 말로 해시 코드 값이라고도 합니다!), 이 값은 JVM에서 객체가 생성되었을 때 객체에 할당하는 가상 주소 값입니다. 여기서 studentHalf는 참조 변수, 주소 값은 참조 값이라고 하는 것입니다!
객체 지향을 공부하면서 새로운 용어들이 많이 등장했는데요, 마무리로 책에 있는 객체 지향 개념 용어들을 정리한 표를 보여드리며 마치겠습니다. 다음 글에서는 생성자에 대해 알아보도록 할게요!
용어 | 설명 |
객체 | 객체 지향 프로그램의 대상, 생성된 인스턴스 |
클래스 | 객체를 프로그래밍하기 위해 코드로 만든 상태 |
인스턴스 | 클래스가 메모리에 생성된 상태 |
멤버 변수 | 클래스의 속성, 특성 |
메서드(메소드) | 멤버 변수를 이용하여 클래스의 기능을 구현 |
참조 변수 | 메모리에 생성된 인스턴스를 가리키는 변수 |
참조 값 | 생성된 인스턴스의 메모리 주소 값 |