안녕하세요 스코리아입니다.
자바의 메소드와 인스턴스, 힙메모리를 공부하기 전에 이전 시간에 설명드렸던 '객체지향적 프로그래밍'과 '함수의 스택 메모리 구조'를 꼭 이해하고 오시길 추천드립니다!
[이전 내용] 객체지향적 프로그래밍: 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);
}
}
- new Student()로 studentLee 이름을 가진 '인스턴스'를 생성했습니다.
- studentLee.studentName이라는 참조변수에 "이순신"을 대입하여 인스턴스의 멤버 변수 값을 지정해 주었습니다.
- studentLee.showStudentInfo()를 통해 인스턴스의 메소드를 호출합니다. => "이순신, 서울" 이 출력됩니다.
- new Student()로 studentKim 이름을 가진 '인스턴스'를 생성했습니다. 이 인스턴스는 studentLee 인스턴스와는 구별됩니다 (메모리 주소가 다릅니다)
- studentKim도 2,3번과 같이 코드가 수행됩니다.
- studentLee와 studnetKim을 출력해 보면 각각 다른 메모리 주소를 가진 객체(인스턴스) 값이 출력되는 것을 볼 수 있습니다.
힙 메모리 (heap memory)란?
- 생성된 인스턴스는 동적 메모리(heap memory)에 할당됨
- C, C++ 언어에서는 사용한 동적메모리를 free() 나 delete를 이용하여 해제시켜야 하지만, 자바에서는 Garbage Collector (가비지 컬렉션)가 주기적으로 사용하지 않는 메모리를 수거합니다.
- 하나의 클래스로부터 여러 개의 인스턴스가 생성된다면, 이는 각각 다른 메모리주소를 가지게 됨 (위의 예시와 같이)
여기서 가장 핵심은 인스턴스 별로 메모리 주소가 다르기 때문에 각각의 인스턴스 별로 다른 멤버 변수의 값을 가질 수 있다는 것입니다.
객체라는 틀만 존재하고, 안의 값들은 모두 다른 형태라고도 볼 수 있습니다.
너무 많은 용어로 인해 혼동될 수 있으므로, 이러한 용어를 한 번에 정리해 보겠습니다.
용어를 정리해 보자!
- 객체 : 객체 지향 프로그램의 대상, 생성된 인스턴스
- 클래스 : 객체를 프로그래밍하기 위해 코드로 정의해 놓은 상태
- 인스턴스 : new 키워드를 사용하여 객체(클래스)를 메모리에 생성한 상태
- 멤버 변수(인스턴스 변수) : 객체(클래스)의 속성, 특성
- 메소드(멤버 함수) : 멤버 변수를 이용하여 클래스의 기능을 구현한 함수
- 참조 변수 : 메모리에 생성된 인스턴스를 가리키는 변수
- 참조 값 : 생성된 인스턴스의 메모리 주소 값
지금까지 JAVA의 멤버 변수와 메소드를 사용하여 객체를 구현해 보고, 생성해 보았습니다. 그리고 생성된 인스턴스를 토대로 힙메모리에 대해서도 공부해 보았습니다.
읽어주셔서, 감사합니다!
'JAVA > 객체지향' 카테고리의 다른 글
자바 접근 제어 지시자와 정보은닉을 활용한 캡슐화 (객체지향) (0) | 2023.08.14 |
---|---|
자바 참조 자료형 변수 정의하기, 사용 방법 (feat. 객체) (2) | 2023.08.12 |
자바 생성자 의미와 구현, 그리고 생성자 오버로딩 뜻? (1) | 2023.08.10 |
자바 함수 정의, 호출 방법과 스택 메모리란? (0) | 2023.08.07 |
자바의 객체지향적인 프로그래밍은 도대체 무엇인가? (OOP 원칙) (7) | 2023.08.06 |