[JAVA] 객체와 객체 지향 – 인스턴스, 힙 메모리, 생성자

– 인스턴스

자바에서 인스턴스는 클래스로부터 생성된 개별 객체를 나타냅니다. 클래스는 객체를 생성하기 위한 템플릿이며, 인스턴스는 해당 클래스의 실제 사례입니다.
객체를 생성하려면 해당 클래스의 인스턴스를 만들어야 합니다. 예를 들어, 자동차 클래스로부터 자동차 객체를 만들려면 다음과 같이 작성합니다.
Car myCar = new Car();
위 코드에서 Car는 클래스 이름이며, myCar는 객체의 이름입니다. new 키워드를 사용하여 새로운 객체를 생성하고, Car()는 생성자를 호출하여 객체를 초기화합니다. 이렇게 생성된 myCar 객체는 자동차 클래스의 인스턴스입니다.
인스턴스는 해당 클래스에 정의된 속성(데이터)과 메서드(동작)를 가집니다. 따라서 인스턴스를 사용하여 객체의 상태를 나타내고 동작을 수행할 수 있습니다. 예를 들어, 자동차 객체는 브랜드, 모델, 색상 등의 속성을 가지며, 주행, 멈춤, 속도 변경 등의 메서드를 실행할 수 있습니다.
인스턴스는 객체지향 프로그래밍에서 중요한 개념 중 하나이며, 객체의 상태와 동작을 캡슐화하여 코드의 재사용성과 유지보수성을 높이는 데 사용됩니다.
  • 클래스는 객체의 속성을 정의 하고, 기능을 구현하여 만들어 놓은 코드 상태
  • 실제 클래스 기반으로 생성된 객체(인스턴스)는 각각 다른 멤버 변수 값을 가지게 됨 가령, 학생의 클래스에서 생성된 각각의 인스턴스는 각각 다른 이름, 학번, 학년등의 값을 가지게 됨
  • new 키워드를 사용하여 인스턴스 생성

– 힙 메모리

자바에서 힙 메모리는 동적으로 할당된 객체가 저장되는 메모리 영역입니다. 힙 메모리는 프로그램 실행 중에 동적으로 할당되며, 객체의 크기와 수명은 실행 중에 결정됩니다.
힙 메모리는 가비지 컬렉터(Gabage Collector)에 의해 관리됩니다. 가비지 컬렉터는 더 이상 사용되지 않는 객체를 자동으로 식별하여 해제하여 메모리 누수를 방지합니다. 이는 개발자가 명시적으로 메모리를 해제할 필요가 없어 메모리 관리를 간편하게 만듭니다.
힙 메모리는 자바 프로그램에서 객체 지향적인 프로그래밍을 가능하게 합니다. 객체는 동적으로 생성되고 해제되므로 프로그램이 실행되는 동안 필요한 만큼의 메모리를 효율적으로 사용할 수 있습니다. 또한, 힙 메모리는 여러 스레드가 동시에 접근할 수 있으므로 멀티스레드 환경에서 안전하게 사용될 수 있습니다.
힙 메모리는 자바 프로그래밍에서 중요한 개념 중 하나이며, 객체의 동적 할당 및 메모리 관리를 이해하는 데 필수적입니다.
  • 생성된 인스턴스는 동적 메모리(heap memory) 에 할당됨
  • C나 C++언어에서는 사용한 동적 메모리를 프로그래머가 해제 시켜야 함(free() 나 delete이용)
  • 자바에서 Gabage collector 가 주기 적으로 사용하지 않는 메모리를 수거
  • 하나의 클래스로 부터 여러개의 인스턴스가 생성되고 각각 다른 메모리 주소를 가지게 됨

– 생성자

자바에서 생성자는 객체를 초기화하는 특별한 종류의 메서드입니다. 객체가 생성될 때 자동으로 호출되며, 주로 객체의 초기 상태를 설정하는 데 사용됩니다.
생성자는 클래스의 이름과 동일하며, 반환 값이 없고, 리턴 타입을 명시하지 않습니다. 객체를 생성할 때 new 키워드와 함께 호출되며, 해당 클래스의 인스턴스를 만들고 초기화합니다.
생성자는 기본 생성자와 매개변수가 있는 생성자로 나뉩니다. 기본 생성자는 매개변수가 없는 생성자로, 클래스에 명시적으로 정의되지 않을 경우 자동으로 생성됩니다. 매개변수가 있는 생성자는 객체를 생성할 때 필요한 매개변수를 받아들이고 초기화합니다.

– constructor

  • 생성자 기본 문법 <class_name>([<argument_list]){[<statements]}
  • 객체를 생성할 때 new 키워드와 함께 사용 – new Student();
  • 생성자는 일반 함수처럼 기능을 호출하는 것이 아니고 객체를 생성하기 위해 new 와 함께 호출 됨
  • 객체가 생성될 때 변수나 상수를 초기화 하거나 다른 초기화 기능을 수행하는 메서드를 호출 함
  • 생성자는 반환 값이 없고, 클래스의 이름과 동일
  • 대부분의 생성자는 외부에서 접근 가능하지만, 필요에 의해 private 으로 선언되는 경우도 있음
public class Student {
    int studentId;
    String studentName;
    String studentAddress;

    public Student(int studentId, String studentName){
        this.studentId = studentId;
        this.studentName = studentName;
    }

    public void showStudentInfo(){
        System.out.println(studentId + "," + studentName + ',' + studentAddress);
    }
    public String getStudentName(){
        return studentName;
    }
}
public class StudentTest {
    public static void main(String[] args) {
        Student studentLee = new Student(100, "Lee");
        studentLee.studentAddress = "Seoul";

        Student studentKim = new Student(101, "Kim");
        studentKim.studentAddress = "New York";

        studentLee.showStudentInfo();
        studentKim.showStudentInfo();

        System.out.println(studentLee);
        System.out.println(studentKim);
    }

– overloading

  • 생성자를 구현해서 사용할 수 있음
  • 클래스에 생성자를 따로 구현하면 기본 생성자 (default constructor)는 제공되지 않음
  • 생성자를 호출하는 코드(client 코드) 에서 여러 생성자 중 필요에 따라 호출해서 사용할 수 있음
public class Student {
    int studentId;
    String studentName;
    String studentAddress;
    public Student(){

    }
    public Student(int studentId, String studentName){
        this.studentId = studentId;
        this.studentName = studentName;
    }

    public Student(int studentId, String studentName, String studentAddress){
        this.studentId = studentId;
        this.studentName = studentName;
        this.studentAddress = studentAddress;
    }

    public void showStudentInfo(){
        System.out.println(studentId + "," + studentName + ',' + studentAddress);
    }
    public String getStudentName(){
        return studentName;
    }
}

public class StudentTest {
    public static void main(String[] args) {
        Student studentLee = new Student(100, "Lee");
        studentLee.studentAddress = "Seoul";

        Student studentKim = new Student(101, "Kim", "New York");
        studentKim.studentAddress = "New York";

        studentLee.showStudentInfo();
        studentKim.showStudentInfo();

        System.out.println(studentLee);
        System.out.println(studentKim);
    }
}

Leave a Comment