본문 바로가기
JAVA/객체지향

자바 메소드 의미, 인스턴스 생성과 힙메모리란? (feat. 객체)

by 스코리아 2023. 8. 9.

안녕하세요 스코리아입니다.

자바의 메소드와 인스턴스, 힙메모리를 공부하기 전에 이전 시간에 설명드렸던 '객체지향적 프로그래밍'과 '함수의 스택 메모리 구조'를 꼭 이해하고 오시길 추천드립니다!

[이전 내용] 객체지향적 프로그래밍: https://skorea6.tistory.com/3

[이전 내용] 함수의 스택 메모리 구조: https://skorea6.tistory.com/4

 

시작하기 앞서, TMI 하나만 하겠습니다.. 글의 제목을 생각하던 와중에, 메소드 vs 메서드? 뭐가 맞는가에 대해서 한참 고민했습니다.

구글 서칭 결과, Method의 한글 표기법은 '메서드'가 더 정확한 표현이라고 하네요:)

다만, 사람들은 '메서드'보다 '메소드'라고 더 많이 쓰는 것 같아서, 앞으로 '메소드'로 명칭 하여 설명하겠습니다 ㅎㅎ

 

메소드(method)는 무엇인가?

  • 객체의 기능을 구현하기 위해 클래스 내부에 구현되는 함수
  • 멤버 함수 (member function) 이라고도 함
  • 메소드를 구현함으로써 객체의 기능이 구현됨

 

멤버 변수 메소드

객체의 속성은 멤버 변수로, 객체의 기능은 메소드(멤버 함수)로 구현됩니다.

예시로 학생 클래스를 정의하고 객체를 사용해 봅시다.

public class Student {
	public int studentID; // 멤버 변수
	public String studentName;  
	public String address;
			
	public void showStudentInfo() { // 메소드(멤버 함수)
		System.out.println(studentName + "," + address);
	}
	
	public String getStudentName() {
		return studentName;
	}
}
  • 학생 클래스 객체 속성인 studentId (학생번호), studentName(학생이름), address(주소)를 멤버 변수로 선언하였습니다.
  • 객체의 기능인 showStudentInfo() 함수(학생이름과 주소를 출력하는 함수)와 getStudentName() 함수(학생이름을 return 하는 함수)를 메소드(멤버 함수)로 구현하였습니다.
  • 참고: 메소드의 이름은 getStudentName()과 같이 그 객체를 사용하는 객체(클라이언트)에 맞게 짓는 것이 좋습니다. 

이렇듯, 이 Student 클래스는 객체의 속성을 정의하고, 기능을 구현하여 만들어놓은 상태라고 할 수 있겠습니다.

Student 객체를 사용(생성)해보기 전에, instance의 개념부터 알아보시죠!

 

인스턴스 (instance)란?

  • 구현한 객체를 메모리에 생성한 상태를 '인스턴스'라고 함. 1개의 객체로 여러 개의 인스턴스를 만들 수 있음.
  • new 키워드를 사용하여 인스턴스 생성 가능 ( new 클래스이름() )
  • 실제 클래스 기반으로 생성된 객체(인스턴스)는 각각 다른 멤버 변수 값을 가질 수 있음 (위 학생 클래스에서 생성된 각각의 인스턴스(객체)는 각각 다른 이름, 학번, 학년 등의 값을 저장할 수 있음)

 

이제 위에서 만들었던 Student 객체를 사용해 보겠습니다.

public class StudentTest {

	public static void main(String[] args) {
		Student studentLee = new Student(); // 객체 생성 (인스턴스 생성)
		studentLee.studentName = "이순신";
		studentLee.address = "서울";
		
		studentLee.showStudentInfo(); // 인스턴스의 메소드 호출
		
		Student studentKim = new Student();
		studentKim.studentName = "김유신";
		studentKim.address = "경주";
		
		studentKim.showStudentInfo();
		
		System.out.println(studentLee); // 인스턴스 출력
		System.out.println(studentKim);
	}

}
  1. new Student()로 studentLee 이름을 가진 '인스턴스'를 생성했습니다.
  2. studentLee.studentName이라는 참조변수에 "이순신"을 대입하여 인스턴스의 멤버 변수 값을 지정해 주었습니다.
  3. studentLee.showStudentInfo()를 통해 인스턴스의 메소드를 호출합니다. => "이순신, 서울" 이 출력됩니다.
  4. new Student()로 studentKim 이름을 가진 '인스턴스'를 생성했습니다. 이 인스턴스는 studentLee 인스턴스와는 구별됩니다 (메모리 주소가 다릅니다)
  5. studentKim도 2,3번과 같이 코드가 수행됩니다.
  6. studentLee와 studnetKim을 출력해 보면 각각 다른 메모리 주소를 가진 객체(인스턴스) 값이 출력되는 것을 볼 수 있습니다.

 

힙 메모리 (heap memory)란?

  • 생성된 인스턴스동적 메모리(heap memory)에 할당됨
  • C, C++ 언어에서는 사용한 동적메모리를 free() 나 delete를 이용하여 해제시켜야 하지만, 자바에서는 Garbage Collector (가비지 컬렉션)가 주기적으로 사용하지 않는 메모리를 수거합니다.
  • 하나의 클래스로부터 여러 개의 인스턴스가 생성된다면, 이는 각각 다른 메모리주소를 가지게 됨 (위의 예시와 같이)

힙 메모리 구조

여기서 가장 핵심은 인스턴스 별로 메모리 주소가 다르기 때문에 각각의 인스턴스 별로 다른 멤버 변수의 값을 가질 수 있다는 것입니다.

객체라는 틀만 존재하고, 안의 값들은 모두 다른 형태라고도 볼 수 있습니다.

 

 

너무 많은 용어로 인해 혼동될 수 있으므로, 이러한 용어를 한 번에 정리해 보겠습니다.

용어를 정리해 보자!

  • 객체 : 객체 지향 프로그램의 대상, 생성된 인스턴스
  • 클래스 : 객체를 프로그래밍하기 위해 코드로 정의해 놓은 상태
  • 인스턴스 : new 키워드를 사용하여 객체(클래스)를 메모리에 생성한 상태
  • 멤버 변수(인스턴스 변수) : 객체(클래스)의 속성, 특성
  • 메소드(멤버 함수) : 멤버 변수를 이용하여 클래스의 기능을 구현한 함수
  • 참조 변수 : 메모리에 생성된 인스턴스를 가리키는 변수
  • 참조 값 : 생성된 인스턴스의 메모리 주소 값

 

지금까지 JAVA의 멤버 변수와 메소드를 사용하여 객체를 구현해 보고, 생성해 보았습니다. 그리고 생성된 인스턴스를 토대로 힙메모리에 대해서도 공부해 보았습니다.

 

읽어주셔서, 감사합니다!