tuter77

Java : Instance, Heap Memory, Constructor, Overloading 본문

JavaStudy

Java : Instance, Heap Memory, Constructor, Overloading

tuter77 2023. 1. 29. 19:34

 인스턴스와 힙 메모리

 

▷ 인스턴스

- 클래스는 객체의 속성을 정의, 기능을 구현하여 만들어놓은 상태

- 실제 클래스 기반으로 생성된 객체(인스턴스)는 각각 다른 멤버 변수값들을 가지게 된다.(인스턴스들이 다른 힙메모리에 위치하기 때문이다.)

- new 키워드를 사용해서 인스턴스를 생성할 수 있다.

 

▷ 힙 메모리(Heap)

- 힙은 동적메모리로서 생성된 인스턴스가 이곳에 저장된다.

- c언어나 c++ 언어에서는 사용한 동적메모리를 프로그래머가 해제시켜야 한다.(free(), delete)

- 자바에서는 위와 달리 GC(Garbage Collector)가 주기적으로 사용하지 않는 메모리를 수거한다.

- 하나의 클래스로부터 여러개의 인스턴스가 생성되어 저장되고 각각 따른 메모리 주소를 갖게 된다.

*인스턴스가 저장된 주소는 system.out.print(인스턴스명) 으로 출력하면 나온다.

스택에 저장된 주소는 참조변수라고 하고 그 값은 참조값이라고 한다.(Reference Variable, Reference Value)

 

 생성자(Constuctor)

- 생성자의 기본문법은 아래와 같다.

<class_name>([<argument_list]){[<statement]}

- 객체를 생성할 때 new키워드와 함께 사용한다. (new Student();)

- 생성자는 일반함수처럼 기능을 호출하지 않고 객체를 생성하기 위해, new와 함께 호출된다.

- 객체가 생성될 때 변수나 상수를 초기화하거나 다른 초기화 기능을 수행하는 메서드를 호출한다.

- 생성자는 반환값이 없고, 클래스의 이름과 동일하다.

- 대부분의 생성자는 외부에서 접근이 가능하지만, 필요에따라 private로 선언하기도 한다.

 

▷기본생성자(Default Constructor)

- 클래스에서는 반드시 적어도 하나 이상의 생성자가 존재한다.

- 클래스에 생성자를 구현하지 않아도, new키워드와 함께 생성자를 호출할 수 있다.

- 클래스에 생성자가 하나도 없는 경우 컴파일러가 생성자 코드를 자동으로 넣어준다.(예. public Student(){} -- 클래스명과 동일)

- 매개변수, 구현부가 없다.

이와 같은 생성자를 예시로 살펴보겠다.

아래는 Student클래스에서 선언된 속성들과 이를 구동하기위한 Test 클래스이다.

 

public class Student {

 

public int studentNumber;

public String studentName;

public int grade;

 

public Student() {} // 이 부분이 default 생성자에 해당한다.

public Student(int studentNumber, String studentName, int grade) {//매개변수로 정보를 생성해주는 경우

 

//studentNumber = studentNumber; //매개변수가 지역변수인 매개변수에 값을 대입하는 형태가됨. 이렇게 쓰면안된다. 하려는건 멤버변수에 대입하는것.

this.studentNumber = studentNumber;//매개변수와 이름이 같을때 this.을 사용해 멤버변수임을 선언할 수 있다.

this.studentName = studentName;

this.grade = grade;

}

 

public String showStudentInfo() {

 

return studentName + "학생의 학번은" + studentNumber + "이고, " + grade + "학년 입니다.";

}

}

아래는 테스트 클래스이다.

public class StudentTest {

public static void main(String[] args) {

Student studentLee = new Student();//(중요)default 생성자인데 생성자를 직접 만든 경우엔 제공되지않아서 class에 디폴트 생성자를 만들면된다.

studentLee.grade = 1;

 

System.out.println(studentLee.showStudentInfo());

 

Student studentKim = new Student(123456, "Kim", 3);//매개변수로 값을 입력.

System.out.println(studentKim.showStudentInfo());

 

}//정보를 주지않고 출력하면 String은 null값으로 초기화, Int는 0으로 초기화된다.

}

 

매개변수로 값을 입력하였지만, 저렇게 값을 입력하지 않고 그대로 출력하는 경우, String은 null값으로 int는 0으로 초기화되어 출력된다.

 

위 처럼 new Student()로 기본 생성자를 사용했는데 이 생성자를 그대로 사용하기 위해서 앞 클래스에 public Student() {}과 같이 선언해주어야 한다. 이 내용은 아래 생성자 오버로딩에 나온다.

 

▷생성자 오버로딩.

- 생성자를 구현해서 사용할 수 있다.

- 클래스에 생성자를 따로 구현하면 default constructor는 제공되지 않는다.

- 생성자를 호출하느 코드(client)에서 여러 생성자 중 필요에 따라 호출해서 사용할 수 있다.

 

오늘은 스택, 힙 메모리, 생성자에 대해서 배웠다. 중요한건 손에 언어가 익는 실습이라고 해서 실습으로 반복해서 클래스를 만들어보느라 시간이 많이 걸렸다. 

이 클래스 만들기, 값을 저장해서 출력하기 등의 실습에서는 클래스 내에 멤버변수들을 어떻게 선언했는지 많이 헷갈렸고, 생성된 메소드를 this 매개변수를 사용해서 값을 입력할 지 아니면, 인스턴스에 일일히 값을 선언해주어할지 익히는게 시간이 걸렸다.

 

위 내용은 2022.12.22에 공부한 내용입니다.

링크 : https://dudwls3278.tistory.com/21