[Java] 2_3_클래스와 객체1(3)

Haeun Noh·2022년 8월 14일
0

0814


이번 강의에서는 클래스, 인스턴스, 생성자, 힙 메모리, 생성자 오버로드를 배우게 된다. 이번 파트는 모르는 것들 투성이라 진입장벽이 꽤 컸지만, 반대로 생각하면 새로운 지식을 많이 알아갈 수 있는 좋은 기회라고 생각한다. 그럼 바로 정리를 시작해보겠다.



class & instance

클래스(static코드) --> 생성(인스턴스 화) --> 인스턴스(dynamic memory)

클래스는 코드이다. 그러한 클래스를 생성하면 인스턴스, 혹은 객체가 된다.

그런데 클래스와 인스턴스는 무엇인가?
개로 예를 들어보자. 다양한 품종의 개가 있다. 이러한 개라는 데이터를 추상화한 개념을 클래스라고 하고, 그 개를 직접 어떠한 개라고 하는 것을 인스턴스라고 한다.

객체지향 프로그램은 객체를 만들고, 정의하고, 그 객체클래스라는 코드로 만들어낸다. 그 만들어진 코드에서부터 예를 들어 어떤 학생이라는 코드가 있다면 이 학생은 어떤 학생이다 라고 하는 것들을 만들어내는데 이를 인스턴스화한다고 말하는 것이다. 그렇게 생성된 객체를 인스턴스라고도 한다.



클래스(class)

: 객체를 만들어 내기 위한 설계도 혹은 틀
: 연관되어 있는 변수와 메서드의 집합


클래스(class) 생성하기

클래스를 사용하기 위해서는 클래스생성해야 한다. 이 때에 new 예약어를 이용하여 클래스를 생성하게 된다. c++같은 경우에는 객체를 생성할 때 new를 쓰는 경우도 있고 안 쓰는 경우도 있는데, JAVA에서는 반드시 new를 사용하여 클래스를 생성해주어야 한다.

그리고 new뒤에 생성자라는 것을 사용하게 되는데, 이것은 뒤에 자세히 설명을 할 것이다.

클래스를 생성하는 방법은 다음과 같다.

(클래스형) (변수명) = new (생성자);

Student studentA = new Student();

함수처럼 생겼다고 생각할 수도 있다. 하지만 함수는 아니고 이것을 생성자라고 한다. 이렇게 클래스를 생성하면 하나의 객체가 생성되는 것이다.



인스턴스(instance)

: 설계도를 바탕으로 소프트웨어 세계에 구현된 구체적인 실체

즉, 객체를 소프트웨어에 실체화 하면 그것을 ‘인스턴스’라고 부른다.
실체화된 인스턴스는 메모리에 할당된다.


인스턴스(instance) 여러 개 생성하기

인스턴스를 여러 개 생성하는 예제를 보며 인스턴스 생성에 대한 감을 찾아보자.

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();
	}
}


인스턴스(instance)와 힙 메모리(heap memory)

하나의 클래스 코드로부터 여러 개의 인스턴스를 생성하면 인스턴스는 힙 메모리에 생성된다. 이러한 각각의 인스턴스는 다른 메모리에 다른 값을 가지게 된다.

인스턴스힙 메모리에 생성이 된다. 혹시 stack이라는 메모리를 아는가?

stack 메모리는 지역변수들이 자리를 잡는 곳이다. 함수가 호출이 되면 스택 메모리가 올라가고 함수에 쓰이는 지역변수들이 생성이 된다.

지역변수들의 역할은 실제로 어떠한 객체가 힙 메모리에 생성이 되었을 것인데, 이 생성된 주소를 가리키는 역할은 한다. 힙 메모리는 동적으로 생성되는 메모리로 필요할 때마다 필요한 양만큼을 딱 가져올 수가 있다.

다시 stack 메모리로 돌아오자.

스택 메모리는 앞서 말한 것처럼 함수가 호출되면 지역변수가 쌓이는 구조이다. 스택 메모리가 언제 없어지느냐고 하면, 함수가 끝나면 그 스택 메모리가 자연히 없어진다.

근데 heap 메모리같은 경우에는 new키워드에 의해서 생성이 되는데 힙 메모리는 언제 없어지냐면 스택 메모리와 달리 자동으로 없어지지 않고 없애줘야 한다. 없애주는 역할은 C++에서는 직접 없애주어야 하고 JAVA에서는 가비지 콜렉터가 없애준다.

stack memory는 자연히 없어지고 heap memory는 없애줘야 한다는 차이점이 있다는 것만 명심해두자.



생성자(constructor)

: 인스턴스 생성 시 new 키워드와 함께 사용

생성자는 인스턴스를 초기화할 때의 명령어 집합이다. 생성자의 이름은 그 클래스의 이름과 같다. 그리고 생성자메서드를 헷갈리는 경우가 있는데 생성자는 메소드가 아니다. 상속되지 않으며 리턴 값이 없기 때문이다.

생성자 기본 문법은 다음과 같다.

<modifiers(public)> <class_name> ([<argument_list>]) {
		[<statements>]
}

생성자의 특징

  1. 클래스 이름과 생성자명이 동일해야 한다.
  2. 반환 타입이 없다.
  3. 아무 때나 필요하다고 호출하는 것이 아니라 new 키워드에 의해서만 호출이 된다.

default 생성자

: 객체가 생성될 때 사용자가 초깃값을 명시하지 않으면, 컴파일러가 자동으로 제공하는 생성자
: 생성자가 아무 것도 없을 때 컴파일러가 제공해주는 생성자

생성자에는 다른 것들과 마찬가지로 다양한 종류가 있는데 그 중 하나가 바로 default 생성자이다.

하나의 클래스에는 반드시 적어도 하나 이상의 생성자가 존재 해야 한다. 만약 프로그래머가 생성자를 기술하지 않는다면 컴파일러가 코드에 default 생성자를 자동으로 생성시켜준다.

default 생성자에는 매개변수와 구현부가 없다.

만약 클래스에 매개변수가 있는 생성자를 추가하면 default 생성자는 제공되지 않는다. 따라서 default 생성자를 사용하고 싶다면 직접 코드에 매개변수를 써 넣으면 되겠다.


default 생성자의 특징

  1. 생성자가 하나라도 있다면 default 생성자를 제공해주지 않는다.
  2. 만약 default 생성자를 사용해야 하는데 생성자를 사용하고 있었다면 직접 코드를 넣으면 된다.

생성자 오버로딩(constructor overloading)

: 생성자를 두 개 이상 구현하는 경우

필요에 의해 생성자를 추가해야 하는 경우가 생기는데, 이 때에 여러 개의 생성자가 하나의 클래스에 있는 경우를 의미한다.

아래의 코드는 생성자 오버로딩의 예시이다.

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;
	}
}


용어 정리

오늘 용어가 많이 나왔는데 한꺼번에 정리해보는 시간을 가지겠습니다. 제가 처음 보는 용어들이 많아서 정리가 필요할 것 같다고 느끼게 되네요.

용어설명
객체객체 지향 프로그램의 대상
생성된 인스턴스
클래스객체를 프로그래밍하기 위해 코드로 만든 상태
인스턴스클래스가 메모리에 생성된 상태
멤버 변수클래스의 속성, 특성
메서드멤버 변수를 이용하여 클래스의 기능을 구현
참조 변수메모리에 생성된 인스턴스를 가리키는 변수
참조 값생성된 인스턴스의 메모리 주소 값


profile
기록의 힘을 믿는 개발자, 노하은입니다!

0개의 댓글