개발자 데뷔!

06. [Java] 인스턴스 생성 (new) 본문

프로그래밍 언어/Java

06. [Java] 인스턴스 생성 (new)

물꼮이 2022. 1. 31. 21:15
OOP
; Object-Oriented Programming
객체지향 프로그래밍

 

지난 번 포스팅에선, 패키지- class - main 함수간의 구조를 개략적으로 살펴보았다. 

이번에는, 클래스 사용에 반드시 선행되어야 하는 '인스턴스 생성' 에 관한 부분을 자세히 알아보겠다. 

 

 


인스턴스 생성 

class를 사용하려면, 클래스를 우선 생성해야 한다. 

클래스가 생성된다 = 클래스를 사용할 메모리공간(힙메모리)를 할당 받는다

클래스형  변수이름 = new 생성자
자료형(class)  인스턴스(참조변수) = 예약어(new) 생성자

이 때, 간단히 이렇게 정리할 수 있다.

new = 클래스를 생성하는 예약어

인스턴스 = 생성된 클래스 

참조변수 = 인스턴스를 가리키는 클래스형 변수 

 

ex)

Student  A new Student();
객체 = 클래스  
인스턴스 = 클래스가 메모리 공간에 생성된 상태 (= 객체의 한종류)  

* 하나의 클래스로 부터, 여러개의 각각 다른 인스턴스를 생성할 수 있다

 

 


인스턴스와 메모리

지역 변수는 '스택 메모리'에, 인스턴스는 '힙 메모리'에 생성된다. 

생성된 클래스 참조변수 A에 대입하면, 

인스턴스가 생성된 메모리(힙메모리) 참조변수 A(스택메모리)가 가리킨다! 

즉, 인스턴스의 힙메모리의 주소를 참조변수에 대입하는 것과 같다.

인스턴스 생성 시 메모리 사용 방식

* 힙(heap) 메모리는 동적 메모리(dynamic memory) 공간.

  동적으로 할당되며, 사용이 끝나면 메모리를 해제해주어야 함. 

* 참조변수 값을 출력하면, 

 '클래스이름@주소값' 형태로 출력됨. 주소값은 해시코드값이다

* 해시코드(hash code) : 객체가 생성될 때, JVM 에서 할당해주는 가상주소값

 


생성자

: (constructor) 클래스 생성 시, 인스턴스 변수(멤버 변수 or 상수)의 초기화 하는 역할

 ex) Student() 

 

기본 생성자

: 생성자가 없는 클래스는, 자바 컴파일러가 컴파일 시 자동으로 생성자를 만든다.

  이를 기본 생성자(default constructor)라고 한다. 

  - 매개변수(X), 구현코드(X)가 없는 것이 특징

 

단, 생성자가 초기화하고자 하는 멤버변수의 값을 직접 지정하고 싶을 때, 생성자를 직접 만들어 사용한다. 

* 필요에 따라, 생성자를 여러개 만들어서 사용할 수 있음 (기본 생성자 포함, 단, 매개변수가 모두 달라야 함)

* 단, 디폴트 생성자를 일부러 구현하지 않는 경우도 많음! 

  • ex) 
package test;

public class Person {
    String name;
    
    // 자동제공되는 디폴트 생성자
    public Person() { }
    
    // 직접 만든 생성자
    public Person(String pname) {
        name = pname;			// 매개변수로 이름을 입력받아, 해당 값을 멤버변수로 가진 class생성
    }

}

 

생성자 오버로드

: (constructor overload) 클래스에 생성자가 두 개 이상 제공되는 경우 


참조변수 사용

  • 참조변수.멤버변수
  • 참조변수.메서드

위처럼 도트(.)연산자를 사용해, 인스턴스의 멤버변수와, 메서드에 접근 할 수 있다.


참조자료형

ex) 

- 과목 클래스

package reference;

public class Subject {

	String subjectName;
	int scorePoint;
}

- 학생 클래스

package reference;

public class Student3 {

	int studentID;
	String studentName;
	// Subject 클래스를 이용해 선언
	Subject korean;
	Subject math;
   }

 

변수의 사용 

국어과목 이름 → korean.subjectName
수학과목 성적 → math.scorePoint

다음과 같이 접근하여 사용한다.