이번 강의에서는 클래스, 인스턴스, 생성자, 힙 메모리, 생성자 오버로드를 배우게 된다. 이번 파트는 모르는 것들 투성이라 진입장벽이 꽤 컸지만, 반대로 생각하면 새로운 지식을 많이 알아갈 수 있는 좋은 기회라고 생각한다. 그럼 바로 정리를 시작해보겠다.
클래스(static코드) --> 생성(인스턴스 화) --> 인스턴스(dynamic memory)
클래스는 코드이다. 그러한 클래스를 생성하면 인스턴스, 혹은 객체가 된다.
그런데 클래스와 인스턴스는 무엇인가?
개로 예를 들어보자. 다양한 품종의 개가 있다. 이러한 개라는 데이터를 추상화한 개념을 클래스
라고 하고, 그 개를 직접 어떠한 개라고 하는 것을 인스턴스
라고 한다.
객체지향 프로그램은 객체를 만들고, 정의하고, 그 객체
를 클래스
라는 코드로 만들어낸다. 그 만들어진 코드에서부터 예를 들어 어떤 학생이라는 코드가 있다면 이 학생은 어떤 학생이다
라고 하는 것들을 만들어내는데 이를 인스턴스화
한다고 말하는 것이다. 그렇게 생성된 객체를 인스턴스
라고도 한다.
: 객체를 만들어 내기 위한 설계도 혹은 틀
: 연관되어 있는 변수와 메서드의 집합
클래스
를 사용하기 위해서는 클래스
를 생성
해야 한다. 이 때에 new 예약어
를 이용하여 클래스
를 생성하게 된다. c++
같은 경우에는 객체를 생성할 때 new
를 쓰는 경우도 있고 안 쓰는 경우도 있는데, JAVA
에서는 반드시 new
를 사용하여 클래스를 생성해주어야 한다.
그리고 new
뒤에 생성자
라는 것을 사용하게 되는데, 이것은 뒤에 자세히 설명을 할 것이다.
클래스를 생성하는 방법은 다음과 같다.
(클래스형) (변수명) = new (생성자);
Student studentA = new Student();
함수처럼 생겼다고 생각할 수도 있다. 하지만 함수는 아니고 이것을 생성자
라고 한다. 이렇게 클래스를 생성하면 하나의 객체가 생성되는 것이다.
: 설계도를 바탕으로 소프트웨어 세계에 구현된 구체적인 실체
즉, 객체를 소프트웨어에 실체화 하면 그것을 ‘인스턴스’라고 부른다.
실체화된 인스턴스는 메모리에 할당된다.
인스턴스를 여러 개 생성하는 예제를 보며 인스턴스 생성에 대한 감을 찾아보자.
public class Student {
public static void main(String[] args) { //이 클래스를 돌리기 위해서 만들어진 메인 메서드
Student studentLee = new Student();
studentLee.studentName = "이순신";
studentLee.studentID = 100;
studentLee.address = "서울시 영등포구 여의도동";
Student studentKim = new Student();
studentKim.studentName = "김유신";
studentKim.studentID = 100;
studentKim.address = "미국";
studentLee.showStudentInfor();
studentKim.showStudentInfor();
}
}
하나의 클래스 코드로부터 여러 개의 인스턴스를 생성하면 인스턴스는 힙 메모리
에 생성된다. 이러한 각각의 인스턴스는 다른 메모리에 다른 값을 가지게 된다.
인스턴스
는 힙 메모리
에 생성이 된다. 혹시 stack
이라는 메모리를 아는가?
stack 메모리
는 지역변수들이 자리를 잡는 곳이다. 함수가 호출이 되면 스택 메모리
가 올라가고 함수에 쓰이는 지역변수들이 생성이 된다.
지역변수들의 역할은 실제로 어떠한 객체가 힙 메모리
에 생성이 되었을 것인데, 이 생성된 주소를 가리키는 역할은 한다. 힙 메모리
는 동적으로 생성되는 메모리로 필요할 때마다 필요한 양만큼을 딱 가져올 수가 있다.
다시 stack 메모리
로 돌아오자.
스택 메모리
는 앞서 말한 것처럼 함수가 호출되면 지역변수가 쌓이는 구조이다. 스택 메모리
가 언제 없어지느냐고 하면, 함수가 끝나면 그 스택 메모리
가 자연히 없어진다.
근데 heap 메모리
같은 경우에는 new
키워드에 의해서 생성이 되는데 힙 메모리
는 언제 없어지냐면 스택 메모리
와 달리 자동으로 없어지지 않고 없애줘야 한다. 없애주는 역할은 C++
에서는 직접 없애주어야 하고 JAVA
에서는 가비지 콜렉터
가 없애준다.
stack memory
는 자연히 없어지고 heap memory
는 없애줘야 한다는 차이점이 있다는 것만 명심해두자.
: 인스턴스 생성 시 new 키워드
와 함께 사용
생성자
는 인스턴스를 초기화할 때의 명령어 집합이다. 생성자의 이름은 그 클래스의 이름과 같다. 그리고 생성자
와 메서드
를 헷갈리는 경우가 있는데 생성자는 메소드가 아니다. 상속
되지 않으며 리턴 값
이 없기 때문이다.
생성자 기본 문법은 다음과 같다.
<modifiers(public)> <class_name> ([<argument_list>]) {
[<statements>]
}
new 키워드
에 의해서만 호출이 된다.: 객체가 생성될 때 사용자가 초깃값을 명시하지 않으면, 컴파일러가 자동으로 제공하는 생성자
: 생성자가 아무 것도 없을 때 컴파일러가 제공해주는 생성자
생성자에는 다른 것들과 마찬가지로 다양한 종류가 있는데 그 중 하나가 바로 default 생성자
이다.
하나의 클래스에는 반드시 적어도 하나 이상의 생성자
가 존재 해야 한다. 만약 프로그래머가 생성자
를 기술하지 않는다면 컴파일러가 코드에 default 생성자
를 자동으로 생성시켜준다.
default 생성자
에는 매개변수와 구현부가 없다.
만약 클래스에 매개변수가 있는 생성자를 추가하면 default 생성자
는 제공되지 않는다. 따라서 default 생성자
를 사용하고 싶다면 직접 코드에 매개변수를 써 넣으면 되겠다.
default 생성자
를 제공해주지 않는다.default 생성자
를 사용해야 하는데 생성자
를 사용하고 있었다면 직접 코드를 넣으면 된다.: 생성자를 두 개 이상 구현하는 경우
필요에 의해 생성자를 추가해야 하는 경우가 생기는데, 이 때에 여러 개의 생성자가 하나의 클래스에 있는 경우를 의미한다.
아래의 코드는 생성자 오버로딩
의 예시이다.
package constructor;
public class Person {
String name;
float height;
float weight;
public Person() { // 디폴트 생성자
public Person(String pname) { //이름을 매개변수로 입력받는 생성자
name = pname;
}
public Person(String pname, float pheight, float pweight) { //이름, 키, 몸무게를
name = pname; //매개변수로 입력받는
height = pheight; //생성자
weight = pweight;
}
}
오늘 용어가 많이 나왔는데 한꺼번에 정리해보는 시간을 가지겠습니다. 제가 처음 보는 용어들이 많아서 정리가 필요할 것 같다고 느끼게 되네요.
용어 | 설명 |
---|---|
객체 | 객체 지향 프로그램의 대상 생성된 인스턴스 |
클래스 | 객체를 프로그래밍하기 위해 코드로 만든 상태 |
인스턴스 | 클래스가 메모리에 생성된 상태 |
멤버 변수 | 클래스의 속성, 특성 |
메서드 | 멤버 변수를 이용하여 클래스의 기능을 구현 |
참조 변수 | 메모리에 생성된 인스턴스를 가리키는 변수 |
참조 값 | 생성된 인스턴스의 메모리 주소 값 |