멤버 변수, 메소드, 생성자, 참조 자료형 변수 / java
멤버 변수, 인스턴스 메소드
- 멤버 변수 -> 객체의 속성
- 인스턴스 메소드 -> 객체의 기능
인스턴스 생성과 힙 메모리 (heap memory)
인스턴스 (instance)
- 클래스는 객체의 속성을 정의하고, 기능을 구현하여 만들어 놓은 코드 상태
- 실제 클래스 기반으로 생성된 객체(인스턴스)는 각각 다른 멤버 변수 값을 가지게 됨
- 가령, 학생의 클래스에서 생성된 각각의 인스턴스는 각각 다른 이름, 학번, 학년 등의 값을 가지게 됨
- new 키워드를 사용하여 인스턴스 생성
힙 메모리 (heap memory)
- 생성된 인스턴스는 동적 메모리(heap memory)에 할당됨
- c나 c++ 언어에서는 사용한 동적 메모리를 프로그래머가 해제 시켜야함(free(), delete 사용)
- 자바에선 Gabage Collector가 주기적으로 사용하지 않는 메모리를 수거
- 하나의 클래스로부터 여러 개의 인스턴스가 생성되고 각각 다른 메모리 주소를 가지게 됨.
생성자(Constructor)
- 생성자 기본 문법 -> class name(argument list) { statements }
- 객체를 생성할 때 new 키워드와 함께 사용 - new Student();
- 생성자는 일반 함수처럼 기능을 호출하는 것이 아니고 객체를 생성하기 위해 new와 함께 호출 함
- 객체가 생성될 때 변수나 상수를 초기화 하거나 다른 초기화 기능을 수행하는 메소드를 호출함
- 생성자는 반환 값이 없고, 클래스의 이름과 동일
- 대부분의 생성자는 외부에서 접근 가능하지만, 필요에 의해 private 으로 선언되는 경우도 있음
기본 생성자(default constructor)
- 클래스에는 반드시 적어도 하나 이상의 생성자가 존재
- 클래스에 생성자를 구현하지 않아도 new 키워드와 함께 생성자를 호출할 수 있음
- 클래스에 생성자가 하나도 없는 경우 컴파일러가 생성자 코드를 넣어 줌
- public Student() { }
- 매개 변수가 없음, 구현부가 없음
- 직접 구현한 생성자 함수는 new라는 연산자에 의해 한 번 호출된다. new라는 연산자가 없으면 절대 호출이 안된다!!
- 일반 메소드는 메소드의 이름으로 호출이 가능
- 인스턴스 생성시 멤버 변수의 초기화 String -> null, int -> 0
- 생성자 함수에 인자로 멤버 변수와 같은 이름의 매개 변수를 줄 때, 멤버 변수 앞에 this 키워드를 사용하지 않으면 가장 가까운 지역 변수(인자로 전달됟 매개 변수를 지역 변수로)로 인식해서 멤버 변수에 초기화된 값 null과 0에 인자로 전달한 값이 대입되지 않고 블록 밖으로 나가면 소멸된다.
- 매개 변수의 이름과 멤버 변수의 이름을 다르게 하면 this를 쓰지 않아도 된다.
- 생성자 함수를 직접 구현 하지 않으면 디폴트 생성자 함수가 구현된다. 인스턴스 생성 후 참조변수를 통해 멤버 변수에 접근해서 값을 대입한다.
- 생성자를 구현해서 사용할 수 있음
- 클래스에 생성자를 따로 구현하면 기본 생성자(default constructor)는 제공되지 않음
- 생성자를 호출하는 코드(client 코드)에서 여러 생성자 중 필요에 따라 호출해서 사용할 수 있음
- 생성자 함수의 오버로딩(Overloading)
- 직접 구현한 생성자 함수가 있을 때 디폴트 생성자는 구현되지 않기 때문에 둘 다 사용시 디폴트 생성자 함수도 직접 구현해준다. -> 생성자 함수의 오버로딩, 중복
- 생성자의 매개 변수를 다르게 선언하고 각각 필요에 따라 구현할 수 있다.
참조 자료형 변수
변수의 자료형
- 기본 자료형: int, long, float, double 등
- 참조 자료형: String, Date, Student 등
참조 자료형
- 클래스형으로 변수를 선언
- 기본 자료형은 사용하는 메모리의 크기가 정해져 있지만, 참조 자료형은 클래스에 따라 다르다.
- 참조 자료형을 사용할 때는 해당 변수에 대해 생성하여야 한다.(String 클래스는 예외적으로 생성하지 않고 사용할 수 있다.)
참조 자료형 정의하여 사용하기
- 학생이 수강한 과목들에 대한 성적을 산출하기 위한 경우, 학생 클래스 속성에 과목이 모두 있으면 효율적이지 못하다. 학생(Student)과 과목(Subject)에 대한 클래스를 분리하여 사용하고 Subject 클래스를 활용하여 수강한 과목들의 변수의 타입으로 선언
- 선언된 Subject 변수는 생성된 인스턴스가 아니므로, Student의 생성자에서 생성하여 사용
용어 정리
- 객체: 객체 지향 프로그램의 대상, 생성된 인스턴스
- 클래스: 객체를 프로그래밍 하기 위해 코드로 정의해 놓은 상태
- 인스턴스: new 키워드를 사용하여 클래스를 메모리에 생성한 상태
- 멤버 변수: 클래스의 속성, 특성
- 메소드: 멤버 변수를 이용하여 클래스의 기능을 구현한 함수
- 참조 변수: 메모리에 생성된 인스턴스를 가리키는 변수
- 참조 값: 생성된 인스턴스의 메모리 주소 값