클래스와 인스턴스의 차이에 대해 설명해주실 수 있을까요?
클래스와 인스턴스는 자바의 객체지향 프로그래밍에서 중요한 개념입니다. 가장 큰 차이점은 설계도와 설계도에 따라 만들어진 실제 객체로 볼 수 있습니다. 자동차를 예시로 설명드리겠습니다.
클래스(Class)란 객체를 만들기 위한 설계도라고 볼 수 있습니다.
설계도에는 객체를 만들기 위한 속성과 메서드를 포함합니다.
예를 들어, 자동차 클래스는 자동차라는 것의 설계도이며 속성에서 이름, 색상, 제작년도같은 객체의 정보를 담게 됩니다. 또한 메소드에서 주행, 정지 등 자동차가 할 수 있는 행동을 담게 됩니다.
속성은 보통 필드라고 불리우며, 행동은 메소드로 불리웁니다. 이 두개를 합쳐서 그 클래스의 멤버라고 표현합니다.
인스턴스(Instance)에 대해서 설명드리자면,
자동차 설계도를 토대로 만들어진 특정 자동차 객체가 인스턴스입니다.
위 예시를 이어가서 설명 드리면 클래스 설계도에 따라 A라는 자동차를 만들면, A라는 이름을 가지고있고 주행, 정지 기능을 가진 자동차 객체가 만들어지게 됩니다.
이렇게 클래스를 기반으로 실제로 메모리에 할당된 객체를 인스턴스라고 부릅니다.
인스턴스는 설계도에서 정의한 멤버를 가지고 있기 때문에 객체를 통해 그 속성과 메소드를 실제로 사용할 수 있게 됩니다. 자동차로부터 이름을 불러올 수도, 수정 할 수도 있으며, 자동차의 주행, 정지 시키는 행동을 시킬 수도 있습니다.
추가질문
행동이라하면 함수를 말하는 것인가요? 함수와 메소드와의 차이가 있을까요?
함수와 메소드는 어떤 행동, 기능을 정의한 것으로 유사하게 사용되기도 하지만, 실제로 개념적으로는 다르다고 생각합니다.
함수는 일반적으로 독립적으로 정의된 것이며, 특정한 객체에 속해 있지 않습니다.
메서드는 특정한 객체에 속해 있는 함수라고 볼 수 있습니다. 즉, 클래스나 객체에 묶여서 정의된 함수를 메서드라고 합니다. 따라서 클래스함수라고 불리우기도 합니다. 이렇게 메서드는 객체를 통해 불러 올 수 있거나 실행 할 수 있으므로 그 대상은 호출한 객체로 함수의 개념과 달리 한정적입니다.
추가질문
메모리에 할당 된다는 말을 쉽게 표현해주시겠어요?
자동차 클래스인 설계도가 있고, 만약 프로그램에서 설계도에 따른 객체를 new를 통해 생성하면 이는 참조형 변수와 마찬가지로 메모리에 객체가 올라가게 됩니다.
스택과 힙은 특히 자바에서 객체 지향 프로그래밍을 할 때 중요한 메모리 영역입니다.
스택에 객체를 바라보는 주소값이 저장되고
힙 영역에서는 실제 객체의 멤버들인 필드와 메소드가 저장됩니다.
추가질문
객체의 정보를 변경하는 과정은 어떻게 되나요?
A라는 자동차를 new로 생성한 시점에는 메모리에 올라가 있습니다. 이후 자동차의 이름을 B로 변경하고자 합니다. 그럼 이름 변경이라는 메소드에 해당 A자동차 객체를 매개변수로 전달하여 수정하려고 합니다.
이 때 매개변수로 전달하는 과정에서 A자동차의 참조형 변수명을 전달하게 되는데 여기엔 주소값이 담겨져 있습니다. Java는 항상 값을 복사하여 전달하는데 참조형변수이름에 담긴 주소값이 복사됩니다.
이름변경 메소드에서 그 주소값이 가리키는 자동차의 이름 속성을 B로 변경합니다. 그리고 이름변경 메소드가 종료되면 해당 이름변경 메소드는 스택에서 소멸되고 복사되었던 참조형변수이름은 소멸합니다. 하지만 힙 영역은 아직 프로그램이 진행중이기 때문에 자동차의 이름이 B로 변경된 상태가 유지되고 있습니다.
그 다음 코드로 이름이 변경된 것을 확인하고자 A자동차의 이름을 출력하는 코드를 실행하면, 동일하게 매개변수로 그 자동차의 속성을 불러오는 메소드가 실행, 객체의 이름을 호출 하는 과정이 진행되는데, 힙 영역은 소멸되지 않았기 때문 여기서 자동차 이름을 호출하면 변경된 이름 B가 출력되게 됩니다.
이렇게 프로그램이 실행 시점에는 객체가 메모리의 힙 영역에 로드되고 특정 주소값을 가진 상태가 지속되며 그 객체를 호출하는 다양한 메소드들이 동일한 주소값을 복사하면서 결과적으로 동일한 객체를 가리키며 정보를 수정하거나 조회하는 등 활동을 하게 됩니다.